mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-04 20:57:45 -04:00
Merge tag 'nfsd-6.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux
Pull nfsd fixes from Chuck Lever: "A set of NFSD fixes that arrived just a bit late for the 6.19 merge window. Regression fix: - Avoid unnecessarily breaking a timestamp delegation Stable fixes: - Fix a crasher in nlm4svc_proc_test() - Fix nfsd_file reference leak during write delegation - Fix error flow in client_states_open()" * tag 'nfsd-6.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux: nfsd: Drop the client reference in client_states_open() nfsd: use ATTR_DELEG in nfsd4_finalize_deleg_timestamps() nfsd: fix nfsd_file reference leak in nfsd4_add_rdaccess_to_wrdeleg() lockd: fix vfs_test_lock() calls
This commit is contained in:
@@ -97,7 +97,6 @@ __nlm4svc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp)
|
||||
struct nlm_args *argp = rqstp->rq_argp;
|
||||
struct nlm_host *host;
|
||||
struct nlm_file *file;
|
||||
struct nlm_lockowner *test_owner;
|
||||
__be32 rc = rpc_success;
|
||||
|
||||
dprintk("lockd: TEST4 called\n");
|
||||
@@ -107,7 +106,6 @@ __nlm4svc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp)
|
||||
if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
|
||||
return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
|
||||
|
||||
test_owner = argp->lock.fl.c.flc_owner;
|
||||
/* Now check for conflicting locks */
|
||||
resp->status = nlmsvc_testlock(rqstp, file, host, &argp->lock,
|
||||
&resp->lock);
|
||||
@@ -116,7 +114,7 @@ __nlm4svc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp)
|
||||
else
|
||||
dprintk("lockd: TEST4 status %d\n", ntohl(resp->status));
|
||||
|
||||
nlmsvc_put_lockowner(test_owner);
|
||||
nlmsvc_release_lockowner(&argp->lock);
|
||||
nlmsvc_release_host(host);
|
||||
nlm_release_file(file);
|
||||
return rc;
|
||||
|
||||
@@ -633,7 +633,13 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file,
|
||||
}
|
||||
|
||||
mode = lock_to_openmode(&lock->fl);
|
||||
error = vfs_test_lock(file->f_file[mode], &lock->fl);
|
||||
locks_init_lock(&conflock->fl);
|
||||
/* vfs_test_lock only uses start, end, and owner, but tests flc_file */
|
||||
conflock->fl.c.flc_file = lock->fl.c.flc_file;
|
||||
conflock->fl.fl_start = lock->fl.fl_start;
|
||||
conflock->fl.fl_end = lock->fl.fl_end;
|
||||
conflock->fl.c.flc_owner = lock->fl.c.flc_owner;
|
||||
error = vfs_test_lock(file->f_file[mode], &conflock->fl);
|
||||
if (error) {
|
||||
/* We can't currently deal with deferred test requests */
|
||||
if (error == FILE_LOCK_DEFERRED)
|
||||
@@ -643,22 +649,19 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (lock->fl.c.flc_type == F_UNLCK) {
|
||||
if (conflock->fl.c.flc_type == F_UNLCK) {
|
||||
ret = nlm_granted;
|
||||
goto out;
|
||||
}
|
||||
|
||||
dprintk("lockd: conflicting lock(ty=%d, %Ld-%Ld)\n",
|
||||
lock->fl.c.flc_type, (long long)lock->fl.fl_start,
|
||||
(long long)lock->fl.fl_end);
|
||||
conflock->fl.c.flc_type, (long long)conflock->fl.fl_start,
|
||||
(long long)conflock->fl.fl_end);
|
||||
conflock->caller = "somehost"; /* FIXME */
|
||||
conflock->len = strlen(conflock->caller);
|
||||
conflock->oh.len = 0; /* don't return OH info */
|
||||
conflock->svid = lock->fl.c.flc_pid;
|
||||
conflock->fl.c.flc_type = lock->fl.c.flc_type;
|
||||
conflock->fl.fl_start = lock->fl.fl_start;
|
||||
conflock->fl.fl_end = lock->fl.fl_end;
|
||||
locks_release_private(&lock->fl);
|
||||
conflock->svid = conflock->fl.c.flc_pid;
|
||||
locks_release_private(&conflock->fl);
|
||||
|
||||
ret = nlm_lck_denied;
|
||||
out:
|
||||
|
||||
@@ -117,7 +117,6 @@ __nlmsvc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp)
|
||||
struct nlm_args *argp = rqstp->rq_argp;
|
||||
struct nlm_host *host;
|
||||
struct nlm_file *file;
|
||||
struct nlm_lockowner *test_owner;
|
||||
__be32 rc = rpc_success;
|
||||
|
||||
dprintk("lockd: TEST called\n");
|
||||
@@ -127,8 +126,6 @@ __nlmsvc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp)
|
||||
if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file)))
|
||||
return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
|
||||
|
||||
test_owner = argp->lock.fl.c.flc_owner;
|
||||
|
||||
/* Now check for conflicting locks */
|
||||
resp->status = cast_status(nlmsvc_testlock(rqstp, file, host,
|
||||
&argp->lock, &resp->lock));
|
||||
@@ -138,7 +135,7 @@ __nlmsvc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp)
|
||||
dprintk("lockd: TEST status %d vers %d\n",
|
||||
ntohl(resp->status), rqstp->rq_vers);
|
||||
|
||||
nlmsvc_put_lockowner(test_owner);
|
||||
nlmsvc_release_lockowner(&argp->lock);
|
||||
nlmsvc_release_host(host);
|
||||
nlm_release_file(file);
|
||||
return rc;
|
||||
|
||||
Reference in New Issue
Block a user