@@ -280,6 +280,31 @@ smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
280
280
return wsize ;
281
281
}
282
282
283
+ static unsigned int
284
+ smb3_negotiate_wsize (struct cifs_tcon * tcon , struct smb_vol * volume_info )
285
+ {
286
+ struct TCP_Server_Info * server = tcon -> ses -> server ;
287
+ unsigned int wsize ;
288
+
289
+ /* start with specified wsize, or default */
290
+ wsize = volume_info -> wsize ? volume_info -> wsize : SMB3_DEFAULT_IOSIZE ;
291
+ wsize = min_t (unsigned int , wsize , server -> max_write );
292
+ #ifdef CONFIG_CIFS_SMB_DIRECT
293
+ if (server -> rdma ) {
294
+ if (server -> sign )
295
+ wsize = min_t (unsigned int ,
296
+ wsize , server -> smbd_conn -> max_fragmented_send_size );
297
+ else
298
+ wsize = min_t (unsigned int ,
299
+ wsize , server -> smbd_conn -> max_readwrite_size );
300
+ }
301
+ #endif
302
+ if (!(server -> capabilities & SMB2_GLOBAL_CAP_LARGE_MTU ))
303
+ wsize = min_t (unsigned int , wsize , SMB2_MAX_BUFFER_SIZE );
304
+
305
+ return wsize ;
306
+ }
307
+
283
308
static unsigned int
284
309
smb2_negotiate_rsize (struct cifs_tcon * tcon , struct smb_vol * volume_info )
285
310
{
@@ -306,6 +331,31 @@ smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
306
331
return rsize ;
307
332
}
308
333
334
+ static unsigned int
335
+ smb3_negotiate_rsize (struct cifs_tcon * tcon , struct smb_vol * volume_info )
336
+ {
337
+ struct TCP_Server_Info * server = tcon -> ses -> server ;
338
+ unsigned int rsize ;
339
+
340
+ /* start with specified rsize, or default */
341
+ rsize = volume_info -> rsize ? volume_info -> rsize : SMB3_DEFAULT_IOSIZE ;
342
+ rsize = min_t (unsigned int , rsize , server -> max_read );
343
+ #ifdef CONFIG_CIFS_SMB_DIRECT
344
+ if (server -> rdma ) {
345
+ if (server -> sign )
346
+ rsize = min_t (unsigned int ,
347
+ rsize , server -> smbd_conn -> max_fragmented_recv_size );
348
+ else
349
+ rsize = min_t (unsigned int ,
350
+ rsize , server -> smbd_conn -> max_readwrite_size );
351
+ }
352
+ #endif
353
+
354
+ if (!(server -> capabilities & SMB2_GLOBAL_CAP_LARGE_MTU ))
355
+ rsize = min_t (unsigned int , rsize , SMB2_MAX_BUFFER_SIZE );
356
+
357
+ return rsize ;
358
+ }
309
359
310
360
static int
311
361
parse_server_interfaces (struct network_interface_info_ioctl_rsp * buf ,
@@ -3436,8 +3486,8 @@ struct smb_version_operations smb30_operations = {
3436
3486
.downgrade_oplock = smb2_downgrade_oplock ,
3437
3487
.need_neg = smb2_need_neg ,
3438
3488
.negotiate = smb2_negotiate ,
3439
- .negotiate_wsize = smb2_negotiate_wsize ,
3440
- .negotiate_rsize = smb2_negotiate_rsize ,
3489
+ .negotiate_wsize = smb3_negotiate_wsize ,
3490
+ .negotiate_rsize = smb3_negotiate_rsize ,
3441
3491
.sess_setup = SMB2_sess_setup ,
3442
3492
.logoff = SMB2_logoff ,
3443
3493
.tree_connect = SMB2_tcon ,
@@ -3540,8 +3590,8 @@ struct smb_version_operations smb311_operations = {
3540
3590
.downgrade_oplock = smb2_downgrade_oplock ,
3541
3591
.need_neg = smb2_need_neg ,
3542
3592
.negotiate = smb2_negotiate ,
3543
- .negotiate_wsize = smb2_negotiate_wsize ,
3544
- .negotiate_rsize = smb2_negotiate_rsize ,
3593
+ .negotiate_wsize = smb3_negotiate_wsize ,
3594
+ .negotiate_rsize = smb3_negotiate_rsize ,
3545
3595
.sess_setup = SMB2_sess_setup ,
3546
3596
.logoff = SMB2_logoff ,
3547
3597
.tree_connect = SMB2_tcon ,
0 commit comments