]> git.neil.brown.name Git - LaFS.git/commitdiff
Never set SegRef on an InoIdx block
authorNeilBrown <neilb@suse.de>
Sun, 15 Aug 2010 08:39:28 +0000 (18:39 +1000)
committerNeilBrown <neilb@suse.de>
Sun, 15 Aug 2010 08:39:28 +0000 (18:39 +1000)
An InoIdx block doesn't have a uptodate ->physaddr, that is only
updated in the data block.  So setting SegRef on it is pointless.

Instead, when we find an InoIdx block while setting SegRef, use the
data block instead.

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

diff --git a/block.c b/block.c
index 6d9b04a1f764c4681a65463bd6b3d8695fbe6a1b..15959e0861f28ff766fcf62cf80a15274545e78d 100644 (file)
--- a/block.c
+++ b/block.c
@@ -417,9 +417,13 @@ lafs_reserve_block(struct block *b, int alloc_type)
 
        /* Having reserved the block, we need to get a segref,
         * which will involve reserving those blocks too.
-        * However we never get a segref for Root.
+        * However we never get a segref for Root or any
+        * InoIdx block.
         */
 
+       if (test_bit(B_InoIdx, &b->flags))
+               b = &LAFSI(b->inode)->dblock->b;
+
        while (err == 0
               && !test_bit(B_Root, &b->flags)
               && !test_bit(B_SegRef, &b->flags))
index 17c71c2139b22a10947fd1ecdbf3917b2ab9ddba..0ad73884fba88f1f54f49bb9136c7763fed72ac1 100644 (file)
@@ -258,6 +258,7 @@ int lafs_seg_ref_block(struct block *b, int ssnum)
 {
        struct fs *fs = fs_from_inode(b->inode);
 
+       LAFS_BUG(test_bit(B_InoIdx, &b->flags), b);
        getref(b, MKREF(segref));
 
        while (!test_bit(B_SegRef, &b->flags)) {
@@ -281,15 +282,17 @@ int lafs_seg_ref_block(struct block *b, int ssnum)
                for (p = b;
                     p && !test_bit(B_SegRef, &p->flags);
                     p = &(p->parent)->b) {
-                       if (!test_bit(B_Root, &p->flags))
-                               b2 = p;
                        if (test_bit(B_InoIdx, &p->flags)) {
                                struct datablock *db = LAFSI(p->inode)->dblock;
-
+                               p = &db->b;
                                spin_unlock(&ino->i_data.private_lock);
-                               ino = db->b.inode;
+                               ino = p->inode;
                                spin_lock(&ino->i_data.private_lock);
                        }
+                       if (test_bit(B_SegRef, &p->flags))
+                               break;
+                       if (!test_bit(B_Root, &p->flags))
+                               b2 = p;
                }
                spin_unlock(&ino->i_data.private_lock);
                /* b2 is the first ancestor (closest to root) without SegRef */