Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/nvd/nvd.c
Show First 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | |||||
static disk_ioctl_t nvd_ioctl; | static disk_ioctl_t nvd_ioctl; | ||||
static disk_strategy_t nvd_strategy; | static disk_strategy_t nvd_strategy; | ||||
static dumper_t nvd_dump; | static dumper_t nvd_dump; | ||||
static disk_getattr_t nvd_getattr; | static disk_getattr_t nvd_getattr; | ||||
static void nvd_done(void *arg, const struct nvme_completion *cpl); | static void nvd_done(void *arg, const struct nvme_completion *cpl); | ||||
static void nvd_gone(struct nvd_disk *ndisk); | static void nvd_gone(struct nvd_disk *ndisk); | ||||
static void *nvd_ns_change(struct nvme_namespace *ns, void *ctrlr); | |||||
static void *nvd_new_disk(struct nvme_namespace *ns, void *ctrlr); | static void *nvd_new_disk(struct nvme_namespace *ns, void *ctrlr); | ||||
static void *nvd_new_controller(struct nvme_controller *ctrlr); | static void *nvd_new_controller(struct nvme_controller *ctrlr); | ||||
static void nvd_controller_fail(void *ctrlr); | static void nvd_controller_fail(void *ctrlr); | ||||
static int nvd_load(void); | static int nvd_load(void); | ||||
static void nvd_unload(void); | static void nvd_unload(void); | ||||
▲ Show 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
if (!nvme_use_nvd) | if (!nvme_use_nvd) | ||||
return 0; | return 0; | ||||
mtx_init(&nvd_lock, "nvd_lock", NULL, MTX_DEF); | mtx_init(&nvd_lock, "nvd_lock", NULL, MTX_DEF); | ||||
TAILQ_INIT(&ctrlr_head); | TAILQ_INIT(&ctrlr_head); | ||||
TAILQ_INIT(&disk_head); | TAILQ_INIT(&disk_head); | ||||
consumer_handle = nvme_register_consumer(nvd_new_disk, | consumer_handle = nvme_register_consumer(nvd_ns_change, | ||||
nvd_new_controller, NULL, nvd_controller_fail); | nvd_new_controller, NULL, nvd_controller_fail); | ||||
return (consumer_handle != NULL ? 0 : -1); | return (consumer_handle != NULL ? 0 : -1); | ||||
} | } | ||||
static void | static void | ||||
nvd_unload() | nvd_unload() | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 238 Lines • ▼ Show 20 Lines | nvd_new_controller(struct nvme_controller *ctrlr) | ||||
nvd_ctrlr->ctrlr = ctrlr; | nvd_ctrlr->ctrlr = ctrlr; | ||||
TAILQ_INIT(&nvd_ctrlr->disk_head); | TAILQ_INIT(&nvd_ctrlr->disk_head); | ||||
mtx_lock(&nvd_lock); | mtx_lock(&nvd_lock); | ||||
TAILQ_INSERT_TAIL(&ctrlr_head, nvd_ctrlr, tailq); | TAILQ_INSERT_TAIL(&ctrlr_head, nvd_ctrlr, tailq); | ||||
mtx_unlock(&nvd_lock); | mtx_unlock(&nvd_lock); | ||||
return (nvd_ctrlr); | return (nvd_ctrlr); | ||||
} | |||||
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_ns_change(struct nvme_namespace *ns, void *ctrlr_arg) | |||||
{ | |||||
struct nvd_disk *ndisk; | |||||
struct nvd_controller *ctrlr = ctrlr_arg; | |||||
if (ns->flags & NVME_NS_FLAG_CHANGED) { | |||||
mtx_lock(&nvd_lock); | |||||
TAILQ_FOREACH(ndisk, &ctrlr->disk_head, ctrlr_tailq) { | |||||
if (ndisk->ns->id == ns->id) { | |||||
nvd_resize(ndisk); | |||||
} | |||||
} | |||||
mtx_unlock(&nvd_lock); | |||||
return (ctrlr_arg); | |||||
} | |||||
nvd_new_disk(ns, ctrlr_arg); | |||||
return (ctrlr_arg); | |||||
} | } | ||||
static void * | static void * | ||||
nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) | nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) | ||||
{ | { | ||||
uint8_t descr[NVME_MODEL_NUMBER_LENGTH+1]; | uint8_t descr[NVME_MODEL_NUMBER_LENGTH+1]; | ||||
struct nvd_disk *ndisk, *tnd; | struct nvd_disk *ndisk, *tnd; | ||||
struct disk *disk; | struct disk *disk; | ||||
▲ Show 20 Lines • Show All 99 Lines • Show Last 20 Lines |