@@ -7530,47 +7530,33 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
75307530 union nfsd4_op_u * u )
75317531{
75327532 struct nfsd4_release_lockowner * rlockowner = & u -> release_lockowner ;
7533+ struct nfsd_net * nn = net_generic (SVC_NET (rqstp ), nfsd_net_id );
75337534 clientid_t * clid = & rlockowner -> rl_clientid ;
7534- struct nfs4_stateowner * sop ;
7535- struct nfs4_lockowner * lo = NULL ;
75367535 struct nfs4_ol_stateid * stp ;
7537- struct xdr_netobj * owner = & rlockowner -> rl_owner ;
7538- unsigned int hashval = ownerstr_hashval (owner );
7539- __be32 status ;
7540- struct nfsd_net * nn = net_generic (SVC_NET (rqstp ), nfsd_net_id );
7536+ struct nfs4_lockowner * lo ;
75417537 struct nfs4_client * clp ;
7542- LIST_HEAD (reaplist );
7538+ LIST_HEAD (reaplist );
7539+ __be32 status ;
75437540
75447541 dprintk ("nfsd4_release_lockowner clientid: (%08x/%08x):\n" ,
75457542 clid -> cl_boot , clid -> cl_id );
75467543
75477544 status = set_client (clid , cstate , nn );
75487545 if (status )
75497546 return status ;
7550-
75517547 clp = cstate -> clp ;
7552- /* Find the matching lock stateowner */
7553- spin_lock (& clp -> cl_lock );
7554- list_for_each_entry (sop , & clp -> cl_ownerstr_hashtbl [hashval ],
7555- so_strhash ) {
75567548
7557- if (sop -> so_is_open_owner || !same_owner_str (sop , owner ))
7558- continue ;
7559-
7560- if (atomic_read (& sop -> so_count ) != 1 ) {
7561- spin_unlock (& clp -> cl_lock );
7562- return nfserr_locks_held ;
7563- }
7564-
7565- lo = lockowner (sop );
7566- nfs4_get_stateowner (sop );
7567- break ;
7568- }
7549+ spin_lock (& clp -> cl_lock );
7550+ lo = find_lockowner_str_locked (clp , & rlockowner -> rl_owner );
75697551 if (!lo ) {
75707552 spin_unlock (& clp -> cl_lock );
75717553 return status ;
75727554 }
7573-
7555+ if (atomic_read (& lo -> lo_owner .so_count ) != 2 ) {
7556+ spin_unlock (& clp -> cl_lock );
7557+ nfs4_put_stateowner (& lo -> lo_owner );
7558+ return nfserr_locks_held ;
7559+ }
75747560 unhash_lockowner_locked (lo );
75757561 while (!list_empty (& lo -> lo_owner .so_stateids )) {
75767562 stp = list_first_entry (& lo -> lo_owner .so_stateids ,
0 commit comments