aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/nvme
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2019-08-01 21:44:07 +0000
committerAlexander Motin <mav@FreeBSD.org>2019-08-01 21:44:07 +0000
commita7bf63be698c377070e5e7cc6e9315b958811529 (patch)
treeece6ac2023e87b503cb4f40da03af5eee115894d /sys/dev/nvme
parent57a44fcd34525d8bc73ab8511bddac7dfd9029e8 (diff)
downloadsrc-a7bf63be698c377070e5e7cc6e9315b958811529.tar.gz
src-a7bf63be698c377070e5e7cc6e9315b958811529.zip
Add IOCTL to translate nvdX into nvmeY and NSID.
While very useful by itself, it also makes `nvmecontrol` not depend on hardcoded device names parsing, that in its turn makes simple to take nvdX (and potentially any other) device names as arguments. Also added IOCTL bypass from nvdX to respective nvmeYnsZ makes them interchangeable for management purposes. MFC after: 2 weeks Sponsored by: iXsystems, Inc.
Notes
Notes: svn path=/head/; revision=350523
Diffstat (limited to 'sys/dev/nvme')
-rw-r--r--sys/dev/nvme/nvme.h9
-rw-r--r--sys/dev/nvme/nvme_ctrlr.c8
-rw-r--r--sys/dev/nvme/nvme_ns.c15
3 files changed, 32 insertions, 0 deletions
diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h
index 785a7031072c..2dfd5e481eea 100644
--- a/sys/dev/nvme/nvme.h
+++ b/sys/dev/nvme/nvme.h
@@ -40,6 +40,7 @@
#define NVME_PASSTHROUGH_CMD _IOWR('n', 0, struct nvme_pt_command)
#define NVME_RESET_CONTROLLER _IO('n', 1)
+#define NVME_GET_NSID _IOR('n', 2, struct nvme_get_nsid)
#define NVME_IO_TEST _IOWR('n', 100, struct nvme_io_test)
#define NVME_BIO_TEST _IOWR('n', 101, struct nvme_io_test)
@@ -1332,6 +1333,11 @@ struct nvme_pt_command {
struct mtx * driver_lock;
};
+struct nvme_get_nsid {
+ char cdev[SPECNAMELEN + 1];
+ uint32_t nsid;
+};
+
#define nvme_completion_is_error(cpl) \
(NVME_STATUS_GET_SC((cpl)->status) != 0 || NVME_STATUS_GET_SCT((cpl)->status) != 0)
@@ -1340,6 +1346,7 @@ void nvme_strvis(uint8_t *dst, const uint8_t *src, int dstlen, int srclen);
#ifdef _KERNEL
struct bio;
+struct thread;
struct nvme_namespace;
struct nvme_controller;
@@ -1429,6 +1436,8 @@ uint32_t nvme_ns_get_stripesize(struct nvme_namespace *ns);
int nvme_ns_bio_process(struct nvme_namespace *ns, struct bio *bp,
nvme_cb_fn_t cb_fn);
+int nvme_ns_ioctl_process(struct nvme_namespace *ns, u_long cmd,
+ caddr_t arg, int flag, struct thread *td);
/*
* Command building helper functions -- shared with CAM
diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c
index 7e2bbfa54375..b7604b61870f 100644
--- a/sys/dev/nvme/nvme_ctrlr.c
+++ b/sys/dev/nvme/nvme_ctrlr.c
@@ -1126,6 +1126,14 @@ nvme_ctrlr_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int flag,
pt = (struct nvme_pt_command *)arg;
return (nvme_ctrlr_passthrough_cmd(ctrlr, pt, le32toh(pt->cmd.nsid),
1 /* is_user_buffer */, 1 /* is_admin_cmd */));
+ case NVME_GET_NSID:
+ {
+ struct nvme_get_nsid *gnsid = (struct nvme_get_nsid *)arg;
+ strncpy(gnsid->cdev, device_get_nameunit(ctrlr->dev),
+ sizeof(gnsid->cdev));
+ gnsid->nsid = 0;
+ break;
+ }
default:
return (ENOTTY);
}
diff --git a/sys/dev/nvme/nvme_ns.c b/sys/dev/nvme/nvme_ns.c
index 55e8931cfd17..df38810dc663 100644
--- a/sys/dev/nvme/nvme_ns.c
+++ b/sys/dev/nvme/nvme_ns.c
@@ -82,6 +82,14 @@ nvme_ns_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int flag,
pt = (struct nvme_pt_command *)arg;
return (nvme_ctrlr_passthrough_cmd(ctrlr, pt, ns->id,
1 /* is_user_buffer */, 0 /* is_admin_cmd */));
+ case NVME_GET_NSID:
+ {
+ struct nvme_get_nsid *gnsid = (struct nvme_get_nsid *)arg;
+ strncpy(gnsid->cdev, device_get_nameunit(ctrlr->dev),
+ sizeof(gnsid->cdev));
+ gnsid->nsid = ns->id;
+ break;
+ }
case DIOCGMEDIASIZE:
*(off_t *)arg = (off_t)nvme_ns_get_size(ns);
break;
@@ -484,6 +492,13 @@ nvme_ns_bio_process(struct nvme_namespace *ns, struct bio *bp,
}
int
+nvme_ns_ioctl_process(struct nvme_namespace *ns, u_long cmd, caddr_t arg,
+ int flag, struct thread *td)
+{
+ return (nvme_ns_ioctl(ns->cdev, cmd, arg, flag, td));
+}
+
+int
nvme_ns_construct(struct nvme_namespace *ns, uint32_t id,
struct nvme_controller *ctrlr)
{