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: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
parent
df345c674b
commit
b605479306
1 changed files with 24 additions and 19 deletions
|
@ -680,26 +680,31 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now walk from the parent so we can get unopened fid */
|
if (!(perm & P9_DMLINK)) {
|
||||||
fid = p9_client_walk(dfid, 1, &name, 1);
|
/* now walk from the parent so we can get unopened fid */
|
||||||
if (IS_ERR(fid)) {
|
fid = p9_client_walk(dfid, 1, &name, 1);
|
||||||
err = PTR_ERR(fid);
|
if (IS_ERR(fid)) {
|
||||||
p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
|
err = PTR_ERR(fid);
|
||||||
fid = NULL;
|
p9_debug(P9_DEBUG_VFS,
|
||||||
goto error;
|
"p9_client_walk failed %d\n", err);
|
||||||
|
fid = NULL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* instantiate inode and assign the unopened fid to the dentry
|
||||||
|
*/
|
||||||
|
inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
|
||||||
|
if (IS_ERR(inode)) {
|
||||||
|
err = PTR_ERR(inode);
|
||||||
|
p9_debug(P9_DEBUG_VFS,
|
||||||
|
"inode creation failed %d\n", err);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
err = v9fs_fid_add(dentry, fid);
|
||||||
|
if (err < 0)
|
||||||
|
goto error;
|
||||||
|
d_instantiate(dentry, inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* instantiate inode and assign the unopened fid to the dentry */
|
|
||||||
inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
|
|
||||||
if (IS_ERR(inode)) {
|
|
||||||
err = PTR_ERR(inode);
|
|
||||||
p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", err);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
err = v9fs_fid_add(dentry, fid);
|
|
||||||
if (err < 0)
|
|
||||||
goto error;
|
|
||||||
d_instantiate(dentry, inode);
|
|
||||||
return ofid;
|
return ofid;
|
||||||
error:
|
error:
|
||||||
if (ofid)
|
if (ofid)
|
||||||
|
|
Loading…
Add table
Reference in a new issue