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

Commit a1b8ff4c authored by J. Bruce Fields's avatar J. Bruce Fields
Browse files

nfsd4: remove lockowner when removing lock stateid



The nfsv4 state code has always assumed a one-to-one correspondance
between lock stateid's and lockowners even if it appears not to in some
places.

We may actually change that, but for now when FREE_STATEID releases a
lock stateid it also needs to release the parent lockowner.

Symptoms were a subsequent LOCK crashing in find_lockowner_str when it
calls same_lockowner_ino on a lockowner that unexpectedly has an empty
so_stateids list.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 5513a510
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -3717,9 +3717,16 @@ out:
static __be32
nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp)
{
	if (check_for_locks(stp->st_file, lockowner(stp->st_stateowner)))
	struct nfs4_lockowner *lo = lockowner(stp->st_stateowner);

	if (check_for_locks(stp->st_file, lo))
		return nfserr_locks_held;
	release_lock_stateid(stp);
	/*
	 * Currently there's a 1-1 lock stateid<->lockowner
	 * correspondance, and we have to delete the lockowner when we
	 * delete the lock stateid:
	 */
	unhash_lockowner(lo);
	return nfs_ok;
}