]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: smbdirect: let smbdirect_connection_deregister_mr_io unlock while waiting
authorStefan Metzmacher <metze@samba.org>
Tue, 7 Apr 2026 14:46:30 +0000 (16:46 +0200)
committerSteve French <stfrench@microsoft.com>
Thu, 16 Apr 2026 02:58:24 +0000 (21:58 -0500)
We should not hold a mutex locked during wait_for_completion()
holding a reference is enough.

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>
fs/smb/common/smbdirect/smbdirect_mr.c

index 4873a2c1066fcbc269c2a7e152a7ef4693a76053..fa9be8089925e4e6c5d00ae072ef7460f43e7e53 100644 (file)
@@ -410,6 +410,7 @@ void smbdirect_connection_deregister_mr_io(struct smbdirect_mr_io *mr)
        struct smbdirect_socket *sc = mr->socket;
        int ret = 0;
 
+lock_again:
        mutex_lock(&mr->mutex);
        if (mr->state == SMBDIRECT_MR_DISABLED)
                goto put_kref;
@@ -440,8 +441,15 @@ void smbdirect_connection_deregister_mr_io(struct smbdirect_mr_io *mr)
                        smbdirect_socket_schedule_cleanup(sc, ret);
                        goto done;
                }
+
+               /*
+                * We still hold the reference to mr
+                * so we can unlock while waiting.
+                */
+               mutex_unlock(&mr->mutex);
                wait_for_completion(&mr->invalidate_done);
                mr->need_invalidate = false;
+               goto lock_again;
        } else
                /*
                 * For remote invalidation, just set it to SMBDIRECT_MR_INVALIDATED