FAILED: Patch "smb: client: port and use the wait_for_credits logic used by server" failed to apply to 6.6-stable tree
Subsystems (4)
Sasha Levin
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Thanks,
Sasha
------------------ original commit in Linus's tree ------------------
From bb848d205f7ac0141af52a5acb6dd116d9b71177 Mon Sep 17 00:00:00 2001
From: Stefan Metzmacher <[email protected]>
Date: Thu, 22 Jan 2026 18:16:53 +0100
Subject: [PATCH] smb: client: port and use the wait_for_credits logic used by
server
This simplifies the logic and prepares the use ofsmbdirect_send_batch in order to make sure
all messages in a multi fragment send are grouped
together.
We'll add the smbdirect_send_batch processin
in a later patch.
Cc <[email protected]> # 6.18.x
Cc Steve French <[email protected]>
Cc Tom Talpey <[email protected]>
Cc Long Li <[email protected]>
Cc Namjae Jeon <[email protected]>
Signed-off-by Stefan Metzmacher <[email protected]>
Signed-off-by Steve French <[email protected]>
--- fs/smb/client/smbdirect.c | 70 ++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 27 deletions(-)
fs/smb/client/smbdirect.c +43 -27
@@ -1137,6 +1137,44 @@ static int smbd_post_send(struct smbdirect_socket *sc,return rc; } +static int wait_for_credits (struct smbdirect_socket *sc, +wait_queue_head_t *waitq,atomic_t *total_credits, +int needed) +{ +int ret; + +do { +if (atomic_sub_return (needed, total_credits) >=0 ) +return 0 ; + +atomic_add (needed, total_credits); + ret =wait_event_interruptible (*waitq, +atomic_read (total_credits) >= needed || + sc->status !=SMBDIRECT_SOCKET_CONNECTED ); + +if (sc->status !=SMBDIRECT_SOCKET_CONNECTED ) +return -ENOTCONN ; +else if (ret <0 ) +return ret; + }while (true); +} + +static int wait_for_send_lcredit (struct smbdirect_socket *sc) +{ +return wait_for_credits (sc, + &sc->send_io.lcredits.wait_queue, + &sc->send_io.lcredits.count, +1 ); +} + +static int wait_for_send_credits (struct smbdirect_socket *sc) +{ +return wait_for_credits (sc, + &sc->send_io.credits.wait_queue, + &sc->send_io.credits.count, +1 ); +} +static int smbd_post_send_iter (struct smbdirect_socket *sc,struct iov_iter *iter,int *_remaining_data_length)
@@ -1149,41 +1187,19 @@ static int smbd_post_send_iter(struct smbdirect_socket *sc,struct smbdirect_data_transfer *packet;int new_credits =0 ; -wait_lcredit: -/* Wait for local send credits */ - rc =wait_event_interruptible (sc->send_io.lcredits.wait_queue, -atomic_read (&sc->send_io.lcredits.count) >0 || - sc->status !=SMBDIRECT_SOCKET_CONNECTED ); -if (rc) - goto err_wait_lcredit; - -if (sc->status !=SMBDIRECT_SOCKET_CONNECTED ) { -log_outgoing (ERR ,"disconnected not sending on wait_credit\n" ); + rc =wait_for_send_lcredit (sc); +if (rc) { +log_outgoing (ERR ,"disconnected not sending on wait_lcredit\n" ); rc = -EAGAIN ; goto err_wait_lcredit; } -if (unlikely (atomic_dec_return (&sc->send_io.lcredits.count) <0 )) { -atomic_inc (&sc->send_io.lcredits.count); - goto wait_lcredit; - } -wait_credit: -/* Wait for send credits. A SMBD packet needs one credit */ - rc =wait_event_interruptible (sc->send_io.credits.wait_queue, -atomic_read (&sc->send_io.credits.count) >0 || - sc->status !=SMBDIRECT_SOCKET_CONNECTED ); -if (rc) - goto err_wait_credit; - -if (sc->status !=SMBDIRECT_SOCKET_CONNECTED ) { + rc =wait_for_send_credits (sc); +if (rc) {log_outgoing (ERR ,"disconnected not sending on wait_credit\n" ); rc = -EAGAIN ; goto err_wait_credit; } -if (unlikely (atomic_dec_return (&sc->send_io.credits.count) <0 )) { -atomic_inc (&sc->send_io.credits.count); - goto wait_credit; - } request =mempool_alloc (sc->send_io.mem.pool,GFP_KERNEL );if (!request) {
Signature · 1 line
2.51.0