NFSD: only call fh_unlock() once in nfsd_link()
[ Upstream commit e18bcb33bc5b69bccc2b532075aa00bb49cc01c5 ] On non-error paths, nfsd_link() calls fh_unlock() twice. This is safe because fh_unlock() records that the unlock has been done and doesn't repeat it. However it makes the code a little confusing and interferes with changes that are planned for directory locking. So rearrange the code to ensure fh_unlock() is called exactly once if fh_lock() was called. Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
1c0a2ac5b9
commit
c5547a3fc7
1 changed files with 10 additions and 9 deletions
|
@ -1556,9 +1556,10 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
|
|||
dirp = d_inode(ddir);
|
||||
|
||||
dnew = lookup_one_len(name, ddir, len);
|
||||
host_err = PTR_ERR(dnew);
|
||||
if (IS_ERR(dnew))
|
||||
goto out_nfserr;
|
||||
if (IS_ERR(dnew)) {
|
||||
err = nfserrno(PTR_ERR(dnew));
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
dold = tfhp->fh_dentry;
|
||||
|
||||
|
@ -1577,17 +1578,17 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
|
|||
else
|
||||
err = nfserrno(host_err);
|
||||
}
|
||||
out_dput:
|
||||
dput(dnew);
|
||||
out_unlock:
|
||||
fh_unlock(ffhp);
|
||||
out_drop_write:
|
||||
fh_drop_write(tfhp);
|
||||
out:
|
||||
return err;
|
||||
|
||||
out_nfserr:
|
||||
err = nfserrno(host_err);
|
||||
goto out_unlock;
|
||||
out_dput:
|
||||
dput(dnew);
|
||||
out_unlock:
|
||||
fh_unlock(ffhp);
|
||||
goto out_drop_write;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Add table
Reference in a new issue