diff options
author | jimharris <jimharris@FreeBSD.org> | 2013-07-19 21:40:57 +0000 |
---|---|---|
committer | jimharris <jimharris@FreeBSD.org> | 2013-07-19 21:40:57 +0000 |
commit | 52bfa150c78aa1855a2cc5fccfc5beb84f57b16d (patch) | |
tree | af2bfcd29c3c4b521e2556f71dfd744f3a8c6df2 /sys/dev/nvd/nvd.c | |
parent | 0ccd4d5781fdb67fda3917d5ffccf80806d0d9fb (diff) | |
download | FreeBSD-src-52bfa150c78aa1855a2cc5fccfc5beb84f57b16d.zip FreeBSD-src-52bfa150c78aa1855a2cc5fccfc5beb84f57b16d.tar.gz |
Add message when nvd disks are attached and detached.
As part of this commit, add an nvme_strvis() function which borrows
heavily from cam_strvis(). This will allow stripping of
leading/trailing whitespace and also handle unprintable characters
in model/serial numbers. This function goes into a new nvme_util.c
file which is used by both the driver and nvmecontrol.
Sponsored by: Intel
Reviewed by: carl
MFC after: 3 days
Diffstat (limited to 'sys/dev/nvd/nvd.c')
-rw-r--r-- | sys/dev/nvd/nvd.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/sys/dev/nvd/nvd.c b/sys/dev/nvd/nvd.c index 1bde1ca..b2e880b 100644 --- a/sys/dev/nvd/nvd.c +++ b/sys/dev/nvd/nvd.c @@ -40,6 +40,8 @@ __FBSDID("$FreeBSD$"); #include <dev/nvme/nvme.h> +#define NVD_STR "nvd" + struct nvd_disk; static disk_ioctl_t nvd_ioctl; @@ -102,7 +104,7 @@ static int nvd_modevent(module_t mod, int type, void *arg) } moduledata_t nvd_mod = { - "nvd", + NVD_STR, (modeventhand_t)nvd_modevent, 0 }; @@ -271,6 +273,7 @@ nvd_new_controller(struct nvme_controller *ctrlr) static void * nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) { + uint8_t descr[NVME_MODEL_NUMBER_LENGTH+1]; struct nvd_disk *ndisk; struct disk *disk; struct nvd_controller *ctrlr = ctrlr_arg; @@ -280,7 +283,7 @@ nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) disk = disk_alloc(); disk->d_strategy = nvd_strategy; disk->d_ioctl = nvd_ioctl; - disk->d_name = "nvd"; + disk->d_name = NVD_STR; disk->d_drv1 = ndisk; disk->d_maxsize = nvme_ns_get_max_io_xfer_size(ns); @@ -310,12 +313,14 @@ nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) * d_ident and d_descr are both far bigger than the length of either * the serial or model number strings. */ - strlcpy(disk->d_ident, nvme_ns_get_serial_number(ns), - min(sizeof(disk->d_ident), NVME_SERIAL_NUMBER_LENGTH)); + nvme_strvis(disk->d_ident, nvme_ns_get_serial_number(ns), + sizeof(disk->d_ident), NVME_SERIAL_NUMBER_LENGTH); + + nvme_strvis(descr, nvme_ns_get_model_number(ns), sizeof(descr), + NVME_MODEL_NUMBER_LENGTH); #if __FreeBSD_version >= 900034 - strlcpy(disk->d_descr, nvme_ns_get_model_number(ns), - min(sizeof(disk->d_descr), NVME_MODEL_NUMBER_LENGTH)); + strlcpy(disk->d_descr, descr, sizeof(descr)); #endif ndisk->ns = ns; @@ -335,15 +340,27 @@ nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) disk_create(disk, DISK_VERSION); + printf(NVD_STR"%u: <%s> NVMe namespace\n", disk->d_unit, descr); + 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); + return (NULL); } static void destroy_geom_disk(struct nvd_disk *ndisk) { - struct bio *bp; + struct bio *bp; + struct disk *disk; + uint32_t unit; + int cnt = 0; + disk = ndisk->disk; + unit = disk->d_unit; taskqueue_free(ndisk->tq); + disk_destroy(ndisk->disk); mtx_lock(&ndisk->bioqlock); @@ -354,9 +371,13 @@ destroy_geom_disk(struct nvd_disk *ndisk) bp->bio_error = EIO; bp->bio_flags |= BIO_ERROR; bp->bio_resid = bp->bio_bcount; - + cnt++; biodone(bp); } + + printf(NVD_STR"%u: lost device - %d outstanding\n", unit, cnt); + printf(NVD_STR"%u: removing device entry\n", unit); + mtx_unlock(&ndisk->bioqlock); mtx_destroy(&ndisk->bioqlock); |