@@ -7107,6 +7107,7 @@ static int nfs4_sp4_select_mode(struct nfs_client *clp,
7107
7107
struct nfs41_exchange_id_data {
7108
7108
struct nfs41_exchange_id_res res ;
7109
7109
struct nfs41_exchange_id_args args ;
7110
+ struct rpc_xprt * xprt ;
7110
7111
int rpc_status ;
7111
7112
};
7112
7113
@@ -7121,6 +7122,13 @@ static void nfs4_exchange_id_done(struct rpc_task *task, void *data)
7121
7122
7122
7123
if (status == 0 )
7123
7124
status = nfs4_check_cl_exchange_flags (cdata -> res .flags );
7125
+
7126
+ if (cdata -> xprt && status == 0 ) {
7127
+ status = nfs4_detect_session_trunking (clp , & cdata -> res ,
7128
+ cdata -> xprt );
7129
+ goto out ;
7130
+ }
7131
+
7124
7132
if (status == 0 )
7125
7133
status = nfs4_sp4_select_mode (clp , & cdata -> res .state_protect );
7126
7134
@@ -7157,8 +7165,13 @@ static void nfs4_exchange_id_done(struct rpc_task *task, void *data)
7157
7165
clp -> cl_serverscope = cdata -> res .server_scope ;
7158
7166
cdata -> res .server_scope = NULL ;
7159
7167
}
7168
+ /* Save the EXCHANGE_ID verifier session trunk tests */
7169
+ memcpy (clp -> cl_confirm .data , cdata -> args .verifier -> data ,
7170
+ sizeof (clp -> cl_confirm .data ));
7160
7171
}
7172
+ out :
7161
7173
cdata -> rpc_status = status ;
7174
+ return ;
7162
7175
}
7163
7176
7164
7177
static void nfs4_exchange_id_release (void * data )
@@ -7167,6 +7180,10 @@ static void nfs4_exchange_id_release(void *data)
7167
7180
(struct nfs41_exchange_id_data * )data ;
7168
7181
7169
7182
nfs_put_client (cdata -> args .client );
7183
+ if (cdata -> xprt ) {
7184
+ xprt_put (cdata -> xprt );
7185
+ rpc_clnt_xprt_switch_put (cdata -> args .client -> cl_rpcclient );
7186
+ }
7170
7187
kfree (cdata -> res .impl_id );
7171
7188
kfree (cdata -> res .server_scope );
7172
7189
kfree (cdata -> res .server_owner );
@@ -7184,7 +7201,7 @@ static const struct rpc_call_ops nfs4_exchange_id_call_ops = {
7184
7201
* Wrapper for EXCHANGE_ID operation.
7185
7202
*/
7186
7203
static int _nfs4_proc_exchange_id (struct nfs_client * clp , struct rpc_cred * cred ,
7187
- u32 sp4_how )
7204
+ u32 sp4_how , struct rpc_xprt * xprt )
7188
7205
{
7189
7206
nfs4_verifier verifier ;
7190
7207
struct rpc_message msg = {
@@ -7209,7 +7226,8 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
7209
7226
if (!calldata )
7210
7227
goto out ;
7211
7228
7212
- nfs4_init_boot_verifier (clp , & verifier );
7229
+ if (!xprt )
7230
+ nfs4_init_boot_verifier (clp , & verifier );
7213
7231
7214
7232
status = nfs4_init_uniform_client_string (clp );
7215
7233
if (status )
@@ -7249,8 +7267,15 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
7249
7267
status = - EINVAL ;
7250
7268
goto out_impl_id ;
7251
7269
}
7252
-
7253
- calldata -> args .verifier = & verifier ;
7270
+ if (xprt ) {
7271
+ calldata -> xprt = xprt ;
7272
+ task_setup_data .rpc_xprt = xprt ;
7273
+ task_setup_data .flags =
7274
+ RPC_TASK_SOFT |RPC_TASK_SOFTCONN |RPC_TASK_ASYNC ;
7275
+ calldata -> args .verifier = & clp -> cl_confirm ;
7276
+ } else {
7277
+ calldata -> args .verifier = & verifier ;
7278
+ }
7254
7279
calldata -> args .client = clp ;
7255
7280
#ifdef CONFIG_NFS_V4_1_MIGRATION
7256
7281
calldata -> args .flags = EXCHGID4_FLAG_SUPP_MOVED_REFER |
@@ -7270,9 +7295,13 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
7270
7295
goto out_impl_id ;
7271
7296
}
7272
7297
7273
- status = rpc_wait_for_completion_task (task );
7274
- if (!status )
7298
+ if (!xprt ) {
7299
+ status = rpc_wait_for_completion_task (task );
7300
+ if (!status )
7301
+ status = calldata -> rpc_status ;
7302
+ } else /* session trunking test */
7275
7303
status = calldata -> rpc_status ;
7304
+
7276
7305
rpc_put_task (task );
7277
7306
out :
7278
7307
if (clp -> cl_implid != NULL )
@@ -7315,13 +7344,13 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
7315
7344
/* try SP4_MACH_CRED if krb5i/p */
7316
7345
if (authflavor == RPC_AUTH_GSS_KRB5I ||
7317
7346
authflavor == RPC_AUTH_GSS_KRB5P ) {
7318
- status = _nfs4_proc_exchange_id (clp , cred , SP4_MACH_CRED );
7347
+ status = _nfs4_proc_exchange_id (clp , cred , SP4_MACH_CRED , NULL );
7319
7348
if (!status )
7320
7349
return 0 ;
7321
7350
}
7322
7351
7323
7352
/* try SP4_NONE */
7324
- return _nfs4_proc_exchange_id (clp , cred , SP4_NONE );
7353
+ return _nfs4_proc_exchange_id (clp , cred , SP4_NONE , NULL );
7325
7354
}
7326
7355
7327
7356
static int _nfs4_proc_destroy_clientid (struct nfs_client * clp ,
0 commit comments