mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 16:10:02 +02:00
nvmet-rdma: fix queue leak when connect backlog is exceeded
When pending disconnecting queues exceed the backlog limit, the
connect path only drops the device reference and leaks the newly
allocated queue and its IB resources.
Fixes: badc53620f ("nvme: target: rdma: fix ndev refcount leak on queue connect")
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Xixin Liu <liuxixin@kylinos.cn>
Signed-off-by: Keith Busch <kbusch@kernel.org>
This commit is contained in:
parent
58e7c13c8f
commit
fb1ed67788
|
|
@ -1627,19 +1627,13 @@ static int nvmet_rdma_queue_connect(struct rdma_cm_id *cm_id,
|
|||
mutex_unlock(&nvmet_rdma_queue_mutex);
|
||||
if (pending > NVMET_RDMA_BACKLOG) {
|
||||
ret = NVME_SC_CONNECT_CTRL_BUSY;
|
||||
goto put_device;
|
||||
goto free_queue;
|
||||
}
|
||||
}
|
||||
|
||||
ret = nvmet_rdma_cm_accept(cm_id, queue, &event->param.conn);
|
||||
if (ret) {
|
||||
/*
|
||||
* Don't destroy the cm_id in free path, as we implicitly
|
||||
* destroy the cm_id here with non-zero ret code.
|
||||
*/
|
||||
queue->cm_id = NULL;
|
||||
if (ret)
|
||||
goto free_queue;
|
||||
}
|
||||
|
||||
mutex_lock(&nvmet_rdma_queue_mutex);
|
||||
list_add_tail(&queue->queue_list, &nvmet_rdma_queue_list);
|
||||
|
|
@ -1648,6 +1642,11 @@ static int nvmet_rdma_queue_connect(struct rdma_cm_id *cm_id,
|
|||
return 0;
|
||||
|
||||
free_queue:
|
||||
/*
|
||||
* Don't destroy the cm_id in free path, as we implicitly
|
||||
* destroy the cm_id here with non-zero ret code.
|
||||
*/
|
||||
queue->cm_id = NULL;
|
||||
nvmet_rdma_free_queue(queue);
|
||||
put_device:
|
||||
kref_put(&ndev->ref, nvmet_rdma_free_dev);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user