Revert "nfsd: fix oops when reading pool_stats before server is started"
authorNeilBrown <neilb@suse.de>
Mon, 24 Jun 2024 23:04:57 +0000 (09:04 +1000)
committerChuck Lever <chuck.lever@oracle.com>
Tue, 25 Jun 2024 14:18:05 +0000 (10:18 -0400)
This reverts commit 8e948c365d9c10b685d1deb946bd833d6a9b43e0.

The reverted commit moves a test on a field protected by a mutex outside
of the protection of that mutex, and so is obviously racey.

Depending on how the race goes, si->serv might be NULL when dereferenced
in svc_pool_stats_start(), or svc_pool_stats_stop() might unlock a mutex
that hadn't been locked.

This bug that the commit tried to fix has been addressed by initialising
->mutex earlier.

Fixes: 8e948c365d9c ("nfsd: fix oops when reading pool_stats before server is started")
Signed-off-by: NeilBrown <neilb@suse.de>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
net/sunrpc/svc_xprt.c

index 49a3bea33f9d5fbc851097e9505cc768ebc01f4a..dd86d7f1e97e92ba7f7da0e40d2327337d042b87 100644 (file)
@@ -1421,13 +1421,12 @@ 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];
 }
@@ -1459,8 +1458,7 @@ static void svc_pool_stats_stop(struct seq_file *m, void *p)
 {
        struct svc_info *si = m->private;
 
-       if (si->serv)
-               mutex_unlock(si->mutex);
+       mutex_unlock(si->mutex);
 }
 
 static int svc_pool_stats_show(struct seq_file *m, void *p)