[PATCH v2] smb: client: let smbd_post_send_iter() respect the peers max_send_size and transmit all data

Tom Talpey tom at talpey.com
Wed Jun 25 16:53:01 UTC 2025


LGTM

Reviewed-by: Tom Talpey <tom at talpey.com>


It appears that the "type 2 code 2" terminate packet the client is
receiving is actually incorrect, it should be a "type 2 code 5" to
properly indicate the length error. The siw maintainer suggests I
send a patch, which I'll do.

Metze - the samba.org server is rejecting me as a spammer based on
some sort of IP address blacklist. I don't have any way to fix that,
so I'm sorry if you only see my replies on the list.

Tom.

On 6/25/2025 12:17 PM, Steve French wrote:
> Added to cifs-2.6.git for-next and updated with rb and tested-by from
> David and tested-by from Meetakshi
> 
> On Wed, Jun 25, 2025 at 4:03 AM David Howells <dhowells at redhat.com> wrote:
>>
>> Stefan Metzmacher <metze at samba.org> wrote:
>>
>>> We should not send smbdirect_data_transfer messages larger than
>>> the negotiated max_send_size, typically 1364 bytes, which means
>>> 24 bytes of the smbdirect_data_transfer header + 1340 payload bytes.
>>>
>>> This happened when doing an SMB2 write with more than 1340 bytes
>>> (which is done inline as it's below rdma_readwrite_threshold).
>>>
>>> It means the peer resets the connection.
>>>
>>> When testing between cifs.ko and ksmbd.ko something like this
>>> is logged:
>>>
>>> client:
>>>
>>>      CIFS: VFS: RDMA transport re-established
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      CIFS: VFS: \\carina Send error in SessSetup = -11
>>>      smb2_reconnect: 12 callbacks suppressed
>>>      CIFS: VFS: reconnect tcon failed rc = -11
>>>      CIFS: VFS: reconnect tcon failed rc = -11
>>>      CIFS: VFS: reconnect tcon failed rc = -11
>>>      CIFS: VFS: SMB: Zero rsize calculated, using minimum value 65536
>>>
>>> and:
>>>
>>>      CIFS: VFS: RDMA transport re-established
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>      CIFS: VFS: smbd_recv:1894 disconnected
>>>      siw: got TERMINATE. layer 1, type 2, code 2
>>>
>>> The ksmbd dmesg is showing things like:
>>>
>>>      smb_direct: Recv error. status='local length error (1)' opcode=128
>>>      smb_direct: disconnected
>>>      smb_direct: Recv error. status='local length error (1)' opcode=128
>>>      ksmbd: smb_direct: disconnected
>>>      ksmbd: sock_read failed: -107
>>>
>>> As smbd_post_send_iter() limits the transmitted number of bytes
>>> we need loop over it in order to transmit the whole iter.
>>>
>>> Cc: Steve French <sfrench at samba.org>
>>> Cc: David Howells <dhowells at redhat.com>
>>> Cc: Tom Talpey <tom at talpey.com>
>>> Cc: linux-cifs at vger.kernel.org
>>> Cc: <stable+noautosel at kernel.org> # sp->max_send_size should be info->max_send_size in backports
>>> Fixes: 3d78fe73fa12 ("cifs: Build the RDMA SGE list directly from an iterator")
>>> Signed-off-by: Stefan Metzmacher <metze at samba.org>
>>
>> Reviewed-by: David Howells <dhowells at redhat.com>
>> Tested-by: David Howells <dhowells at redhat.com>
>>
>>
> 
> 




More information about the samba-technical mailing list