diff options
author | NeilBrown <neilb@suse.de> | 2023-10-11 09:31:22 +1100 |
---|---|---|
committer | Chuck Lever <chuck.lever@oracle.com> | 2023-10-16 12:44:04 -0400 |
commit | f4578ba11c4a211d45877babe56c84d922301576 (patch) | |
tree | c7bac39913162cc5c30cce98592ab7914afa23ac | |
parent | 063ab935a48b3a2854f433957adbb2bde396ed22 (diff) | |
download | lwn-f4578ba11c4a211d45877babe56c84d922301576.tar.gz lwn-f4578ba11c4a211d45877babe56c84d922301576.zip |
lockd: hold a reference to nlmsvc_serv while stopping the thread.
Both nfsd and nfsv4-callback take a temporary reference to the svc_serv
while calling svc_set_num_threads() to stop the last thread. lockd does
not.
This extra reference prevents the scv_serv from being freed when the
last thread drops its reference count. This is not currently needed
for lockd as the svc_serv is not accessed after the last thread is told
to exit.
However a future patch will require svc_exit_thread() to access the
svc_serv after the svc_put() so it will need the code that calls
svc_set_num_threads() to keep a reference and keep the svc_serv active.
So copy the pattern from nfsd and nfsv4-cb to lockd, and take a
reference around svc_set_num_threads(.., 0)
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Tested-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
-rw-r--r-- | fs/lockd/svc.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index 6579948070a4..365cc7adff66 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c @@ -373,7 +373,9 @@ static void lockd_put(void) unregister_inet6addr_notifier(&lockd_inet6addr_notifier); #endif + svc_get(nlmsvc_serv); svc_set_num_threads(nlmsvc_serv, NULL, 0); + svc_put(nlmsvc_serv); timer_delete_sync(&nlmsvc_retry); nlmsvc_serv = NULL; dprintk("lockd_down: service destroyed\n"); |