diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index ddef7399b..ec60ce438 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -248,13 +248,16 @@ spdk_nvme_ctrlr_alloc_io_qpair(struct spdk_nvme_ctrlr *ctrlr, memcpy(&opts, user_opts, spdk_min(sizeof(opts), opts_size)); } + nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); if (nvme_ctrlr_get_cc(ctrlr, &cc)) { SPDK_ERRLOG("get_cc failed\n"); + nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); return NULL; } /* Only the low 2 bits (values 0, 1, 2, 3) of QPRIO are valid. */ if ((opts.qprio & 3) != opts.qprio) { + nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); return NULL; } @@ -264,11 +267,10 @@ spdk_nvme_ctrlr_alloc_io_qpair(struct spdk_nvme_ctrlr *ctrlr, */ if ((cc.bits.ams == SPDK_NVME_CC_AMS_RR) && (opts.qprio != SPDK_NVME_QPRIO_URGENT)) { SPDK_ERRLOG("invalid queue priority for default round robin arbitration method\n"); + nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); return NULL; } - nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); - /* * Get the first available I/O queue ID. */