|
@@ -6783,12 +6783,16 @@ nfs41_same_server_scope(struct nfs41_server_scope *a,
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * nfs4_proc_bind_conn_to_session()
|
|
|
+ * nfs4_proc_bind_one_conn_to_session()
|
|
|
*
|
|
|
* The 4.1 client currently uses the same TCP connection for the
|
|
|
* fore and backchannel.
|
|
|
*/
|
|
|
-int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred)
|
|
|
+static
|
|
|
+int nfs4_proc_bind_one_conn_to_session(struct rpc_clnt *clnt,
|
|
|
+ struct rpc_xprt *xprt,
|
|
|
+ struct nfs_client *clp,
|
|
|
+ struct rpc_cred *cred)
|
|
|
{
|
|
|
int status;
|
|
|
struct nfs41_bind_conn_to_session_args args = {
|
|
@@ -6803,6 +6807,13 @@ int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred
|
|
|
.rpc_resp = &res,
|
|
|
.rpc_cred = cred,
|
|
|
};
|
|
|
+ struct rpc_task_setup task_setup_data = {
|
|
|
+ .rpc_client = clnt,
|
|
|
+ .rpc_xprt = xprt,
|
|
|
+ .rpc_message = &msg,
|
|
|
+ .flags = RPC_TASK_TIMEOUT,
|
|
|
+ };
|
|
|
+ struct rpc_task *task;
|
|
|
|
|
|
dprintk("--> %s\n", __func__);
|
|
|
|
|
@@ -6810,7 +6821,16 @@ int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred
|
|
|
if (!(clp->cl_session->flags & SESSION4_BACK_CHAN))
|
|
|
args.dir = NFS4_CDFC4_FORE;
|
|
|
|
|
|
- status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
|
|
|
+ /* Do not set the backchannel flag unless this is clnt->cl_xprt */
|
|
|
+ if (xprt != rcu_access_pointer(clnt->cl_xprt))
|
|
|
+ args.dir = NFS4_CDFC4_FORE;
|
|
|
+
|
|
|
+ task = rpc_run_task(&task_setup_data);
|
|
|
+ if (!IS_ERR(task)) {
|
|
|
+ status = task->tk_status;
|
|
|
+ rpc_put_task(task);
|
|
|
+ } else
|
|
|
+ status = PTR_ERR(task);
|
|
|
trace_nfs4_bind_conn_to_session(clp, status);
|
|
|
if (status == 0) {
|
|
|
if (memcmp(res.sessionid.data,
|
|
@@ -6837,6 +6857,31 @@ out:
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
+struct rpc_bind_conn_calldata {
|
|
|
+ struct nfs_client *clp;
|
|
|
+ struct rpc_cred *cred;
|
|
|
+};
|
|
|
+
|
|
|
+static int
|
|
|
+nfs4_proc_bind_conn_to_session_callback(struct rpc_clnt *clnt,
|
|
|
+ struct rpc_xprt *xprt,
|
|
|
+ void *calldata)
|
|
|
+{
|
|
|
+ struct rpc_bind_conn_calldata *p = calldata;
|
|
|
+
|
|
|
+ return nfs4_proc_bind_one_conn_to_session(clnt, xprt, p->clp, p->cred);
|
|
|
+}
|
|
|
+
|
|
|
+int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred)
|
|
|
+{
|
|
|
+ struct rpc_bind_conn_calldata data = {
|
|
|
+ .clp = clp,
|
|
|
+ .cred = cred,
|
|
|
+ };
|
|
|
+ return rpc_clnt_iterate_for_each_xprt(clp->cl_rpcclient,
|
|
|
+ nfs4_proc_bind_conn_to_session_callback, &data);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Minimum set of SP4_MACH_CRED operations from RFC 5661 in the enforce map
|
|
|
* and operations we'd like to see to enable certain features in the allow map
|