]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-5.15/nfsd-modernize-nfsd4_release_lockowner.patch
Fixes for 5.15
[thirdparty/kernel/stable-queue.git] / queue-5.15 / nfsd-modernize-nfsd4_release_lockowner.patch
1 From 2588daf555e751e6f6f1a669a7d4b77c7c3d2781 Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Sun, 22 May 2022 12:07:18 -0400
4 Subject: NFSD: Modernize nfsd4_release_lockowner()
5
6 From: Chuck Lever <chuck.lever@oracle.com>
7
8 [ Upstream commit bd8fdb6e545f950f4654a9a10d7e819ad48146e5 ]
9
10 Refactor: Use existing helpers that other lock operations use. This
11 change removes several automatic variables, so re-organize the
12 variable declarations for readability.
13
14 Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
15 ---
16 fs/nfsd/nfs4state.c | 36 +++++++++++-------------------------
17 1 file changed, 11 insertions(+), 25 deletions(-)
18
19 diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
20 index d79b736019d49..2d52656095340 100644
21 --- a/fs/nfsd/nfs4state.c
22 +++ b/fs/nfsd/nfs4state.c
23 @@ -7548,16 +7548,13 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
24 union nfsd4_op_u *u)
25 {
26 struct nfsd4_release_lockowner *rlockowner = &u->release_lockowner;
27 + struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
28 clientid_t *clid = &rlockowner->rl_clientid;
29 - struct nfs4_stateowner *sop;
30 - struct nfs4_lockowner *lo = NULL;
31 struct nfs4_ol_stateid *stp;
32 - struct xdr_netobj *owner = &rlockowner->rl_owner;
33 - unsigned int hashval = ownerstr_hashval(owner);
34 - __be32 status;
35 - struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
36 + struct nfs4_lockowner *lo;
37 struct nfs4_client *clp;
38 - LIST_HEAD (reaplist);
39 + LIST_HEAD(reaplist);
40 + __be32 status;
41
42 dprintk("nfsd4_release_lockowner clientid: (%08x/%08x):\n",
43 clid->cl_boot, clid->cl_id);
44 @@ -7565,30 +7562,19 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
45 status = set_client(clid, cstate, nn);
46 if (status)
47 return status;
48 -
49 clp = cstate->clp;
50 - /* Find the matching lock stateowner */
51 - spin_lock(&clp->cl_lock);
52 - list_for_each_entry(sop, &clp->cl_ownerstr_hashtbl[hashval],
53 - so_strhash) {
54
55 - if (sop->so_is_open_owner || !same_owner_str(sop, owner))
56 - continue;
57 -
58 - if (atomic_read(&sop->so_count) != 1) {
59 - spin_unlock(&clp->cl_lock);
60 - return nfserr_locks_held;
61 - }
62 -
63 - lo = lockowner(sop);
64 - nfs4_get_stateowner(sop);
65 - break;
66 - }
67 + spin_lock(&clp->cl_lock);
68 + lo = find_lockowner_str_locked(clp, &rlockowner->rl_owner);
69 if (!lo) {
70 spin_unlock(&clp->cl_lock);
71 return status;
72 }
73 -
74 + if (atomic_read(&lo->lo_owner.so_count) != 2) {
75 + spin_unlock(&clp->cl_lock);
76 + nfs4_put_stateowner(&lo->lo_owner);
77 + return nfserr_locks_held;
78 + }
79 unhash_lockowner_locked(lo);
80 while (!list_empty(&lo->lo_owner.so_stateids)) {
81 stp = list_first_entry(&lo->lo_owner.so_stateids,
82 --
83 2.43.0
84