Commit a4c63447 authored by Alex Michon's avatar Alex Michon Committed by Konrad Sztyber
Browse files

bdev/nvme: Fix race between IO channel creation and reconnection



During a reconnection, we loop over all IO channels to delete the
qpairs. Then after a successful reconnection, we loop again over all IO
channels to recreate the qpairs.
However, if a user created a new IO channel in between these two steps,
it will create a new qpair that will get overridden during the second
loop.

Change-Id: Ifae52c991aa1175bcaa12ef5a4f0b7cc90ae6db1
Signed-off-by: default avatarAlex Michon <amichon@kalrayinc.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/25379


Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarChangpeng Liu <changpeliu@tencent.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
parent f220d590
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -2423,9 +2423,11 @@ bdev_nvme_reset_create_qpair(struct nvme_ctrlr_channel_iter *i,
{
	struct nvme_qpair *nvme_qpair = ctrlr_ch->qpair;
	struct spdk_nvme_qpair *qpair;
	int rc;
	int rc = 0;

	if (nvme_qpair->qpair == NULL) {
		rc = bdev_nvme_create_qpair(nvme_qpair);
	}
	if (rc == 0) {
		ctrlr_ch->connect_poller = SPDK_POLLER_REGISTER(bdev_nvme_reset_check_qpair_connected,
					   ctrlr_ch, 0);