From: keith.busch@intel.com (Keith Busch) Subject: [PATCHv2] Fill NVMe specific path info Date: Tue, 21 Feb 2017 17:12:31 -0500 [thread overview] Message-ID: <1487715151-1179-1-git-send-email-keith.busch@intel.com> (raw) Signed-off-by: Keith Busch <keith.busch at intel.com> --- v1->v2: Removed explicitly setting the wwid path information. We get that with through exported udev attributes. Added default retain_hwhandler to off for NVME devices. This has the kernel not call into scsi specific APIs that don't exist for NVMe. libmultipath/discovery.c | 35 +++++++++++++++++++++++++++++++++++ libmultipath/hwtable.c | 10 ++++++++++ libmultipath/structs.h | 1 + 3 files changed, 46 insertions(+) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index d1aec31..39dd92a 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -1187,6 +1187,36 @@ scsi_sysfs_pathinfo (struct path * pp, vector hwtable) } static int +nvme_sysfs_pathinfo (struct path * pp, vector hwtable) +{ + struct udev_device *parent, *nvme = NULL; + + parent = pp->udev; + while (parent) { + const char *subsys = udev_device_get_subsystem(parent); + + if (subsys && !strncmp(subsys, "nvme", 4)) { + nvme = parent; + break; + } + parent = udev_device_get_parent(parent); + } + if (!nvme) + return 1; + + snprintf(pp->vendor_id, SCSI_VENDOR_SIZE, "NVME"); + snprintf(pp->product_id, SCSI_PRODUCT_SIZE, "%s", udev_device_get_sysattr_value(nvme, "model")); + snprintf(pp->serial, SERIAL_SIZE, "%s", udev_device_get_sysattr_value(nvme, "serial")); + snprintf(pp->rev, SCSI_REV_SIZE, "%s", udev_device_get_sysattr_value(nvme, "firmware_rev")); + + condlog(3, "%s: vendor:%s product:%s serial:%s rev:%s", pp->dev, + pp->vendor_id, pp->product_id, pp->serial, pp->rev); + pp->hwe = find_hwe(hwtable, pp->vendor_id, pp->product_id, NULL); + + return 0; +} + +static int rbd_sysfs_pathinfo (struct path * pp, vector hwtable) { sprintf(pp->vendor_id, "Ceph"); @@ -1405,6 +1435,8 @@ sysfs_pathinfo(struct path * pp, vector hwtable) pp->bus = SYSFS_BUS_SCSI; if (!strncmp(pp->dev,"rbd", 3)) pp->bus = SYSFS_BUS_RBD; + if (!strncmp(pp->dev,"nvme", 4)) + pp->bus = SYSFS_BUS_NVME; if (pp->bus == SYSFS_BUS_UNDEF) return 0; @@ -1420,6 +1452,9 @@ sysfs_pathinfo(struct path * pp, vector hwtable) } else if (pp->bus == SYSFS_BUS_RBD) { if (rbd_sysfs_pathinfo(pp, hwtable)) return 1; + } else if (pp->bus == SYSFS_BUS_NVME) { + if (nvme_sysfs_pathinfo(pp, hwtable)) + return 1; } return 0; } diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c index f5a5f7b..8409261 100644 --- a/libmultipath/hwtable.c +++ b/libmultipath/hwtable.c @@ -1073,6 +1073,16 @@ static struct hwentry default_hw[] = { .prio_name = PRIO_ALUA, .no_path_retry = 30, }, + /* + * Generic NVMe devices + */ + { + .vendor = "NVME", + .product = ".*", + .uid_attribute = "ID_WWN", + .checker_name = DIRECTIO, + .retain_hwhandler = RETAIN_HWHANDLER_OFF, + }, #if 0 /* * Copy this TEMPLATE to add new hardware. diff --git a/libmultipath/structs.h b/libmultipath/structs.h index 6edd927..dfd65ae 100644 --- a/libmultipath/structs.h +++ b/libmultipath/structs.h @@ -53,6 +53,7 @@ enum sysfs_buses { SYSFS_BUS_CCW, SYSFS_BUS_CCISS, SYSFS_BUS_RBD, + SYSFS_BUS_NVME, }; enum pathstates { -- 2.5.5
WARNING: multiple messages have this Message-ID (diff)
From: Keith Busch <keith.busch@intel.com> To: dm-devel@redhat.com, linux-nvme@lists.infradead.org Cc: Keith Busch <keith.busch@intel.com> Subject: [PATCHv2] Fill NVMe specific path info Date: Tue, 21 Feb 2017 17:12:31 -0500 [thread overview] Message-ID: <1487715151-1179-1-git-send-email-keith.busch@intel.com> (raw) Signed-off-by: Keith Busch <keith.busch@intel.com> --- v1->v2: Removed explicitly setting the wwid path information. We get that with through exported udev attributes. Added default retain_hwhandler to off for NVME devices. This has the kernel not call into scsi specific APIs that don't exist for NVMe. libmultipath/discovery.c | 35 +++++++++++++++++++++++++++++++++++ libmultipath/hwtable.c | 10 ++++++++++ libmultipath/structs.h | 1 + 3 files changed, 46 insertions(+) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index d1aec31..39dd92a 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -1187,6 +1187,36 @@ scsi_sysfs_pathinfo (struct path * pp, vector hwtable) } static int +nvme_sysfs_pathinfo (struct path * pp, vector hwtable) +{ + struct udev_device *parent, *nvme = NULL; + + parent = pp->udev; + while (parent) { + const char *subsys = udev_device_get_subsystem(parent); + + if (subsys && !strncmp(subsys, "nvme", 4)) { + nvme = parent; + break; + } + parent = udev_device_get_parent(parent); + } + if (!nvme) + return 1; + + snprintf(pp->vendor_id, SCSI_VENDOR_SIZE, "NVME"); + snprintf(pp->product_id, SCSI_PRODUCT_SIZE, "%s", udev_device_get_sysattr_value(nvme, "model")); + snprintf(pp->serial, SERIAL_SIZE, "%s", udev_device_get_sysattr_value(nvme, "serial")); + snprintf(pp->rev, SCSI_REV_SIZE, "%s", udev_device_get_sysattr_value(nvme, "firmware_rev")); + + condlog(3, "%s: vendor:%s product:%s serial:%s rev:%s", pp->dev, + pp->vendor_id, pp->product_id, pp->serial, pp->rev); + pp->hwe = find_hwe(hwtable, pp->vendor_id, pp->product_id, NULL); + + return 0; +} + +static int rbd_sysfs_pathinfo (struct path * pp, vector hwtable) { sprintf(pp->vendor_id, "Ceph"); @@ -1405,6 +1435,8 @@ sysfs_pathinfo(struct path * pp, vector hwtable) pp->bus = SYSFS_BUS_SCSI; if (!strncmp(pp->dev,"rbd", 3)) pp->bus = SYSFS_BUS_RBD; + if (!strncmp(pp->dev,"nvme", 4)) + pp->bus = SYSFS_BUS_NVME; if (pp->bus == SYSFS_BUS_UNDEF) return 0; @@ -1420,6 +1452,9 @@ sysfs_pathinfo(struct path * pp, vector hwtable) } else if (pp->bus == SYSFS_BUS_RBD) { if (rbd_sysfs_pathinfo(pp, hwtable)) return 1; + } else if (pp->bus == SYSFS_BUS_NVME) { + if (nvme_sysfs_pathinfo(pp, hwtable)) + return 1; } return 0; } diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c index f5a5f7b..8409261 100644 --- a/libmultipath/hwtable.c +++ b/libmultipath/hwtable.c @@ -1073,6 +1073,16 @@ static struct hwentry default_hw[] = { .prio_name = PRIO_ALUA, .no_path_retry = 30, }, + /* + * Generic NVMe devices + */ + { + .vendor = "NVME", + .product = ".*", + .uid_attribute = "ID_WWN", + .checker_name = DIRECTIO, + .retain_hwhandler = RETAIN_HWHANDLER_OFF, + }, #if 0 /* * Copy this TEMPLATE to add new hardware. diff --git a/libmultipath/structs.h b/libmultipath/structs.h index 6edd927..dfd65ae 100644 --- a/libmultipath/structs.h +++ b/libmultipath/structs.h @@ -53,6 +53,7 @@ enum sysfs_buses { SYSFS_BUS_CCW, SYSFS_BUS_CCISS, SYSFS_BUS_RBD, + SYSFS_BUS_NVME, }; enum pathstates { -- 2.5.5
next reply other threads:[~2017-02-21 22:12 UTC|newest] Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-02-21 22:12 Keith Busch [this message] 2017-02-21 22:12 ` [PATCHv2] Fill NVMe specific path info Keith Busch 2017-02-22 0:01 ` [dm-devel] " Benjamin Marzinski 2017-02-22 0:01 ` Benjamin Marzinski 2017-02-22 1:00 ` Xose Vazquez Perez 2017-09-13 16:14 ` Xose Vazquez Perez 2018-01-10 16:07 ` Xose Vazquez Perez
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1487715151-1179-1-git-send-email-keith.busch@intel.com \ --to=keith.busch@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.