Skip to content

Commit d9cb733

Browse files
trondmypdamschuma-ntap
authored andcommitted
NFSv4: Fix double frees in nfs4_test_session_trunk()
rpc_clnt_add_xprt() expects the callback function to be synchronous, and expects to release the transport and switch references itself. Fixes: 04fa2c6 ("NFS pnfs data server multipath session trunking") Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
1 parent fd40559 commit d9cb733

File tree

2 files changed

+3
-16
lines changed

2 files changed

+3
-16
lines changed

fs/nfs/nfs4client.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -660,9 +660,6 @@ int nfs4_detect_session_trunking(struct nfs_client *clp,
660660
if (!nfs4_check_server_scope(clp->cl_serverscope, res->server_scope))
661661
goto out_err;
662662

663-
/* Session trunking passed, add the xprt */
664-
rpc_clnt_xprt_switch_add_xprt(clp->cl_rpcclient, xprt);
665-
666663
pr_info("NFS: %s: Session trunking succeeded for %s\n",
667664
clp->cl_hostname,
668665
xprt->address_strings[RPC_DISPLAY_ADDR]);

fs/nfs/nfs4proc.c

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7473,10 +7473,6 @@ static void nfs4_exchange_id_release(void *data)
74737473
struct nfs41_exchange_id_data *cdata =
74747474
(struct nfs41_exchange_id_data *)data;
74757475

7476-
if (cdata->xprt) {
7477-
xprt_put(cdata->xprt);
7478-
rpc_clnt_xprt_switch_put(cdata->args.client->cl_rpcclient);
7479-
}
74807476
nfs_put_client(cdata->args.client);
74817477
kfree(cdata->res.impl_id);
74827478
kfree(cdata->res.server_scope);
@@ -7505,7 +7501,7 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
75057501
.rpc_client = clp->cl_rpcclient,
75067502
.callback_ops = &nfs4_exchange_id_call_ops,
75077503
.rpc_message = &msg,
7508-
.flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT,
7504+
.flags = RPC_TASK_TIMEOUT,
75097505
};
75107506
struct nfs41_exchange_id_data *calldata;
75117507
struct rpc_task *task;
@@ -7559,8 +7555,7 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
75597555
if (xprt) {
75607556
calldata->xprt = xprt;
75617557
task_setup_data.rpc_xprt = xprt;
7562-
task_setup_data.flags =
7563-
RPC_TASK_SOFT|RPC_TASK_SOFTCONN|RPC_TASK_ASYNC;
7558+
task_setup_data.flags |= RPC_TASK_SOFTCONN;
75647559
memcpy(calldata->args.verifier.data, clp->cl_confirm.data,
75657560
sizeof(calldata->args.verifier.data));
75667561
}
@@ -7581,12 +7576,7 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
75817576
if (IS_ERR(task))
75827577
return PTR_ERR(task);
75837578

7584-
if (!xprt) {
7585-
status = rpc_wait_for_completion_task(task);
7586-
if (!status)
7587-
status = calldata->rpc_status;
7588-
} else /* session trunking test */
7589-
status = calldata->rpc_status;
7579+
status = calldata->rpc_status;
75907580

75917581
rpc_put_task(task);
75927582
out:

0 commit comments

Comments
 (0)