aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@nokia.com>2009-04-08 08:07:57 -0400
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2009-05-06 03:37:56 -0400
commit6d6cb0d688d0f262cb4fd5771648b0ac01d4f82c (patch)
treeb4e0f50358029650f0047ffe1f9c48e24c420584
parent091438dd5668396328a3419abcbc6591159eb8d1 (diff)
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>
-rw-r--r--fs/ubifs/budget.c3
-rw-r--r--fs/ubifs/super.c5
2 files changed, 7 insertions, 1 deletions
diff --git a/fs/ubifs/budget.c b/fs/ubifs/budget.c
index af1914462f02..d0231ba783df 100644
--- a/fs/ubifs/budget.c
+++ b/fs/ubifs/budget.c
@@ -628,7 +628,7 @@ void ubifs_convert_page_budget(struct ubifs_info *c)
628 * 628 *
629 * This function releases budget corresponding to a dirty inode. It is usually 629 * This function releases budget corresponding to a dirty inode. It is usually
630 * called when after the inode has been written to the media and marked as 630 * called when after the inode has been written to the media and marked as
631 * clean. 631 * clean. It also causes the "no space" flags to be cleared.
632 */ 632 */
633void ubifs_release_dirty_inode_budget(struct ubifs_info *c, 633void ubifs_release_dirty_inode_budget(struct ubifs_info *c,
634 struct ubifs_inode *ui) 634 struct ubifs_inode *ui)
@@ -636,6 +636,7 @@ void ubifs_release_dirty_inode_budget(struct ubifs_info *c,
636 struct ubifs_budget_req req; 636 struct ubifs_budget_req req;
637 637
638 memset(&req, 0, sizeof(struct ubifs_budget_req)); 638 memset(&req, 0, sizeof(struct ubifs_budget_req));
639 /* The "no space" flags will be cleared because dd_growth is > 0 */
639 req.dd_growth = c->inode_budget + ALIGN(ui->data_len, 8); 640 req.dd_growth = c->inode_budget + ALIGN(ui->data_len, 8);
640 ubifs_release_budget(c, &req); 641 ubifs_release_budget(c, &req);
641} 642}
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index faa44f90608a..f2c1c0b79f66 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -360,6 +360,11 @@ static void ubifs_delete_inode(struct inode *inode)
360out: 360out:
361 if (ui->dirty) 361 if (ui->dirty)
362 ubifs_release_dirty_inode_budget(c, ui); 362 ubifs_release_dirty_inode_budget(c, ui);
363 else {
364 /* We've deleted something - clean the "no space" flags */
365 c->nospace = c->nospace_rp = 0;
366 smp_wmb();
367 }
363 clear_inode(inode); 368 clear_inode(inode);
364} 369}
365 370