From 797fc16d8f00bf681b7f9969c0701725b472b11a Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 3 Aug 2016 11:02:48 -0400 Subject: 9p: fix braino introduced in "9p: new helper - v9fs_parent_fid()" In v9fs_vfs_rename() we need to clone the parents' fids, not just find them. Spotted-by: Johannes Berg Signed-off-by: Al Viro --- fs/9p/fid.h | 4 ++++ fs/9p/vfs_inode.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'fs/9p') diff --git a/fs/9p/fid.h b/fs/9p/fid.h index 12700df0bb51..d4c5002d56ad 100644 --- a/fs/9p/fid.h +++ b/fs/9p/fid.h @@ -31,4 +31,8 @@ static inline struct p9_fid *v9fs_parent_fid(struct dentry *dentry) struct p9_fid *v9fs_fid_clone(struct dentry *dentry); void v9fs_fid_add(struct dentry *dentry, struct p9_fid *fid); struct p9_fid *v9fs_writeback_fid(struct dentry *dentry); +static inline struct p9_fid *clone_fid(struct p9_fid *fid) +{ + return IS_ERR(fid) ? fid : p9_client_walk(fid, 0, NULL, 1); +} #endif diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 7da9a8354fad..26189eebcd1c 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -975,13 +975,13 @@ v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry, if (IS_ERR(oldfid)) return PTR_ERR(oldfid); - olddirfid = v9fs_parent_fid(old_dentry); + olddirfid = clone_fid(v9fs_parent_fid(old_dentry)); if (IS_ERR(olddirfid)) { retval = PTR_ERR(olddirfid); goto done; } - newdirfid = v9fs_parent_fid(new_dentry); + newdirfid = clone_fid(v9fs_parent_fid(new_dentry)); if (IS_ERR(newdirfid)) { retval = PTR_ERR(newdirfid); goto clunk_olddir; -- cgit v1.2.3