提交 b6054793 编写于 作者: A Aneesh Kumar K.V 提交者: Eric Van Hensbergen

fs/9p: We should not allocate a new inode when creating hardlines.

Don't do new_inode_from fid in case of hardlink creation. This ensures
that link count for hardlink files get updated properly. Earlier link count
was not updated on removing a hardlink with cache mode enabled.
Signed-off-by: NAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: NEric Van Hensbergen <ericvh@gmail.com>
上级 df345c67
...@@ -680,26 +680,31 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, ...@@ -680,26 +680,31 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
goto error; goto error;
} }
if (!(perm & P9_DMLINK)) {
/* now walk from the parent so we can get unopened fid */ /* now walk from the parent so we can get unopened fid */
fid = p9_client_walk(dfid, 1, &name, 1); fid = p9_client_walk(dfid, 1, &name, 1);
if (IS_ERR(fid)) { if (IS_ERR(fid)) {
err = PTR_ERR(fid); err = PTR_ERR(fid);
p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); p9_debug(P9_DEBUG_VFS,
"p9_client_walk failed %d\n", err);
fid = NULL; fid = NULL;
goto error; goto error;
} }
/*
/* instantiate inode and assign the unopened fid to the dentry */ * instantiate inode and assign the unopened fid to the dentry
*/
inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
if (IS_ERR(inode)) { if (IS_ERR(inode)) {
err = PTR_ERR(inode); err = PTR_ERR(inode);
p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", err); p9_debug(P9_DEBUG_VFS,
"inode creation failed %d\n", err);
goto error; goto error;
} }
err = v9fs_fid_add(dentry, fid); err = v9fs_fid_add(dentry, fid);
if (err < 0) if (err < 0)
goto error; goto error;
d_instantiate(dentry, inode); d_instantiate(dentry, inode);
}
return ofid; return ofid;
error: error:
if (ofid) if (ofid)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册