@@ -7524,6 +7524,23 @@ check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner)
7524
7524
return status ;
7525
7525
}
7526
7526
7527
+ /**
7528
+ * nfsd4_release_lockowner - process NFSv4.0 RELEASE_LOCKOWNER operations
7529
+ * @rqstp: RPC transaction
7530
+ * @cstate: NFSv4 COMPOUND state
7531
+ * @u: RELEASE_LOCKOWNER arguments
7532
+ *
7533
+ * The lockowner's so_count is bumped when a lock record is added
7534
+ * or when copying a conflicting lock. The latter case is brief,
7535
+ * but can lead to fleeting false positives when looking for
7536
+ * locks-in-use.
7537
+ *
7538
+ * Return values:
7539
+ * %nfs_ok: lockowner released or not found
7540
+ * %nfserr_locks_held: lockowner still in use
7541
+ * %nfserr_stale_clientid: clientid no longer active
7542
+ * %nfserr_expired: clientid not recognized
7543
+ */
7527
7544
__be32
7528
7545
nfsd4_release_lockowner (struct svc_rqst * rqstp ,
7529
7546
struct nfsd4_compound_state * cstate ,
@@ -7550,7 +7567,7 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
7550
7567
lo = find_lockowner_str_locked (clp , & rlockowner -> rl_owner );
7551
7568
if (!lo ) {
7552
7569
spin_unlock (& clp -> cl_lock );
7553
- return status ;
7570
+ return nfs_ok ;
7554
7571
}
7555
7572
if (atomic_read (& lo -> lo_owner .so_count ) != 2 ) {
7556
7573
spin_unlock (& clp -> cl_lock );
@@ -7566,11 +7583,11 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
7566
7583
put_ol_stateid_locked (stp , & reaplist );
7567
7584
}
7568
7585
spin_unlock (& clp -> cl_lock );
7586
+
7569
7587
free_ol_stateid_reaplist (& reaplist );
7570
7588
remove_blocked_locks (lo );
7571
7589
nfs4_put_stateowner (& lo -> lo_owner );
7572
-
7573
- return status ;
7590
+ return nfs_ok ;
7574
7591
}
7575
7592
7576
7593
static inline struct nfs4_client_reclaim *
0 commit comments