diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 375538eaa..0e3fdeae3 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1223,6 +1223,15 @@ out: nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); + if (!ctrlr->cdata.oaes.ns_attribute_notices) { + /* + * If controller doesn't support ns_attribute_notices and + * namespace attributes change (e.g. number of namespaces) + * we need to update system handling device reset. + */ + nvme_io_msg_ctrlr_update(ctrlr); + } + return rc; } @@ -2066,6 +2075,7 @@ nvme_ctrlr_async_event_cb(void *arg, const struct spdk_nvme_cpl *cpl) return; } nvme_ctrlr_update_namespaces(ctrlr); + nvme_io_msg_ctrlr_update(ctrlr); } active_proc = nvme_ctrlr_get_current_process(ctrlr); diff --git a/lib/nvme/nvme_cuse.c b/lib/nvme/nvme_cuse.c index a3f81c861..9a5ee1f0d 100644 --- a/lib/nvme/nvme_cuse.c +++ b/lib/nvme/nvme_cuse.c @@ -1006,6 +1006,7 @@ nvme_cuse_update(struct spdk_nvme_ctrlr *ctrlr) static struct nvme_io_msg_producer cuse_nvme_io_msg_producer = { .name = "cuse", .stop = nvme_cuse_stop, + .update = nvme_cuse_update, }; int diff --git a/lib/nvme/nvme_io_msg.c b/lib/nvme/nvme_io_msg.c index f43e3217d..fb5aec3d4 100644 --- a/lib/nvme/nvme_io_msg.c +++ b/lib/nvme/nvme_io_msg.c @@ -164,6 +164,17 @@ nvme_io_msg_ctrlr_register(struct spdk_nvme_ctrlr *ctrlr, return 0; } +void +nvme_io_msg_ctrlr_update(struct spdk_nvme_ctrlr *ctrlr) +{ + struct nvme_io_msg_producer *io_msg_producer; + + /* Update all producers */ + STAILQ_FOREACH(io_msg_producer, &ctrlr->io_producers, link) { + io_msg_producer->update(ctrlr); + } +} + void nvme_io_msg_ctrlr_detach(struct spdk_nvme_ctrlr *ctrlr) { diff --git a/lib/nvme/nvme_io_msg.h b/lib/nvme/nvme_io_msg.h index ccf298cc2..9c18261d5 100644 --- a/lib/nvme/nvme_io_msg.h +++ b/lib/nvme/nvme_io_msg.h @@ -52,6 +52,7 @@ struct spdk_nvme_io_msg { struct nvme_io_msg_producer { const char *name; + void (*update)(struct spdk_nvme_ctrlr *ctrlr); void (*stop)(struct spdk_nvme_ctrlr *ctrlr); STAILQ_ENTRY(nvme_io_msg_producer) link; }; @@ -84,5 +85,6 @@ int nvme_io_msg_ctrlr_register(struct spdk_nvme_ctrlr *ctrlr, void nvme_io_msg_ctrlr_unregister(struct spdk_nvme_ctrlr *ctrlr, struct nvme_io_msg_producer *io_msg_producer); void nvme_io_msg_ctrlr_detach(struct spdk_nvme_ctrlr *ctrlr); +void nvme_io_msg_ctrlr_update(struct spdk_nvme_ctrlr *ctrlr); #endif /* SPDK_NVME_IO_MSG_H_ */ diff --git a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c index 36e03a292..5e20fae45 100644 --- a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c +++ b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c @@ -70,6 +70,7 @@ DEFINE_STUB_V(nvme_ns_set_identify_data, (struct spdk_nvme_ns *ns)); DEFINE_STUB_V(nvme_qpair_abort_reqs, (struct spdk_nvme_qpair *qpair, uint32_t dnr)); DEFINE_STUB(spdk_nvme_poll_group_remove, int, (struct spdk_nvme_poll_group *group, struct spdk_nvme_qpair *qpair), 0); +DEFINE_STUB_V(nvme_io_msg_ctrlr_update, (struct spdk_nvme_ctrlr *ctrlr)); struct spdk_nvme_ctrlr *nvme_transport_ctrlr_construct(const struct spdk_nvme_transport_id *trid, const struct spdk_nvme_ctrlr_opts *opts,