cifs: smbd: Calculate the correct maximum packet size for segmented SMBDirect send/receive
The packet size needs to take account of SMB2 header size and possible encryption header size. This is only done when signing is used and it is for RDMA send/receive, not read/write. Also remove the dead SMBD code in smb2_negotiate_r(w)size. Signed-off-by: Long Li <longli@microsoft.com> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
Родитель
edad734c74
Коммит
f7950cb05d
|
@ -328,16 +328,6 @@ smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
|
|||
/* start with specified wsize, or default */
|
||||
wsize = volume_info->wsize ? volume_info->wsize : CIFS_DEFAULT_IOSIZE;
|
||||
wsize = min_t(unsigned int, wsize, server->max_write);
|
||||
#ifdef CONFIG_CIFS_SMB_DIRECT
|
||||
if (server->rdma) {
|
||||
if (server->sign)
|
||||
wsize = min_t(unsigned int,
|
||||
wsize, server->smbd_conn->max_fragmented_send_size);
|
||||
else
|
||||
wsize = min_t(unsigned int,
|
||||
wsize, server->smbd_conn->max_readwrite_size);
|
||||
}
|
||||
#endif
|
||||
if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
|
||||
wsize = min_t(unsigned int, wsize, SMB2_MAX_BUFFER_SIZE);
|
||||
|
||||
|
@ -356,8 +346,15 @@ smb3_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
|
|||
#ifdef CONFIG_CIFS_SMB_DIRECT
|
||||
if (server->rdma) {
|
||||
if (server->sign)
|
||||
/*
|
||||
* Account for SMB2 data transfer packet header and
|
||||
* possible encryption header
|
||||
*/
|
||||
wsize = min_t(unsigned int,
|
||||
wsize, server->smbd_conn->max_fragmented_send_size);
|
||||
wsize,
|
||||
server->smbd_conn->max_fragmented_send_size -
|
||||
SMB2_READWRITE_PDU_HEADER_SIZE -
|
||||
sizeof(struct smb2_transform_hdr));
|
||||
else
|
||||
wsize = min_t(unsigned int,
|
||||
wsize, server->smbd_conn->max_readwrite_size);
|
||||
|
@ -378,16 +375,6 @@ smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
|
|||
/* start with specified rsize, or default */
|
||||
rsize = volume_info->rsize ? volume_info->rsize : CIFS_DEFAULT_IOSIZE;
|
||||
rsize = min_t(unsigned int, rsize, server->max_read);
|
||||
#ifdef CONFIG_CIFS_SMB_DIRECT
|
||||
if (server->rdma) {
|
||||
if (server->sign)
|
||||
rsize = min_t(unsigned int,
|
||||
rsize, server->smbd_conn->max_fragmented_recv_size);
|
||||
else
|
||||
rsize = min_t(unsigned int,
|
||||
rsize, server->smbd_conn->max_readwrite_size);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
|
||||
rsize = min_t(unsigned int, rsize, SMB2_MAX_BUFFER_SIZE);
|
||||
|
@ -407,8 +394,15 @@ smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
|
|||
#ifdef CONFIG_CIFS_SMB_DIRECT
|
||||
if (server->rdma) {
|
||||
if (server->sign)
|
||||
/*
|
||||
* Account for SMB2 data transfer packet header and
|
||||
* possible encryption header
|
||||
*/
|
||||
rsize = min_t(unsigned int,
|
||||
rsize, server->smbd_conn->max_fragmented_recv_size);
|
||||
rsize,
|
||||
server->smbd_conn->max_fragmented_recv_size -
|
||||
SMB2_READWRITE_PDU_HEADER_SIZE -
|
||||
sizeof(struct smb2_transform_hdr));
|
||||
else
|
||||
rsize = min_t(unsigned int,
|
||||
rsize, server->smbd_conn->max_readwrite_size);
|
||||
|
|
|
@ -120,6 +120,9 @@ struct smb2_sync_hdr {
|
|||
__u8 Signature[16];
|
||||
} __packed;
|
||||
|
||||
/* The total header size for SMB2 read and write */
|
||||
#define SMB2_READWRITE_PDU_HEADER_SIZE (48 + sizeof(struct smb2_sync_hdr))
|
||||
|
||||
struct smb2_sync_pdu {
|
||||
struct smb2_sync_hdr sync_hdr;
|
||||
__le16 StructureSize2; /* size of wct area (varies, request specific) */
|
||||
|
|
|
@ -2097,8 +2097,7 @@ int smbd_send(struct TCP_Server_Info *server,
|
|||
for (i = 0; i < num_rqst; i++)
|
||||
remaining_data_length += smb_rqst_len(server, &rqst_array[i]);
|
||||
|
||||
if (remaining_data_length + sizeof(struct smbd_data_transfer) >
|
||||
info->max_fragmented_send_size) {
|
||||
if (remaining_data_length > info->max_fragmented_send_size) {
|
||||
log_write(ERR, "payload size %d > max size %d\n",
|
||||
remaining_data_length, info->max_fragmented_send_size);
|
||||
rc = -EINVAL;
|
||||
|
|
Загрузка…
Ссылка в новой задаче