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;