Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 882e9d25 authored by Jeff Layton's avatar Jeff Layton Committed by J. Bruce Fields
Browse files

nfsd: clean up and reorganize release_lockowner



Do more within the main loop, and simplify the function a bit. Also,
there's no need to take a stateowner reference unless we're going to call
release_lockowner.

Signed-off-by: default avatarJeff Layton <jlayton@primarydata.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent d4f0489f
Loading
Loading
Loading
Loading
+18 −31
Original line number Diff line number Diff line
@@ -5424,8 +5424,8 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
			struct nfsd4_release_lockowner *rlockowner)
{
	clientid_t *clid = &rlockowner->rl_clientid;
	struct nfs4_stateowner *sop = NULL, *tmp;
	struct nfs4_lockowner *lo;
	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);
@@ -5442,45 +5442,32 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
	if (status)
		goto out;

	status = nfserr_locks_held;

	clp = cstate->clp;
	/* Find the matching lock stateowner */
	spin_lock(&clp->cl_lock);
	list_for_each_entry(tmp, &clp->cl_ownerstr_hashtbl[hashval],
	list_for_each_entry(sop, &clp->cl_ownerstr_hashtbl[hashval],
			    so_strhash) {
		if (tmp->so_is_open_owner)
			continue;
		if (same_owner_str(tmp, owner)) {
			sop = tmp;
			atomic_inc(&sop->so_count);
			break;
		}
	}

	/* No matching owner found, maybe a replay? Just declare victory... */
	if (!sop) {
		spin_unlock(&clp->cl_lock);
		status = nfs_ok;
		goto out;
	}
		if (sop->so_is_open_owner || !same_owner_str(sop, owner))
			continue;

	lo = lockowner(sop);
		/* see if there are still any locks associated with it */
		lo = lockowner(sop);
		list_for_each_entry(stp, &sop->so_stateids, st_perstateowner) {
			if (check_for_locks(stp->st_stid.sc_file, lo)) {
				status = nfserr_locks_held;
				spin_unlock(&clp->cl_lock);
				goto out;
			}
		}
	spin_unlock(&clp->cl_lock);

	status = nfs_ok;
	sop = NULL;
		atomic_inc(&sop->so_count);
		break;
	}
	spin_unlock(&clp->cl_lock);
	if (lo)
		release_lockowner(lo);
out:
	if (sop)
		nfs4_put_stateowner(sop);
	nfs4_unlock_state();
	return status;
}