Commit d478b20d authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Ben Walker
Browse files

lib/nvmf: Update spdk_nvmf_qpair_disconnect return value



If the qpair is already in the process of disconnect,
the spdk_nvmf_qpair_disconnect API now return -EINPROGRESS
and doesn't call the callback passed by the user.

Signed-off-by: default avatarAlexey Marchuk <alexeymar@nvidia.com>
Change-Id: If996b0496bf15729654d18771756b736e41812ae
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17164


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarMichael Haeuptle <michaelhaeuptle@gmail.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 0496a2af
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright (C) 2016 Intel Corporation. All rights reserved.
 *   Copyright (c) 2018-2021 Mellanox Technologies LTD. All rights reserved.
 *   Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 *   Copyright (c) 2021, 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 */

/** \file
@@ -296,6 +296,7 @@ typedef void (*nvmf_qpair_disconnect_cb)(void *ctx);
 *
 * \return 0 upon success.
 * \return -ENOMEM if the function specific context could not be allocated.
 * \return -EINPROGRESS if the qpair is already in the process of disconnect.
 */
int spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn,
			       void *ctx);
+8 −4
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright (C) 2017 Intel Corporation. All rights reserved.
 *   Copyright (c) 2019, 2020 Mellanox Technologies LTD. All rights reserved.
 *   Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 *   Copyright (c) 2021, 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 */

#include "spdk/stdinc.h"
@@ -131,11 +131,15 @@ _nvmf_ctrlr_disconnect_qpairs_on_pg(struct spdk_io_channel_iter *i, bool include
		if (qpair->ctrlr == ctrlr && (include_admin || !nvmf_qpair_is_admin_queue(qpair))) {
			rc = spdk_nvmf_qpair_disconnect(qpair, NULL, NULL);
			if (rc) {
				if (rc == -EINPROGRESS) {
					rc = 0;
				} else {
					SPDK_ERRLOG("Qpair disconnect failed\n");
					return rc;
				}
			}
		}
	}

	return rc;
}
@@ -1001,7 +1005,7 @@ nvmf_ctrlr_association_remove(void *ctx)

	if (ctrlr->admin_qpair) {
		rc = spdk_nvmf_qpair_disconnect(ctrlr->admin_qpair, NULL, NULL);
		if (rc < 0) {
		if (rc < 0 && rc != -EINPROGRESS) {
			SPDK_ERRLOG("Fail to disconnect admin ctrlr qpair\n");
			assert(false);
		}
+3 −6
Original line number Diff line number Diff line
@@ -231,7 +231,7 @@ _nvmf_tgt_disconnect_qpairs(void *ctx)

	TAILQ_FOREACH_SAFE(qpair, &group->qpairs, link, qpair_tmp) {
		rc = spdk_nvmf_qpair_disconnect(qpair, NULL, NULL);
		if (rc) {
		if (rc && rc != -EINPROGRESS) {
			break;
		}
	}
@@ -1249,10 +1249,7 @@ spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_
	struct nvmf_qpair_disconnect_ctx *qpair_ctx;

	if (__atomic_test_and_set(&qpair->disconnect_started, __ATOMIC_RELAXED)) {
		if (cb_fn) {
			cb_fn(ctx);
		}
		return 0;
		return -EINPROGRESS;
	}

	/* If we get a qpair in the uninitialized state, we can just destroy it immediately */
@@ -1595,7 +1592,7 @@ nvmf_poll_group_remove_subsystem_msg(void *ctx)
		if ((qpair->ctrlr != NULL) && (qpair->ctrlr->subsys == subsystem)) {
			qpairs_found = true;
			rc = spdk_nvmf_qpair_disconnect(qpair, NULL, NULL);
			if (rc) {
			if (rc && rc != -EINPROGRESS) {
				break;
			}
		}