From: Stefan Metzmacher Date: Tue, 7 Apr 2026 14:46:30 +0000 (+0200) Subject: smb: smbdirect: let smbdirect_connection_deregister_mr_io unlock while waiting X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d09a040c186a2083b1cfa9c3c112782ce4b1f6d4;p=thirdparty%2Fkernel%2Flinux.git smb: smbdirect: let smbdirect_connection_deregister_mr_io unlock while waiting We should not hold a mutex locked during wait_for_completion() holding a reference is enough. Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: David Howells Cc: Henrique Carvalho Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French --- diff --git a/fs/smb/common/smbdirect/smbdirect_mr.c b/fs/smb/common/smbdirect/smbdirect_mr.c index 4873a2c1066fc..fa9be8089925e 100644 --- a/fs/smb/common/smbdirect/smbdirect_mr.c +++ b/fs/smb/common/smbdirect/smbdirect_mr.c @@ -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