As the sb might not be mounted, we need to hold a reference.
Signed-off-by: NeilBrown <neilb@suse.de>
ino->i_ino != inum ||
ino_from_sb(ino->i_sb)->i_ino != fsnum) {
if (ino)
- iput(ino);
+ lafs_iput_fs(ino);
if (fsnum) {
struct inode *fsino =
lafs_iget_fs(fs, 0, fsnum, ASYNC);
/* skip this inode as filesystem
* is newer
*/
- iput(fsino);
+ lafs_iput_fs(fsino);
ino = NULL;
goto skip_inode;
- }
+ } else
+ lafs_iput_fs(fsino);
}
ino = lafs_iget_fs(fs, fsnum, inum, ASYNC);
}
if (!test_and_set_bit(B_Cleaning, &b->b.flags)) {
getdref(b, MKREF(cleaning));
- igrab(ino);
+ lafs_igrab_fs(ino);
}
if (LAFSI(ino)->type == TypeInodeFile ||
LAFSI(ino)->type == TypeDir) {
list_del_init(&b->cleaning);
if (test_and_clear_bit(B_Cleaning, &b->b.flags)) {
putdref(b, MKREF(cleaning));
- iput(ino);
+ lafs_iput_fs(ino);
}
}
putdref(b, MKREF(cleaning));
tc->desc->block_cnt = cpu_to_le16(bcnt-1);
}
if (ino)
- iput(ino);
+ lafs_iput_fs(ino);
}
/* Process all blocks that have been found to possibly need to be
ino = b->b.inode;
putdref(b, MKREF(cleaning));
- iput(ino);
+ lafs_iput_fs(ino);
putref(cb, MKREF(clean2));
if (rv)
break;
*/
list_del_init(&db->cleaning);
putdref(db, MKREF(cleaning));
- iput(db->b.inode);
+ lafs_iput_fs(db->b.inode);
if (test_and_clear_bit(B_Async, &db->b.flags)) {
putdref(db, MKREF(async));
lafs_wake_thread(fs);
printk("get inode %d\n", inum);
rv = lafs_iget(filesys->i_sb, inum, async);
iput(filesys);
- } else
+ } else {
rv = lafs_iget(sb, inum, async);
+ atomic_inc(&sb->s_active);
+ }
return rv;
}
struct datablock *lafs_inode_get_dblock(struct inode *ino, REFARG);
int lafs_inode_handle_orphan(struct datablock *b);
+static inline void lafs_iput_fs(struct inode *ino)
+{
+ struct super_block *sb = ino->i_sb;
+ iput(ino);
+ deactivate_super(sb);
+}
+
+static inline void lafs_igrab_fs(struct inode *ino)
+{
+ igrab(ino);
+ atomic_inc(&ino->i_sb->s_active);
+}
+
struct datablock *lafs_get_block(struct inode *ino, unsigned long index,
struct page *p, int gfp, REFARG);
#if DEBUG_REF
unmap_dblock(ob1, or);
bbl->orphan_slot = b->orphan_slot;
putdref(bbl, MKREF(orphan_blk));
- iput(bino);
+ lafs_iput_fs(bino);
lafs_dirty_dblock(ob1);
lafs_dirty_dblock(ob2);
or[slot].type = 0;
putdref(ob, MKREF(add_orphan));
}
- iput(oino);
+ lafs_iput_fs(oino);
}
unmap_dblock(db, or);
putdref(db, MKREF(add_orphans));
case TypeInodeFile:
BUG_ON(fsnum); /* FIXME should be more careful */
- iput(inode);
+ lafs_iput_fs(inode);
inode = lafs_iget_fs(fs, inum, bnum, SYNC);
if (IS_ERR(inode)) {
err = PTR_ERR(inode);
*/
if (list_empty(&db->orphans)) {
list_add(&db->orphans, &fs->pending_orphans);
- igrab(inode);
+ lafs_igrab_fs(inode);
getdref(db, MKREF(roll_orphan));
}
putdref(db, MKREF(roll));
break;
}
- iput(inode);
+ lafs_iput_fs(inode);
return err;
}
}
if (blk)
putdref(blk, MKREF(roll));
- iput(inode);
+ lafs_iput_fs(inode);
dprintk("leaving with error %d\n", err);
return err;
}
struct datablock,
orphans);
list_del_init(&db->orphans);
- iput(db->my_inode);
+ lafs_iput_fs(db->my_inode);
putdref(db, MKREF(roll_orphan));
}
fs->rolled = 1;