diff --git a/lustre/smfs/dir.c b/lustre/smfs/dir.c index c5f05546117cd4b72e57f9fc77848c8b6075f684..6996a0cbfdb47893d74e93cb1cf143bf52143303 100644 --- a/lustre/smfs/dir.c +++ b/lustre/smfs/dir.c @@ -215,6 +215,8 @@ static int smfs_link(struct dentry * old_dentry, rc = cache_dir->i_op->link(&cache_old_dentry, cache_dir, &cache_dentry); if (rc == 0) { + atomic_inc(&inode->i_count); + duplicate_inode(cache_old_dentry.d_inode, inode); d_instantiate(dentry, inode); } diff --git a/lustre/smfs/inode.c b/lustre/smfs/inode.c index 0c44fef4dd598d3a0d6712f9129bb1da3b6940e9..24ff6c30a1dcd8847a6630cac064718798234469 100644 --- a/lustre/smfs/inode.c +++ b/lustre/smfs/inode.c @@ -73,6 +73,18 @@ static void smfs_clear_inode(struct inode *inode) cache_sb = S2CSB(inode->i_sb); cache_inode = I2CI(inode); + + /*FIXME: because i_count of cache_inode may not + * be 0 or 1 in before smfs_delete inode, So we + * need to dec it to 1 before we call delete_inode + * of the bellow cache filesystem Check again latter*/ + + if (atomic_read(&cache_inode->i_count) < 1) + BUG(); + + while (atomic_read(&cache_inode->i_count) != 1) { + atomic_dec(&cache_inode->i_count); + } iput(cache_inode); return;