OSDN Git Service

SUNRPC restructure rpc_clnt_setup_test_and_add_xprt
authorOlga Kornievskaia <olga.kornievskaia@gmail.com>
Mon, 25 Jul 2022 13:32:28 +0000 (09:32 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 25 Jul 2022 14:06:04 +0000 (10:06 -0400)
In preparation for code re-use, pull out the part of the
rpc_clnt_setup_test_and_add_xprt() portion that sends a NULL rpc
and then calls a session trunking function into a helper function.

Re-organize the end of the function for code re-use.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/clnt.c

index 26f3102..9c97122 100644 (file)
@@ -2874,6 +2874,30 @@ success:
 }
 EXPORT_SYMBOL_GPL(rpc_clnt_test_and_add_xprt);
 
+static int rpc_clnt_add_xprt_helper(struct rpc_clnt *clnt,
+                                   struct rpc_xprt *xprt,
+                                   struct rpc_add_xprt_test *data)
+{
+       struct rpc_task *task;
+       int status = -EADDRINUSE;
+
+       /* Test the connection */
+       task = rpc_call_null_helper(clnt, xprt, NULL, 0, NULL, NULL);
+       if (IS_ERR(task))
+               return PTR_ERR(task);
+
+       status = task->tk_status;
+       rpc_put_task(task);
+
+       if (status < 0)
+               return status;
+
+       /* rpc_xprt_switch and rpc_xprt are deferrenced by add_xprt_test() */
+       data->add_xprt_test(clnt, xprt, data->data);
+
+       return 0;
+}
+
 /**
  * rpc_clnt_setup_test_and_add_xprt()
  *
@@ -2897,8 +2921,6 @@ int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *clnt,
                                     struct rpc_xprt *xprt,
                                     void *data)
 {
-       struct rpc_task *task;
-       struct rpc_add_xprt_test *xtest = (struct rpc_add_xprt_test *)data;
        int status = -EADDRINUSE;
 
        xprt = xprt_get(xprt);
@@ -2907,31 +2929,19 @@ int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *clnt,
        if (rpc_xprt_switch_has_addr(xps, (struct sockaddr *)&xprt->addr))
                goto out_err;
 
-       /* Test the connection */
-       task = rpc_call_null_helper(clnt, xprt, NULL, 0, NULL, NULL);
-       if (IS_ERR(task)) {
-               status = PTR_ERR(task);
-               goto out_err;
-       }
-       status = task->tk_status;
-       rpc_put_task(task);
-
+       status = rpc_clnt_add_xprt_helper(clnt, xprt, data);
        if (status < 0)
                goto out_err;
 
-       /* rpc_xprt_switch and rpc_xprt are deferrenced by add_xprt_test() */
-       xtest->add_xprt_test(clnt, xprt, xtest->data);
-
-       xprt_put(xprt);
-       xprt_switch_put(xps);
-
-       /* so that rpc_clnt_add_xprt does not call rpc_xprt_switch_add_xprt */
-       return 1;
+       status = 1;
 out_err:
        xprt_put(xprt);
        xprt_switch_put(xps);
-       pr_info("RPC:   rpc_clnt_test_xprt failed: %d addr %s not added\n",
-               status, xprt->address_strings[RPC_DISPLAY_ADDR]);
+       if (status < 0)
+               pr_info("RPC:   rpc_clnt_test_xprt failed: %d addr %s not "
+                       "added\n", status,
+                       xprt->address_strings[RPC_DISPLAY_ADDR]);
+       /* so that rpc_clnt_add_xprt does not call rpc_xprt_switch_add_xprt */
        return status;
 }
 EXPORT_SYMBOL_GPL(rpc_clnt_setup_test_and_add_xprt);