linux-stable/fs/lockd
NeilBrown 4a9be28c45 NFS: fix mount/umount race in nlmclnt.
If the last NFSv3 unmount from a given host races with a mount from the
same host, we can destroy an nlm_host that is still in use.

Specifically nlmclnt_lookup_host() can increment h_count on
an nlm_host that nlmclnt_release_host() has just successfully called
refcount_dec_and_test() on.
Once nlmclnt_lookup_host() drops the mutex, nlm_destroy_host_lock()
will be called to destroy the nlmclnt which is now in use again.

The cause of the problem is that the dec_and_test happens outside the
locked region.  This is easily fixed by using
refcount_dec_and_mutex_lock().

Fixes: 8ea6ecc8b0 ("lockd: Create client-side nlm_host cache")
Cc: stable@vger.kernel.org (v2.6.38+)
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
2019-03-18 22:39:34 -04:00
..
clnt4xdr.c NFS: Remove print_overflow_msg() 2019-02-13 11:53:45 -05:00
clntlock.c nfsd: fix leaked file lock with nfs exported overlayfs 2018-08-09 16:11:21 -04:00
clntproc.c NFS client updates for Linux 4.21 2019-01-02 16:35:23 -08:00
clntxdr.c NFS: Remove print_overflow_msg() 2019-02-13 11:53:45 -05:00
host.c NFS: fix mount/umount race in nlmclnt. 2019-03-18 22:39:34 -04:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mon.c lockd: convert nsm_handle.sm_count from atomic_t to refcount_t 2018-01-14 23:06:29 -05:00
netns.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
procfs.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
procfs.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
svc.c lockd: make nlm_ntf_refcnt and nlm_ntf_wq static 2018-03-19 16:38:13 -04:00
svc4proc.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
svclock.c fs/locks: merge posix_unblock_lock() and locks_delete_block() 2018-12-07 06:50:56 -05:00
svcproc.c lockd: convert nlm_rqst.a_count from atomic_t to refcount_t 2018-01-14 23:06:30 -05:00
svcshare.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
svcsubs.c nfsd: fix leaked file lock with nfs exported overlayfs 2018-08-09 16:11:21 -04:00
xdr.c lockd: Show pid of lockd for remote locks 2018-12-14 12:52:16 -05:00
xdr4.c lockd: Show pid of lockd for remote locks 2018-12-14 12:52:16 -05:00