nfsd: hold nfsd_mutex across entire netlink operation
authorNeilBrown <neilb@suse.de>
Fri, 15 Dec 2023 00:56:33 +0000 (11:56 +1100)
committerChuck Lever <chuck.lever@oracle.com>
Fri, 15 Dec 2023 15:23:52 +0000 (10:23 -0500)
Rather than using svc_get() and svc_put() to hold a stable reference to
the nfsd_svc for netlink lookups, simply hold the mutex for the entire
time.

The "entire" time isn't very long, and the mutex is not often contented.

This makes way for us to remove the refcounts of svc, which is more
confusing than useful.

Reported-by: Jeff Layton <jlayton@kernel.org>
Closes: https://lore.kernel.org/linux-nfs/5d9bbb599569ce29f16e4e0eef6b291eda0f375b.camel@kernel.org/T/#u
Fixes: bd9d6a3efa97 ("NFSD: add rpc_status netlink support")
Signed-off-by: NeilBrown <neilb@suse.de>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfsctl.c

index 79efb1075f382ef7395d6bf601cecda7eb9f5c4d..05b55db33424aa9483028d0abfd9a1fc8b74675a 100644 (file)
@@ -1515,11 +1515,10 @@ int nfsd_nl_rpc_status_get_start(struct netlink_callback *cb)
        int ret = -ENODEV;
 
        mutex_lock(&nfsd_mutex);
-       if (nn->nfsd_serv) {
-               svc_get(nn->nfsd_serv);
+       if (nn->nfsd_serv)
                ret = 0;
-       }
-       mutex_unlock(&nfsd_mutex);
+       else
+               mutex_unlock(&nfsd_mutex);
 
        return ret;
 }
@@ -1691,8 +1690,6 @@ out:
  */
 int nfsd_nl_rpc_status_get_done(struct netlink_callback *cb)
 {
-       mutex_lock(&nfsd_mutex);
-       nfsd_put(sock_net(cb->skb->sk));
        mutex_unlock(&nfsd_mutex);
 
        return 0;