/* 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))
{
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)) {
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 */