diff --git a/sys/dev/nvme/nvme.c b/sys/dev/nvme/nvme.c --- a/sys/dev/nvme/nvme.c +++ b/sys/dev/nvme/nvme.c @@ -208,11 +208,10 @@ } void -nvme_notify_fail_consumers(struct nvme_controller *ctrlr) +nvme_notify_fail(struct nvme_controller *ctrlr) { - struct nvme_consumer *cons; - void *ctrlr_cookie; - uint32_t i; + device_t *children; + int n_children; /* * This controller failed during initialization (i.e. IDENTIFY @@ -223,15 +222,13 @@ if (!ctrlr->is_initialized) return; - for (i = 0; i < NVME_MAX_CONSUMERS; i++) { - cons = &nvme_consumer[i]; - if (cons->id != INVALID_CONSUMER_ID && - (ctrlr_cookie = ctrlr->cons_cookie[i]) != NULL) { - ctrlr->cons_cookie[i] = NULL; - if (cons->fail_fn != NULL) - cons->fail_fn(ctrlr_cookie); - } - } + if (device_get_children(ctrlr->dev, &children, &n_children) != 0) + return; + + for (int i = 0; i < n_children; i++) + NVMEC_FAIL(children[i]); + + free(children, M_TEMP); } struct nvme_consumer * diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -253,7 +253,7 @@ nvme_qpair_fail(&ctrlr->ioq[i]); } } - nvme_notify_fail_consumers(ctrlr); + nvme_notify_fail(ctrlr); } /* @@ -1672,7 +1672,7 @@ if (gone) nvme_ctrlr_fail(ctrlr, true); else - nvme_notify_fail_consumers(ctrlr); + nvme_notify_fail(ctrlr); for (i = 0; i < NVME_MAX_NAMESPACES; i++) nvme_ns_destruct(&ctrlr->ns[i]); diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h --- a/sys/dev/nvme/nvme_private.h +++ b/sys/dev/nvme/nvme_private.h @@ -559,7 +559,7 @@ const struct nvme_completion *async_cpl, uint32_t log_page_id, void *log_page_buffer, uint32_t log_page_size); -void nvme_notify_fail_consumers(struct nvme_controller *ctrlr); +void nvme_notify_fail(struct nvme_controller *ctrlr); void nvme_ctrlr_shared_handler(void *arg); void nvme_ctrlr_poll(struct nvme_controller *ctrlr);