]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nvmet-tcp: fix callback lock for TLS handshake
authorMaurizio Lombardi <mlombard@redhat.com>
Fri, 4 Jul 2025 14:44:54 +0000 (16:44 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 24 Jul 2025 06:58:35 +0000 (08:58 +0200)
[ Upstream commit 0523c6cc87e558c50ff4489c87c54c55068b1169 ]

When restoring the default socket callbacks during a TLS handshake, we
need to acquire a write lock on sk_callback_lock.  Previously, a read
lock was used, which is insufficient for modifying sk_user_data and
sk_data_ready.

Fixes: 675b453e0241 ("nvmet-tcp: enable TLS handshake upcall")
Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/nvme/target/tcp.c

index 12a5cb8641ca307ff4f2e88b686a68cc7e0f7a17..de70ff9102538a179747b7dda1a493c2132f91bb 100644 (file)
@@ -1967,10 +1967,10 @@ static void nvmet_tcp_alloc_queue(struct nvmet_tcp_port *port,
                struct sock *sk = queue->sock->sk;
 
                /* Restore the default callbacks before starting upcall */
-               read_lock_bh(&sk->sk_callback_lock);
+               write_lock_bh(&sk->sk_callback_lock);
                sk->sk_user_data = NULL;
                sk->sk_data_ready = port->data_ready;
-               read_unlock_bh(&sk->sk_callback_lock);
+               write_unlock_bh(&sk->sk_callback_lock);
                if (!nvmet_tcp_try_peek_pdu(queue)) {
                        if (!nvmet_tcp_tls_handshake(queue))
                                return;