summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvd
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2013-07-19 21:40:57 +0000
committerjimharris <jimharris@FreeBSD.org>2013-07-19 21:40:57 +0000
commit52bfa150c78aa1855a2cc5fccfc5beb84f57b16d (patch)
treeaf2bfcd29c3c4b521e2556f71dfd744f3a8c6df2 /sys/dev/nvd
parent0ccd4d5781fdb67fda3917d5ffccf80806d0d9fb (diff)
downloadFreeBSD-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')
-rw-r--r--sys/dev/nvd/nvd.c37
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);
OpenPOWER on IntegriCloud