nvmf: ensure that destroying qpairs have a state_cb
It appears that we can get caught in a loop when shutting down a subsystem if there is a qpair that has been moved to the deactivating state due to the target shutting down early. These qpairs don't have a state cb and won't ever be destroyed or removed from the global list. Change-Id: I4f9ed774a94e0e2c7ff7bfa3af1776b38a787035 Signed-off-by: Seth Howell <seth.howell@intel.com> Reviewed-on: https://review.gerrithub.io/419269 Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
8a5a15b876
commit
a28a5c8ff7
@ -669,6 +669,17 @@ _spdk_nvmf_qpair_deactivate(void *ctx)
|
||||
struct nvmf_qpair_disconnect_ctx *qpair_ctx = ctx;
|
||||
struct spdk_nvmf_qpair *qpair = qpair_ctx->qpair;
|
||||
|
||||
/* Check for outstanding I/O */
|
||||
if (!TAILQ_EMPTY(&qpair->outstanding)) {
|
||||
if (qpair->state_cb != NULL) {
|
||||
qpair->state_cb = _spdk_nvmf_qpair_destroy;
|
||||
qpair->state_cb_arg = qpair_ctx;
|
||||
} else {
|
||||
free(qpair_ctx);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (qpair->state == SPDK_NVMF_QPAIR_DEACTIVATING ||
|
||||
qpair->state == SPDK_NVMF_QPAIR_INACTIVE) {
|
||||
/* This can occur if the connection is killed by the target,
|
||||
@ -684,13 +695,6 @@ _spdk_nvmf_qpair_deactivate(void *ctx)
|
||||
assert(qpair->state == SPDK_NVMF_QPAIR_ACTIVE);
|
||||
qpair->state = SPDK_NVMF_QPAIR_DEACTIVATING;
|
||||
|
||||
/* Check for outstanding I/O */
|
||||
if (!TAILQ_EMPTY(&qpair->outstanding)) {
|
||||
qpair->state_cb = _spdk_nvmf_qpair_destroy;
|
||||
qpair->state_cb_arg = qpair_ctx;
|
||||
return;
|
||||
}
|
||||
|
||||
_spdk_nvmf_qpair_destroy(qpair_ctx, 0);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user