Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

+9 -2
+9 -2
fs/nfsd/nfs4state.c
··· 3717 3717 static __be32 3718 3718 nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp) 3719 3719 { 3720 - if (check_for_locks(stp->st_file, lockowner(stp->st_stateowner))) 3720 + struct nfs4_lockowner *lo = lockowner(stp->st_stateowner); 3721 + 3722 + if (check_for_locks(stp->st_file, lo)) 3721 3723 return nfserr_locks_held; 3722 - release_lock_stateid(stp); 3724 + /* 3725 + * Currently there's a 1-1 lock stateid<->lockowner 3726 + * correspondance, and we have to delete the lockowner when we 3727 + * delete the lock stateid: 3728 + */ 3729 + unhash_lockowner(lo); 3723 3730 return nfs_ok; 3724 3731 } 3725 3732