]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: server: pass ksmbd_transport to get_smbd_max_read_write_size()
authorStefan Metzmacher <metze@samba.org>
Fri, 15 Aug 2025 10:03:40 +0000 (12:03 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Sep 2025 23:29:52 +0000 (18:29 -0500)
We should use the per connection value.

And for TCP return NT_STATUS_INVALID_PARAMETER if any
SMB2_CHANNEL_RDMA_V1* is used.

Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/server/smb2pdu.c
fs/smb/server/transport_rdma.c
fs/smb/server/transport_rdma.h

index 00e644935f28645bdcc38a9f418cd41361afc1bb..0c069eff80b771bc2c362180a2e9b352c314119d 100644 (file)
@@ -6762,7 +6762,11 @@ int smb2_read(struct ksmbd_work *work)
        if (req->Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE ||
            req->Channel == SMB2_CHANNEL_RDMA_V1) {
                is_rdma_channel = true;
-               max_read_size = get_smbd_max_read_write_size();
+               max_read_size = get_smbd_max_read_write_size(work->conn->transport);
+               if (max_read_size == 0) {
+                       err = -EINVAL;
+                       goto out;
+               }
        }
 
        if (is_rdma_channel == true) {
@@ -7020,7 +7024,11 @@ int smb2_write(struct ksmbd_work *work)
        if (req->Channel == SMB2_CHANNEL_RDMA_V1 ||
            req->Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE) {
                is_rdma_channel = true;
-               max_write_size = get_smbd_max_read_write_size();
+               max_write_size = get_smbd_max_read_write_size(work->conn->transport);
+               if (max_write_size == 0) {
+                       err = -EINVAL;
+                       goto out;
+               }
                length = le32_to_cpu(req->RemainingBytes);
        }
 
index 0abcf2991c3c0dbf81be5710acfb9bb3a7396e68..d970a49565337691840502b773031cd53d3c9050 100644 (file)
@@ -111,9 +111,20 @@ void init_smbd_max_io_size(unsigned int sz)
        smb_direct_max_read_write_size = sz;
 }
 
-unsigned int get_smbd_max_read_write_size(void)
+unsigned int get_smbd_max_read_write_size(struct ksmbd_transport *kt)
 {
-       return smb_direct_max_read_write_size;
+       struct smb_direct_transport *t;
+       struct smbdirect_socket *sc;
+       struct smbdirect_socket_parameters *sp;
+
+       if (kt->ops != &ksmbd_smb_direct_transport_ops)
+               return 0;
+
+       t = SMBD_TRANS(kt);
+       sc = &t->socket;
+       sp = &sc->parameters;
+
+       return sp->max_read_write_size;
 }
 
 static inline int get_buf_page_count(void *buf, int size)
index 63eab9f8f13dff78087e624eba047d3e30105b8b..3f93c6a9f7e4ad569c0858e10c6dd81380d74f0d 100644 (file)
@@ -17,14 +17,14 @@ void ksmbd_rdma_stop_listening(void);
 void ksmbd_rdma_destroy(void);
 bool ksmbd_rdma_capable_netdev(struct net_device *netdev);
 void init_smbd_max_io_size(unsigned int sz);
-unsigned int get_smbd_max_read_write_size(void);
+unsigned int get_smbd_max_read_write_size(struct ksmbd_transport *kt);
 #else
 static inline int ksmbd_rdma_init(void) { return 0; }
 static inline void ksmbd_rdma_stop_listening(void) { }
 static inline void ksmbd_rdma_destroy(void) { }
 static inline bool ksmbd_rdma_capable_netdev(struct net_device *netdev) { return false; }
 static inline void init_smbd_max_io_size(unsigned int sz) { }
-static inline unsigned int get_smbd_max_read_write_size(void) { return 0; }
+static inline unsigned int get_smbd_max_read_write_size(struct ksmbd_transport *kt) { return 0; }
 #endif
 
 #endif /* __KSMBD_TRANSPORT_RDMA_H__ */