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

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
...@@ -3717,9 +3717,16 @@ nfs4_preprocess_stateid_op(struct net *net, struct nfsd4_compound_state *cstate, ...@@ -3717,9 +3717,16 @@ nfs4_preprocess_stateid_op(struct net *net, struct nfsd4_compound_state *cstate,
static __be32 static __be32
nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp) 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; 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; return nfs_ok;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment