diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index e0d34e4e9076..cb511d49e35a 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c @@ -218,8 +218,10 @@ int v9fs_dir_release(struct inode *inode, struct file *filp) if ((S_ISREG(inode->i_mode)) && (filp->f_mode & FMODE_WRITE)) retval = filemap_fdatawrite(inode->i_mapping); + printk("fid: %p, %s\n", fid, __func__); spin_lock(&inode->i_lock); - hlist_del(&fid->ilist); + if (refcount_read(&fid->count) == 1) + hlist_del(&fid->ilist); spin_unlock(&inode->i_lock); put_err = p9_fid_put(fid); retval = retval < 0 ? retval : put_err; diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index 348cc90bf9c5..acee5f6570a5 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c @@ -52,6 +52,7 @@ int v9fs_file_open(struct inode *inode, struct file *file) omode = v9fs_uflags2omode(file->f_flags, v9fs_proto_dotu(v9ses)); fid = file->private_data; + printk("fid: %p, %s\n", fid, __func__); if (!fid) { fid = v9fs_fid_clone(file_dentry(file)); if (IS_ERR(fid)) @@ -80,6 +81,8 @@ int v9fs_file_open(struct inode *inode, struct file *file) file->private_data = fid; } + else + p9_fid_get(fid); #ifdef CONFIG_9P_FSCACHE if (v9ses->cache & CACHE_FSCACHE)