@@ -7530,47 +7530,33 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
7530
7530
union nfsd4_op_u * u )
7531
7531
{
7532
7532
struct nfsd4_release_lockowner * rlockowner = & u -> release_lockowner ;
7533
+ struct nfsd_net * nn = net_generic (SVC_NET (rqstp ), nfsd_net_id );
7533
7534
clientid_t * clid = & rlockowner -> rl_clientid ;
7534
- struct nfs4_stateowner * sop ;
7535
- struct nfs4_lockowner * lo = NULL ;
7536
7535
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 ;
7541
7537
struct nfs4_client * clp ;
7542
- LIST_HEAD (reaplist );
7538
+ LIST_HEAD (reaplist );
7539
+ __be32 status ;
7543
7540
7544
7541
dprintk ("nfsd4_release_lockowner clientid: (%08x/%08x):\n" ,
7545
7542
clid -> cl_boot , clid -> cl_id );
7546
7543
7547
7544
status = set_client (clid , cstate , nn );
7548
7545
if (status )
7549
7546
return status ;
7550
-
7551
7547
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 ) {
7556
7548
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 );
7569
7551
if (!lo ) {
7570
7552
spin_unlock (& clp -> cl_lock );
7571
7553
return status ;
7572
7554
}
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
+ }
7574
7560
unhash_lockowner_locked (lo );
7575
7561
while (!list_empty (& lo -> lo_owner .so_stateids )) {
7576
7562
stp = list_first_entry (& lo -> lo_owner .so_stateids ,
0 commit comments