]> git.neil.brown.name Git - LaFS.git/commitdiff
segments: make sure the 'last' pointer is always correct.
authorNeilBrown <neilb@suse.de>
Fri, 4 Mar 2011 01:47:30 +0000 (12:47 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 4 Mar 2011 01:47:30 +0000 (12:47 +1100)
A couple of places forgot to handle this properly.

Signed-off-by: NeilBrown <neilb@suse.de>
segments.c

index aee53759160c5e507b4ddfaea40286bc376e9353..124c2121f79b6e1ea78f517ddf0ed3fc70f44ba4 100644 (file)
@@ -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 {