]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nfsd: fix oops when reading pool_stats before server is started
authorJeff Layton <jlayton@kernel.org>
Mon, 17 Jun 2024 11:54:08 +0000 (07:54 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 17 Jun 2024 14:13:59 +0000 (10:13 -0400)
Sourbh reported an oops that is triggerable by trying to read the
pool_stats procfile before nfsd had been started. Move the check for a
NULL serv in svc_pool_stats_start above the mutex acquisition, and fix
the stop routine not to unlock the mutex if there is no serv yet.

Fixes: 7b207ccd9833 ("svc: don't hold reference for poolstats, only mutex.")
Reported-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Tested-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
net/sunrpc/svc_xprt.c

index dd86d7f1e97e92ba7f7da0e40d2327337d042b87..49a3bea33f9d5fbc851097e9505cc768ebc01f4a 100644 (file)
@@ -1421,12 +1421,13 @@ static void *svc_pool_stats_start(struct seq_file *m, loff_t *pos)
 
        dprintk("svc_pool_stats_start, *pidx=%u\n", pidx);
 
+       if (!si->serv)
+               return NULL;
+
        mutex_lock(si->mutex);
 
        if (!pidx)
                return SEQ_START_TOKEN;
-       if (!si->serv)
-               return NULL;
        return pidx > si->serv->sv_nrpools ? NULL
                : &si->serv->sv_pools[pidx - 1];
 }
@@ -1458,7 +1459,8 @@ static void svc_pool_stats_stop(struct seq_file *m, void *p)
 {
        struct svc_info *si = m->private;
 
-       mutex_unlock(si->mutex);
+       if (si->serv)
+               mutex_unlock(si->mutex);
 }
 
 static int svc_pool_stats_show(struct seq_file *m, void *p)