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

David Howells dhowells at redhat.com
Wed Jun 25 09:01:38 UTC 2025


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