Index: sys/dev/nvd/nvd.c =================================================================== --- sys/dev/nvd/nvd.c +++ sys/dev/nvd/nvd.c @@ -65,6 +65,9 @@ static void *nvd_new_disk(struct nvme_namespace *ns, void *ctrlr); static void *nvd_new_controller(struct nvme_controller *ctrlr); +static void nvd_controller_async(void *ctrlr_arg, + const struct nvme_completion *async_cpl, + uint32_t log_page_id, void *log_page_buffer, uint32_t log_page_size); static void nvd_controller_fail(void *ctrlr); static int nvd_load(void); @@ -157,7 +160,7 @@ TAILQ_INIT(&disk_head); consumer_handle = nvme_register_consumer(nvd_new_disk, - nvd_new_controller, NULL, nvd_controller_fail); + nvd_new_controller, nvd_controller_async, nvd_controller_fail); return (consumer_handle != NULL ? 0 : -1); } @@ -264,6 +267,28 @@ mtx_unlock(&ndisk->bioqlock); } +static void +nvd_resize(struct nvd_disk *ndisk) +{ + struct disk *disk = ndisk->disk; + struct nvme_namespace *ns = ndisk->ns; + + disk->d_sectorsize = nvme_ns_get_sector_size(ns); + disk->d_mediasize = (off_t)nvme_ns_get_size(ns); + disk->d_maxsize = nvme_ns_get_max_io_xfer_size(ns); + disk->d_delmaxsize = (off_t)nvme_ns_get_size(ns); + if (disk->d_delmaxsize > nvd_delete_max) + disk->d_delmaxsize = nvd_delete_max; + + disk_resize(disk, M_NOWAIT); + + printf(NVD_STR"%u: NVMe namespace resized\n", ndisk->unit); + printf(NVD_STR"%u: %juMB (%ju %u byte sectors)\n", disk->d_unit, + (uintmax_t)disk->d_mediasize / (1024*1024), + (uintmax_t)disk->d_mediasize / disk->d_sectorsize, + disk->d_sectorsize); +} + static void nvd_gonecb(struct disk *dp) { @@ -502,6 +527,24 @@ return (ndisk); } +static void +nvd_controller_async(void *ctrlr_arg, const struct nvme_completion *async_cpl, + uint32_t log_page_id, void *log_page_buffer, uint32_t log_page_size) +{ + struct nvd_controller *ctrlr = ctrlr_arg; + struct nvd_disk *ndisk; + + switch (log_page_id) { + case NVME_LOG_CHANGED_NAMESPACE: + mtx_lock(&nvd_lock); + TAILQ_FOREACH(ndisk, &ctrlr->disk_head, ctrlr_tailq) + nvd_resize(ndisk); + mtx_unlock(&nvd_lock); + break; + default: + break; + } +} static void nvd_controller_fail(void *ctrlr_arg)