Commit b677c0c6 authored by NeilBrown's avatar NeilBrown Committed by Chuck Lever

NFSD: always drop directory lock in nfsd_unlink()

Some error paths in nfsd_unlink() allow it to exit without unlocking the
directory.  This is not a problem in practice as the directory will be
locked with an fh_put(), but it is untidy and potentially confusing.

This allows us to remove all the fh_unlock() calls that are immediately
after nfsd_unlink() calls.
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 927bfc56
...@@ -490,7 +490,6 @@ nfsd3_proc_remove(struct svc_rqst *rqstp) ...@@ -490,7 +490,6 @@ nfsd3_proc_remove(struct svc_rqst *rqstp)
fh_copy(&resp->fh, &argp->fh); fh_copy(&resp->fh, &argp->fh);
resp->status = nfsd_unlink(rqstp, &resp->fh, -S_IFDIR, resp->status = nfsd_unlink(rqstp, &resp->fh, -S_IFDIR,
argp->name, argp->len); argp->name, argp->len);
fh_unlock(&resp->fh);
return rpc_success; return rpc_success;
} }
...@@ -511,7 +510,6 @@ nfsd3_proc_rmdir(struct svc_rqst *rqstp) ...@@ -511,7 +510,6 @@ nfsd3_proc_rmdir(struct svc_rqst *rqstp)
fh_copy(&resp->fh, &argp->fh); fh_copy(&resp->fh, &argp->fh);
resp->status = nfsd_unlink(rqstp, &resp->fh, S_IFDIR, resp->status = nfsd_unlink(rqstp, &resp->fh, S_IFDIR,
argp->name, argp->len); argp->name, argp->len);
fh_unlock(&resp->fh);
return rpc_success; return rpc_success;
} }
......
...@@ -1002,10 +1002,8 @@ nfsd4_remove(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -1002,10 +1002,8 @@ nfsd4_remove(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
return nfserr_grace; return nfserr_grace;
status = nfsd_unlink(rqstp, &cstate->current_fh, 0, status = nfsd_unlink(rqstp, &cstate->current_fh, 0,
remove->rm_name, remove->rm_namelen); remove->rm_name, remove->rm_namelen);
if (!status) { if (!status)
fh_unlock(&cstate->current_fh);
set_change_info(&remove->rm_cinfo, &cstate->current_fh); set_change_info(&remove->rm_cinfo, &cstate->current_fh);
}
return status; return status;
} }
......
...@@ -1753,12 +1753,12 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, ...@@ -1753,12 +1753,12 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
rdentry = lookup_one_len(fname, dentry, flen); rdentry = lookup_one_len(fname, dentry, flen);
host_err = PTR_ERR(rdentry); host_err = PTR_ERR(rdentry);
if (IS_ERR(rdentry)) if (IS_ERR(rdentry))
goto out_drop_write; goto out_unlock;
if (d_really_is_negative(rdentry)) { if (d_really_is_negative(rdentry)) {
dput(rdentry); dput(rdentry);
host_err = -ENOENT; host_err = -ENOENT;
goto out_drop_write; goto out_unlock;
} }
rinode = d_inode(rdentry); rinode = d_inode(rdentry);
ihold(rinode); ihold(rinode);
...@@ -1796,6 +1796,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, ...@@ -1796,6 +1796,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
} }
out: out:
return err; return err;
out_unlock:
fh_unlock(fhp);
goto out_drop_write;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment