|
@@ -7353,6 +7353,37 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
|
|
|
return _nfs4_proc_exchange_id(clp, cred, SP4_NONE, NULL);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * nfs4_test_session_trunk
|
|
|
+ *
|
|
|
+ * This is an add_xprt_test() test function called from
|
|
|
+ * rpc_clnt_setup_test_and_add_xprt.
|
|
|
+ *
|
|
|
+ * The rpc_xprt_switch is referrenced by rpc_clnt_setup_test_and_add_xprt
|
|
|
+ * and is dereferrenced in nfs4_exchange_id_release
|
|
|
+ *
|
|
|
+ * Upon success, add the new transport to the rpc_clnt
|
|
|
+ *
|
|
|
+ * @clnt: struct rpc_clnt to get new transport
|
|
|
+ * @xprt: the rpc_xprt to test
|
|
|
+ * @data: call data for _nfs4_proc_exchange_id.
|
|
|
+ */
|
|
|
+int nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
|
|
|
+ void *data)
|
|
|
+{
|
|
|
+ struct nfs4_add_xprt_data *adata = (struct nfs4_add_xprt_data *)data;
|
|
|
+ u32 sp4_how;
|
|
|
+
|
|
|
+ dprintk("--> %s try %s\n", __func__,
|
|
|
+ xprt->address_strings[RPC_DISPLAY_ADDR]);
|
|
|
+
|
|
|
+ sp4_how = (adata->clp->cl_sp4_flags == 0 ? SP4_NONE : SP4_MACH_CRED);
|
|
|
+
|
|
|
+ /* Test connection for session trunking. Async exchange_id call */
|
|
|
+ return _nfs4_proc_exchange_id(adata->clp, adata->cred, sp4_how, xprt);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(nfs4_test_session_trunk);
|
|
|
+
|
|
|
static int _nfs4_proc_destroy_clientid(struct nfs_client *clp,
|
|
|
struct rpc_cred *cred)
|
|
|
{
|
|
@@ -8944,6 +8975,7 @@ static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = {
|
|
|
.find_root_sec = nfs41_find_root_sec,
|
|
|
.free_lock_state = nfs41_free_lock_state,
|
|
|
.alloc_seqid = nfs_alloc_no_seqid,
|
|
|
+ .session_trunk = nfs4_test_session_trunk,
|
|
|
.call_sync_ops = &nfs41_call_sync_ops,
|
|
|
.reboot_recovery_ops = &nfs41_reboot_recovery_ops,
|
|
|
.nograce_recovery_ops = &nfs41_nograce_recovery_ops,
|
|
@@ -8973,6 +9005,7 @@ static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = {
|
|
|
.free_lock_state = nfs41_free_lock_state,
|
|
|
.call_sync_ops = &nfs41_call_sync_ops,
|
|
|
.alloc_seqid = nfs_alloc_no_seqid,
|
|
|
+ .session_trunk = nfs4_test_session_trunk,
|
|
|
.reboot_recovery_ops = &nfs41_reboot_recovery_ops,
|
|
|
.nograce_recovery_ops = &nfs41_nograce_recovery_ops,
|
|
|
.state_renewal_ops = &nfs41_state_renewal_ops,
|