]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
NFSD: narrow nfsd_mutex protection in nfsd thread
authorNeilBrown <neilb@suse.de>
Mon, 29 Nov 2021 04:51:25 +0000 (15:51 +1100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Apr 2024 14:18:56 +0000 (16:18 +0200)
[ Upstream commit 9d3792aefdcda71d20c2b1ecc589c17ae71eb523 ]

There is nothing happening in the start of nfsd() that requires
protection by the mutex, so don't take it until shutting down the thread
- which does still require protection - but only for nfsd_put().

Signed-off-by: NeilBrown <neilb@suse.de>
[ cel: address merge conflict with fd2468fa1301 ]
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfssvc.c

index 16884a90e1ab0e327ac207a28ad4b116848cf7df..eb8cc4d914feea3c5283e403acaf978b93ab879b 100644 (file)
@@ -932,9 +932,6 @@ nfsd(void *vrqstp)
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
        int err;
 
-       /* Lock module and set up kernel thread */
-       mutex_lock(&nfsd_mutex);
-
        /* At this point, the thread shares current->fs
         * with the init process. We need to create files with the
         * umask as defined by the client instead of init's umask. */
@@ -954,7 +951,6 @@ nfsd(void *vrqstp)
        allow_signal(SIGINT);
        allow_signal(SIGQUIT);
 
-       mutex_unlock(&nfsd_mutex);
        atomic_inc(&nfsdstats.th_cnt);
 
        set_freezable();
@@ -983,7 +979,6 @@ nfsd(void *vrqstp)
        flush_signals(current);
 
        atomic_dec(&nfsdstats.th_cnt);
-       mutex_lock(&nfsd_mutex);
 
 out:
        /* Take an extra ref so that the svc_put in svc_exit_thread()
@@ -995,10 +990,11 @@ out:
        svc_exit_thread(rqstp);
 
        /* Now if needed we call svc_destroy in appropriate context */
+       mutex_lock(&nfsd_mutex);
        nfsd_put(net);
+       mutex_unlock(&nfsd_mutex);
 
        /* Release module */
-       mutex_unlock(&nfsd_mutex);
        module_put_and_kthread_exit(0);
        return 0;
 }