From: NeilBrown Date: Tue, 3 May 2011 05:08:45 +0000 (+1000) Subject: Cleaner: force checkpoint after an emergency clean. X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=e86eeefce0bdfea98c9b2afe1bc795428139e5ae;p=LaFS.git Cleaner: force checkpoint after an emergency clean. The check on clean.cnt isn't enough to stop consecutive emergency cleans, so force a checkpoint. The checkpoint won't happen until the cleaner stops. Signed-off-by: NeilBrown --- diff --git a/clean.c b/clean.c index 55898fb..7c8ab98 100644 --- a/clean.c +++ b/clean.c @@ -618,6 +618,7 @@ unsigned long lafs_do_clean(struct fs *fs) */ int i, max_segs; u64 T = 0; + int force_checkpoint_after_clean = 0; for (i = 0; i < fs->devices; i++) T += fs->devs[i].size; @@ -634,8 +635,10 @@ unsigned long lafs_do_clean(struct fs *fs) * otherwise don't. */ if (fs->segtrack->clean.cnt == 0 - && test_bit(CleanerBlocks, &fs->fsstate)) + && test_bit(CleanerBlocks, &fs->fsstate)) { max_segs = 1; + force_checkpoint_after_clean = 1; + } } for (i = 0; i < max_segs; i++) { struct toclean *tc = &fs->cleaner.seg[i]; @@ -684,6 +687,8 @@ unsigned long lafs_do_clean(struct fs *fs) tc->seq = 0; INIT_LIST_HEAD(&tc->cleaning); fs->cleaner.active = 1; + if (force_checkpoint_after_clean) + lafs_checkpoint_start(fs); } if (i == CLEANER_SEGS) dprintk("CLEANER: found %d segments to clean\n", i);