From b087f054db292a0dcd707bceda8196acc7ed536f Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 4 Mar 2011 12:47:30 +1100 Subject: [PATCH] segments: make sure the 'last' pointer is always correct. A couple of places forgot to handle this properly. Signed-off-by: NeilBrown --- segments.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/segments.c b/segments.c index aee5375..124c212 100644 --- a/segments.c +++ b/segments.c @@ -845,7 +845,7 @@ int lafs_segtrack_init(struct segtracker *st) st->cleanable.first = st->cleanable.last = 0xffff; st->free.first = st->free.last = 0xffff; st->clean.first = st->clean.last = 0xffff; - st->unused.cnt = st->free.cnt = st->cleanable.cnt = 0; + st->unused.cnt = st->free.cnt = st->cleanable.cnt = st->clean.cnt = 0; for (h = 0; h < SEG_NUM_HEIGHTS; h++) st->head[h] = 0xFFFF; @@ -1096,9 +1096,10 @@ static void segdelete(struct segtracker *st, struct segstat *ss) *where[h] = ss2->skip[h]; ss2->next = st->unused.first; st->unused.first = pos; + if (st->unused.cnt == 0) + st->unused.last = pos; st->unused.cnt++; lafs_check_seg_cnt(st); - // FIXME what about 'last' ?? } static void segdelete_all(struct segtracker *st, struct fs *fs) @@ -1129,6 +1130,8 @@ static void segdelete_all(struct segtracker *st, struct fs *fs) *where[h] = ss->skip[h]; ss->next = st->unused.first; st->unused.first = pos; + if (st->unused.cnt == 0) + st->unused.last = pos; st->unused.cnt++; lafs_check_seg_cnt(st); } else { -- 2.43.0