NFSD: Modernize nfsd4_release_lockowner()
authorChuck Lever <chuck.lever@oracle.com>
Sun, 22 May 2022 16:07:18 +0000 (12:07 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Thu, 26 May 2022 14:50:50 +0000 (10:50 -0400)
Refactor: Use existing helpers that other lock operations use. This
change removes several automatic variables, so re-organize the
variable declarations for readability.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4state.c

index 4e0850a..e2f8b04 100644 (file)
@@ -7530,16 +7530,13 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
                        union nfsd4_op_u *u)
 {
        struct nfsd4_release_lockowner *rlockowner = &u->release_lockowner;
+       struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
        clientid_t *clid = &rlockowner->rl_clientid;
-       struct nfs4_stateowner *sop;
-       struct nfs4_lockowner *lo = NULL;
        struct nfs4_ol_stateid *stp;
-       struct xdr_netobj *owner = &rlockowner->rl_owner;
-       unsigned int hashval = ownerstr_hashval(owner);
-       __be32 status;
-       struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
+       struct nfs4_lockowner *lo;
        struct nfs4_client *clp;
-       LIST_HEAD (reaplist);
+       LIST_HEAD(reaplist);
+       __be32 status;
 
        dprintk("nfsd4_release_lockowner clientid: (%08x/%08x):\n",
                clid->cl_boot, clid->cl_id);
@@ -7547,30 +7544,19 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
        status = set_client(clid, cstate, nn);
        if (status)
                return status;
-
        clp = cstate->clp;
-       /* Find the matching lock stateowner */
-       spin_lock(&clp->cl_lock);
-       list_for_each_entry(sop, &clp->cl_ownerstr_hashtbl[hashval],
-                           so_strhash) {
 
-               if (sop->so_is_open_owner || !same_owner_str(sop, owner))
-                       continue;
-
-               if (atomic_read(&sop->so_count) != 1) {
-                       spin_unlock(&clp->cl_lock);
-                       return nfserr_locks_held;
-               }
-
-               lo = lockowner(sop);
-               nfs4_get_stateowner(sop);
-               break;
-       }
+       spin_lock(&clp->cl_lock);
+       lo = find_lockowner_str_locked(clp, &rlockowner->rl_owner);
        if (!lo) {
                spin_unlock(&clp->cl_lock);
                return status;
        }
-
+       if (atomic_read(&lo->lo_owner.so_count) != 2) {
+               spin_unlock(&clp->cl_lock);
+               nfs4_put_stateowner(&lo->lo_owner);
+               return nfserr_locks_held;
+       }
        unhash_lockowner_locked(lo);
        while (!list_empty(&lo->lo_owner.so_stateids)) {
                stp = list_first_entry(&lo->lo_owner.so_stateids,