From: NeilBrown Date: Sat, 3 Jul 2010 00:56:17 +0000 (+1000) Subject: Revise rules for setting EmergencyClean X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=78a03c18232e8b4b58c237c88dbe82e294daf750;p=LaFS.git Revise rules for setting EmergencyClean This rule for clearing is good I think. Setting is now a bit too early. Signed-off-by: NeilBrown --- diff --git a/segments.c b/segments.c index c970305..d73033a 100644 --- a/segments.c +++ b/segments.c @@ -640,13 +640,19 @@ int lafs_space_alloc(struct fs *fs, int credits, int why) } if (credits == 0) { + if (why == NewSpace) + /* FIXME This is really a bit too early - need to wait + * at least one checkpoint + */ + set_bit(EmergencyClean, &fs->fsstate); if (!test_bit(CleanerBlocks, &fs->fsstate) || fs->cleaner.need > watermark + fs->max_segment) { fs->cleaner.need = watermark + fs->max_segment; set_bit(CleanerBlocks, &fs->fsstate); lafs_wake_cleaner(fs); } - } + } else if (why == NewSpace) + clear_bit(EmergencyClean, &fs->fsstate); fs->allocated_blocks += credits; BUG_ON(fs->free_blocks + fs->clean_reserved < fs->allocated_blocks); @@ -1543,13 +1549,6 @@ retry: segdelete(fs->segtrack, ss); spin_unlock(&fs->lock); - if (ss->usage < (fs->devs[ss->dev].segment_size - 4) * 126 / 128) - /* weird heuristic ?? */ - clear_bit(EmergencyClean, &fs->fsstate); - else if (ss->usage >= (fs->devs[ss->dev].segment_size - 4) * 127 / 128) - set_bit(EmergencyClean, &fs->fsstate); - - ssm = segsum_find(fs, ss->segment, ss->dev, 0); putdref(ssm->ssblk, MKREF(intable)); putdref(ssm->youthblk, MKREF(intable));