Page MenuHomeFreeBSD

D33028.id.diff
No OneTemporary

D33028.id.diff

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)

File Metadata

Mime Type
text/plain
Expires
Fri, Mar 6, 11:52 AM (12 h, 23 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29310294
Default Alt Text
D33028.id.diff (2 KB)

Event Timeline