NFSD: narrow nfsd_mutex protection in nfsd thread
authorNeilBrown <neilb@suse.de>
Mon, 29 Nov 2021 04:51:25 +0000 (15:51 +1100)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 13 Dec 2021 18:42:52 +0000 (13:42 -0500)
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>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfssvc.c

index e9c9fa8..097abd8 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_exit(0);
        return 0;
 }