nvmet-tcp: use 'spin_lock_bh' for state_lock()
authorHannes Reinecke <hare@suse.de>
Thu, 12 Oct 2023 12:59:54 +0000 (14:59 +0200)
committerKeith Busch <kbusch@kernel.org>
Tue, 17 Oct 2023 20:57:54 +0000 (13:57 -0700)
nvmet_tcp_schedule_release_queue() is called from socket state
change callbacks, which may be called from an softirq context.
So use 'spin_lock_bh' to avoid a spin lock warning.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/tcp.c

index 0dc3b75de7b62d6ce5255dc1093c44c6c3e253c3..4336fe048e4305ab736f76c72a9b94abaab78b26 100644 (file)
@@ -1379,7 +1379,7 @@ static void nvmet_tcp_release_queue(struct kref *kref)
 
 static void nvmet_tcp_schedule_release_queue(struct nvmet_tcp_queue *queue)
 {
-       spin_lock(&queue->state_lock);
+       spin_lock_bh(&queue->state_lock);
        if (queue->state == NVMET_TCP_Q_TLS_HANDSHAKE) {
                /* Socket closed during handshake */
                tls_handshake_cancel(queue->sock->sk);
@@ -1388,7 +1388,7 @@ static void nvmet_tcp_schedule_release_queue(struct nvmet_tcp_queue *queue)
                queue->state = NVMET_TCP_Q_DISCONNECTING;
                kref_put(&queue->kref, nvmet_tcp_release_queue);
        }
-       spin_unlock(&queue->state_lock);
+       spin_unlock_bh(&queue->state_lock);
 }
 
 static inline void nvmet_tcp_arm_queue_deadline(struct nvmet_tcp_queue *queue)