From: NeilBrown Date: Sun, 15 Aug 2010 08:39:28 +0000 (+1000) Subject: Never set SegRef on an InoIdx block X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=2eb766ad915c2136d35f2db08589b4b9ffe5c2a0;p=LaFS.git Never set SegRef on an InoIdx block 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 --- diff --git a/block.c b/block.c index 6d9b04a..15959e0 100644 --- 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)) diff --git a/segments.c b/segments.c index 17c71c2..0ad7388 100644 --- a/segments.c +++ b/segments.c @@ -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 */