diff options
| author | Stefan Metzmacher <metze@samba.org> | 2026-04-07 16:46:29 +0200 |
|---|---|---|
| committer | Steve French <stfrench@microsoft.com> | 2026-04-15 21:58:24 -0500 |
| commit | 25c2e34931c5f2a02baefd111a4eb7fa31158059 (patch) | |
| tree | 7981f05958acfb038063ba815f6400b074da0b8d | |
| parent | 3892007f2bbf8ae2df5374de708282d6895402e9 (diff) | |
| download | linux-25c2e34931c5f2a02baefd111a4eb7fa31158059.tar.gz linux-25c2e34931c5f2a02baefd111a4eb7fa31158059.zip | |
smb: smbdirect: fix the logic in smbdirect_socket_destroy_sync() without an error
If smbdirect_socket_destroy_sync() and sc->first_error was not set
we should set -ESHUTDOWN, that's a better condition
doing it only implicitly with the
sc->status < SMBDIRECT_SOCKET_DISCONNECTING check.
Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: David Howells <dhowells@redhat.com>
Cc: Henrique Carvalho <henrique.carvalho@suse.com>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
| -rw-r--r-- | fs/smb/common/smbdirect/smbdirect_socket.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/fs/smb/common/smbdirect/smbdirect_socket.c b/fs/smb/common/smbdirect/smbdirect_socket.c index 4003753bea26..9153e1dbf53d 100644 --- a/fs/smb/common/smbdirect/smbdirect_socket.c +++ b/fs/smb/common/smbdirect/smbdirect_socket.c @@ -600,13 +600,20 @@ void smbdirect_socket_destroy_sync(struct smbdirect_socket *sc) */ WARN_ON_ONCE(in_interrupt()); - smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, - "cancelling and disable disconnect_work\n"); - disable_work_sync(&sc->disconnect_work); + /* + * First we try to disable the work + * without disable_work_sync() in a + * non blocking way, if it's already + * running it will be handles by + * disable_work_sync() below. + * + * Here we just want to make sure queue_work() in + * smbdirect_socket_schedule_cleanup_lvl() + * is a no-op. + */ + disable_work(&sc->disconnect_work); - smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, - "destroying rdma session\n"); - if (sc->status < SMBDIRECT_SOCKET_DISCONNECTING) { + if (!sc->first_error) /* * SMBDIRECT_LOG_INFO is enough here * as this is the typical case where @@ -615,8 +622,15 @@ void smbdirect_socket_destroy_sync(struct smbdirect_socket *sc) smbdirect_socket_schedule_cleanup_lvl(sc, SMBDIRECT_LOG_INFO, -ESHUTDOWN); + + smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, + "cancelling and disable disconnect_work\n"); + disable_work_sync(&sc->disconnect_work); + + smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, + "destroying rdma session\n"); + if (sc->status < SMBDIRECT_SOCKET_DISCONNECTING) smbdirect_socket_cleanup_work(&sc->disconnect_work); - } if (sc->status < SMBDIRECT_SOCKET_DISCONNECTED) { smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, "wait for transport being disconnected\n"); |
