]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: client: limit the range of info->receive_credit_target
authorStefan Metzmacher <metze@samba.org>
Thu, 14 Aug 2025 13:01:35 +0000 (15:01 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Sep 2025 23:29:49 +0000 (18:29 -0500)
This simplifies further changes...

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

index df032ed70af56b8aad2c470220f5f35dcffe8948..92d4d75dc38d13db973254eaa782aac118c5b22f 100644 (file)
@@ -483,6 +483,7 @@ static bool process_negotiation_response(
                return false;
        }
        info->receive_credit_target = le16_to_cpu(packet->credits_requested);
+       info->receive_credit_target = min_t(u16, info->receive_credit_target, sp->recv_credit_max);
 
        if (packet->credits_granted == 0) {
                log_rdma_event(ERR, "error: credits_granted==0\n");
@@ -590,7 +591,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
        struct smbdirect_socket_parameters *sp = &sc->parameters;
        struct smbd_connection *info =
                container_of(sc, struct smbd_connection, socket);
-       int old_recv_credit_target;
+       u16 old_recv_credit_target;
        u32 data_offset = 0;
        u32 data_length = 0;
        u32 remaining_data_length = 0;
@@ -668,6 +669,10 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
                old_recv_credit_target = info->receive_credit_target;
                info->receive_credit_target =
                        le16_to_cpu(data_transfer->credits_requested);
+               info->receive_credit_target =
+                       min_t(u16, info->receive_credit_target, sp->recv_credit_max);
+               info->receive_credit_target =
+                       max_t(u16, info->receive_credit_target, 1);
                if (le16_to_cpu(data_transfer->credits_granted)) {
                        atomic_add(le16_to_cpu(data_transfer->credits_granted),
                                &sc->send_io.credits.count);
index 0b6e968c3d917d064b3204a4a989ae85c65b6967..d5ccb92fb618bbf0c4cfdecb02b1c950a5cc420d 100644 (file)
@@ -54,7 +54,7 @@ struct smbd_connection {
        enum keep_alive_status keep_alive_requested;
        int protocol;
        atomic_t receive_credits;
-       int receive_credit_target;
+       u16 receive_credit_target;
 
        /* Memory registrations */
        /* Maximum number of RDMA read/write outstanding on this connection */