Re: [PATCH v1 2/2] SUNRPC: Move the svc_rpcb_cleanup() call sites

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Aug 20, 2025 at 10:32 AM Chuck Lever <cel@xxxxxxxxxx> wrote:
>
> From: Chuck Lever <chuck.lever@xxxxxxxxxx>
>
> 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().

Tested-by: Olga Kornievskaia <okorniev@xxxxxxxxxx>

> Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
> ---
>  fs/lockd/svc.c                  | 6 ++----
>  fs/nfs/callback.c               | 2 +-
>  fs/nfsd/nfsctl.c                | 2 +-
>  fs/nfsd/nfssvc.c                | 7 ++-----
>  include/linux/sunrpc/svc_xprt.h | 3 ++-
>  net/sunrpc/svc.c                | 1 -
>  net/sunrpc/svc_xprt.c           | 7 ++++++-
>  7 files changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
> index e80262a51884..d68afa196535 100644
> --- a/fs/lockd/svc.c
> +++ b/fs/lockd/svc.c
> @@ -216,8 +216,7 @@ static int make_socks(struct svc_serv *serv, struct net *net,
>         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",
> diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
> index 511f80878809..c8b837006bb2 100644
> --- a/fs/nfs/callback.c
> +++ b/fs/nfs/callback.c
> @@ -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,
> diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> index bc6b776fc657..63d52edcad72 100644
> --- a/fs/nfsd/nfsctl.c
> +++ b/fs/nfsd/nfsctl.c
> @@ -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,
> diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
> index 82b0111ac469..7057ddd7a0a8 100644
> --- a/fs/nfsd/nfssvc.c
> +++ b/fs/nfsd/nfssvc.c
> @@ -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);
>  }
> diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h
> index 369a89aea186..fde60d4e2cd5 100644
> --- a/include/linux/sunrpc/svc_xprt.h
> +++ b/include/linux/sunrpc/svc_xprt.h
> @@ -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);
> diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
> index b1fab3a69544..9c7245d811eb 100644
> --- a/net/sunrpc/svc.c
> +++ b/net/sunrpc/svc.c
> @@ -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)
>  {
> diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
> index 8b1837228799..049ab53088e9 100644
> --- a/net/sunrpc/svc_xprt.c
> +++ b/net/sunrpc/svc_xprt.c
> @@ -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);
>
> --
> 2.50.0
>
>





[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux