UBIFS: reset no_space flag after inode deletion
When UBIFS runs out of space it spends a lot of time trying to find more space before returning ENOSPC. As there is no point repeating that unless something has changed, UBIFS has an optimization to record that the file system is 100% full and not try to find space. That flag was not being reset when a pending deletion was finally done. Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com> Reviewed-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
parent
091438dd56
commit
6d6cb0d688
|
@ -628,7 +628,7 @@ void ubifs_convert_page_budget(struct ubifs_info *c)
|
|||
*
|
||||
* This function releases budget corresponding to a dirty inode. It is usually
|
||||
* called when after the inode has been written to the media and marked as
|
||||
* clean.
|
||||
* clean. It also causes the "no space" flags to be cleared.
|
||||
*/
|
||||
void ubifs_release_dirty_inode_budget(struct ubifs_info *c,
|
||||
struct ubifs_inode *ui)
|
||||
|
@ -636,6 +636,7 @@ void ubifs_release_dirty_inode_budget(struct ubifs_info *c,
|
|||
struct ubifs_budget_req req;
|
||||
|
||||
memset(&req, 0, sizeof(struct ubifs_budget_req));
|
||||
/* The "no space" flags will be cleared because dd_growth is > 0 */
|
||||
req.dd_growth = c->inode_budget + ALIGN(ui->data_len, 8);
|
||||
ubifs_release_budget(c, &req);
|
||||
}
|
||||
|
|
|
@ -360,6 +360,11 @@ static void ubifs_delete_inode(struct inode *inode)
|
|||
out:
|
||||
if (ui->dirty)
|
||||
ubifs_release_dirty_inode_budget(c, ui);
|
||||
else {
|
||||
/* We've deleted something - clean the "no space" flags */
|
||||
c->nospace = c->nospace_rp = 0;
|
||||
smp_wmb();
|
||||
}
|
||||
clear_inode(inode);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue