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: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
J. Bruce Fields 2014-05-20 15:55:21 -04:00
parent 5513a510fa
commit a1b8ff4c97

View file

@ -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;
}