]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
SUNRPC: Move the svc_rpcb_cleanup() call sites
authorChuck Lever <chuck.lever@oracle.com>
Wed, 20 Aug 2025 14:27:28 +0000 (10:27 -0400)
committerAnna Schumaker <anna.schumaker@oracle.com>
Tue, 23 Sep 2025 17:28:19 +0000 (13:28 -0400)
Clean up: because svc_rpcb_cleanup() and svc_xprt_destroy_all()
are always invoked in pairs, we can deduplicate code by moving
the svc_rpcb_cleanup() call sites into svc_xprt_destroy_all().

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Tested-by: Olga Kornievskaia <okorniev@redhat.com>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
fs/lockd/svc.c
fs/nfs/callback.c
fs/nfsd/nfsctl.c
fs/nfsd/nfssvc.c
include/linux/sunrpc/svc_xprt.h
net/sunrpc/svc.c
net/sunrpc/svc_xprt.c

index e80262a51884b5a5fd12f9897b31206ef6690627..d68afa196535a8785bab2931c2b14f03a1174ef9 100644 (file)
@@ -216,8 +216,7 @@ out_err:
        if (warned++ == 0)
                printk(KERN_WARNING
                        "lockd_up: makesock failed, error=%d\n", err);
-       svc_xprt_destroy_all(serv, net);
-       svc_rpcb_cleanup(serv, net);
+       svc_xprt_destroy_all(serv, net, true);
        return err;
 }
 
@@ -255,8 +254,7 @@ static void lockd_down_net(struct svc_serv *serv, struct net *net)
                        nlm_shutdown_hosts_net(net);
                        cancel_delayed_work_sync(&ln->grace_period_end);
                        locks_end_grace(&ln->lockd_manager);
-                       svc_xprt_destroy_all(serv, net);
-                       svc_rpcb_cleanup(serv, net);
+                       svc_xprt_destroy_all(serv, net, true);
                }
        } else {
                pr_err("%s: no users! net=%x\n",
index 511f80878809c4cffeb575343cb35b496b38b9dc..c8b837006bb27277ab34fe516f1b63992fee9b7f 100644 (file)
@@ -136,7 +136,7 @@ static void nfs_callback_down_net(u32 minorversion, struct svc_serv *serv, struc
                return;
 
        dprintk("NFS: destroy per-net callback data; net=%x\n", net->ns.inum);
-       svc_xprt_destroy_all(serv, net);
+       svc_xprt_destroy_all(serv, net, false);
 }
 
 static int nfs_callback_up_net(int minorversion, struct svc_serv *serv,
index bc6b776fc6575e40a755cbf832f3ab961ece588f..63d52edcad722f5372b2e533601334ef4c1dc33a 100644 (file)
@@ -1993,7 +1993,7 @@ int nfsd_nl_listener_set_doit(struct sk_buff *skb, struct genl_info *info)
         * remaining listeners and recreate the list.
         */
        if (delete)
-               svc_xprt_destroy_all(serv, net);
+               svc_xprt_destroy_all(serv, net, false);
 
        /* walk list of addrs again, open any that still don't exist */
        nlmsg_for_each_attr_type(attr, NFSD_A_SERVER_SOCK_ADDR, info->nlhdr,
index 82b0111ac469c4cccbe9838e1637c461222150b2..7057ddd7a0a8738974d13c29c133991d6050a3fb 100644 (file)
@@ -535,16 +535,13 @@ void nfsd_destroy_serv(struct net *net)
 #endif
        }
 
-       svc_xprt_destroy_all(serv, net);
-
        /*
         * write_ports can create the server without actually starting
-        * any threads--if we get shut down before any threads are
+        * any threads.  If we get shut down before any threads are
         * started, then nfsd_destroy_serv will be run before any of this
         * other initialization has been done except the rpcb information.
         */
-       svc_rpcb_cleanup(serv, net);
-
+       svc_xprt_destroy_all(serv, net, true);
        nfsd_shutdown_net(net);
        svc_destroy(&serv);
 }
index 369a89aea18618748607ee943247c327bf62c8d5..fde60d4e2cd5c5c4c33eeb3a73550c6cea5861ac 100644 (file)
@@ -165,7 +165,8 @@ int svc_xprt_create(struct svc_serv *serv, const char *xprt_name,
                        struct net *net, const int family,
                        const unsigned short port, int flags,
                        const struct cred *cred);
-void   svc_xprt_destroy_all(struct svc_serv *serv, struct net *net);
+void   svc_xprt_destroy_all(struct svc_serv *serv, struct net *net,
+                            bool unregister);
 void   svc_xprt_received(struct svc_xprt *xprt);
 void   svc_xprt_enqueue(struct svc_xprt *xprt);
 void   svc_xprt_put(struct svc_xprt *xprt);
index b1fab3a6954437cf751e4725fa52cfc83eddf2ab..9c7245d811eb65b501472190b626241b307a6ed8 100644 (file)
@@ -436,7 +436,6 @@ void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net)
        svc_unregister(serv, net);
        rpcb_put_local(net);
 }
-EXPORT_SYMBOL_GPL(svc_rpcb_cleanup);
 
 static int svc_uses_rpcbind(struct svc_serv *serv)
 {
index 8b1837228799c5e3ad052cfa831ff52ba12de6e1..049ab53088e9c11688b90fae6edeb525398ed4d6 100644 (file)
@@ -1102,6 +1102,7 @@ static void svc_clean_up_xprts(struct svc_serv *serv, struct net *net)
  * svc_xprt_destroy_all - Destroy transports associated with @serv
  * @serv: RPC service to be shut down
  * @net: target network namespace
+ * @unregister: true if it is OK to unregister the destroyed xprts
  *
  * Server threads may still be running (especially in the case where the
  * service is still running in other network namespaces).
@@ -1114,7 +1115,8 @@ static void svc_clean_up_xprts(struct svc_serv *serv, struct net *net)
  * threads, we may need to wait a little while and then check again to
  * see if they're done.
  */
-void svc_xprt_destroy_all(struct svc_serv *serv, struct net *net)
+void svc_xprt_destroy_all(struct svc_serv *serv, struct net *net,
+                         bool unregister)
 {
        int delay = 0;
 
@@ -1124,6 +1126,9 @@ void svc_xprt_destroy_all(struct svc_serv *serv, struct net *net)
                svc_clean_up_xprts(serv, net);
                msleep(delay++);
        }
+
+       if (unregister)
+               svc_rpcb_cleanup(serv, net);
 }
 EXPORT_SYMBOL_GPL(svc_xprt_destroy_all);