]> git.neil.brown.name Git - LaFS.git/commitdiff
Cleaner: force checkpoint after an emergency clean.
authorNeilBrown <neilb@suse.de>
Tue, 3 May 2011 05:08:45 +0000 (15:08 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 3 May 2011 05:08:45 +0000 (15:08 +1000)
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 <neilb@suse.de>
clean.c

diff --git a/clean.c b/clean.c
index 55898fbaf24925678dbb3a7e707b6920dea04c76..7c8ab98aae6f056c3ebae514cbc9b67b1f1c49e5 100644 (file)
--- 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);