]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
NFSv4.1: pass transport for callback shutdown
authorOlga Kornievskaia <okorniev@redhat.com>
Tue, 4 Nov 2025 22:29:24 +0000 (17:29 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 23 Nov 2025 20:30:12 +0000 (15:30 -0500)
When we are setting up the 4.1 callback server, we pass in
the appropriate rpc_xprt transport pointer with which to associate
the callback server structure. Similarly, pass in the rpc_xprt
pointer for when we are shutting down the callback. This will be
used to make sure that we free the server structure and then clear
the rpc_xprt's bc_server pointer in a safe manner.

Signed-off-by: Olga Kornievskaia <okorniev@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/callback.c
fs/nfs/callback.h
fs/nfs/nfs4client.c

index c8b837006bb27277ab34fe516f1b63992fee9b7f..8b674ee093a6065df7f1fce15068a85742371cb8 100644 (file)
@@ -258,7 +258,7 @@ err_start:
 /*
  * Kill the callback thread if it's no longer being used.
  */
-void nfs_callback_down(int minorversion, struct net *net)
+void nfs_callback_down(int minorversion, struct net *net, struct rpc_xprt *xprt)
 {
        struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
        struct svc_serv *serv;
index 154a6ed1299f8556cb26e9011d07bf2e1d31f300..8809f93d82c0569b4fad82b465c6d7dcb5175742 100644 (file)
@@ -188,7 +188,8 @@ extern __be32 nfs4_callback_recall(void *argp, void *resp,
                                   struct cb_process_state *cps);
 #if IS_ENABLED(CONFIG_NFS_V4)
 extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt);
-extern void nfs_callback_down(int minorversion, struct net *net);
+extern void nfs_callback_down(int minorversion, struct net *net,
+                             struct rpc_xprt *xprt);
 #endif /* CONFIG_NFS_V4 */
 /*
  * nfs41: Callbacks are expected to not cause substantial latency,
index 3a4baed993c96f10a1ecd06ffd38a7befabbbe78..4e972f85d0caf25f12fc75c47db6989142b37c70 100644 (file)
@@ -281,8 +281,13 @@ error:
  */
 static void nfs4_destroy_callback(struct nfs_client *clp)
 {
-       if (__test_and_clear_bit(NFS_CS_CALLBACK, &clp->cl_res_state))
-               nfs_callback_down(clp->cl_mvops->minor_version, clp->cl_net);
+       if (__test_and_clear_bit(NFS_CS_CALLBACK, &clp->cl_res_state)) {
+               struct rpc_xprt *xprt;
+
+               xprt = rcu_dereference_raw(clp->cl_rpcclient->cl_xprt);
+               nfs_callback_down(clp->cl_mvops->minor_version, clp->cl_net,
+                                 xprt);
+       }
 }
 
 static void nfs4_shutdown_client(struct nfs_client *clp)