]> git.neil.brown.name Git - LaFS.git/commitdiff
lafs_refile: fix nextparent handing.
authorNeilBrown <neilb@suse.de>
Wed, 23 Jun 2010 02:14:34 +0000 (12:14 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 23 Jun 2010 02:49:24 +0000 (12:49 +1000)
It is now possible that 'nextparent' is already a sibling of
the current block (inoidx vs ino data).  So handle that, and
generally clean up the code.

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

diff --git a/index.c b/index.c
index 13e5bc9e8ee1f5b0e8812e9b3919c1a34dc65a86..73936f86fba501cff7c9b0817bb3ff0a0e31edd5 100644 (file)
--- a/index.c
+++ b/index.c
@@ -906,15 +906,16 @@ void lafs_refile(struct block *b, int dec)
                                int credits;
                                fs = fs_from_inode(b->inode);
                                /* Don't need ->parent any more */
-                               if (next_parent == &b->parent->b) {
-                                       if (atomic_dec_and_test(&next_parent
-                                                               ->refcnt))
-                                               LAFS_BUG(1, b);
-                               } else {
-                                       LAFS_BUG(next_parent, b);
+                               if (next_parent == NULL)
                                        next_parent = &b->parent->b;
-                               }
-                               del_ref(next_parent, MKREF(child),
+                               else if (next_parent == &b->parent->b ||
+                                        next_parent->parent == b->parent) {
+                                       if (atomic_dec_and_test(&b->parent->b.refcnt))
+                                               LAFS_BUG(1, b);
+                               } else
+                                       LAFS_BUG(1, b);
+
+                               del_ref(&b->parent->b, MKREF(child),
                                        __FILE__, __LINE__);
                                b->parent = NULL;
                                if (test_and_clear_bit(B_SegRef, &b->flags))