Fill NVMe specific path info
Subsystems (2)
PATCH v2 1/1 Fill NVMe specific path info
---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(+)
libmultipath/discovery.c +35 -0
@@ -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 ; }
libmultipath/hwtable.c +10 -0
@@ -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.
libmultipath/structs.h +1 -0
@@ -53,6 +53,7 @@ enum sysfs_buses {SYSFS_BUS_CCW ,SYSFS_BUS_CCISS ,SYSFS_BUS_RBD , + SYSFS_BUS_NVME, }; enum pathstates {
Signature · 1 line
2.5.5
Benjamin Marzinski
maintainerACK
-Ben
Quoted 114 lines · Keith Busch
Signed-off-by Keith Busch <[email protected]>---
v1->v2:
Removed explicitly setting the wwid path information. We get that with through exported udev attributes.Added default
retain_hwhandlerto 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(+)libmultipath/discovery.c +35
-0@@ -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 ; }libmultipath/hwtable.c +10
-0@@ -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. libmultipath/structs.h +1
-0@@ -53,6 +53,7 @@ enum sysfs_buses {SYSFS_BUS_CCW ,SYSFS_BUS_CCISS ,SYSFS_BUS_RBD , + SYSFS_BUS_NVME, }; enum pathstates {Signature · 6 lines
2.5.5 -- dm-devel mailing list [email protected] https://www.redhat.com/mailman/listinfo/dm-devel
On 02/21/2017 11:12 PM, Keith Busch wrote:
multipath-tools project does not use Patchwork.
CC: Christophe Varoqui
Quoted 108 lines
Signed-off-by Keith Busch <[email protected]>---
v1->v2:
Removed explicitly setting the wwid path information. We get that with through exported udev attributes.Added default
retain_hwhandlerto 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(+)libmultipath/discovery.c +35
-0@@ -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 ; }libmultipath/hwtable.c +10
-0@@ -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. libmultipath/structs.h +1
-0@@ -53,6 +53,7 @@ enum sysfs_buses {SYSFS_BUS_CCW ,SYSFS_BUS_CCISS ,SYSFS_BUS_RBD , + SYSFS_BUS_NVME, }; enum pathstates {
Quoted 8 lines · Keith Busch
libmultipath/hwtable.c +0
-0@@ -1073,6 +1073,16 @@ static struct hwentry default_hw[] = { .prio_name = PRIO_ALUA, .no_path_retry = 30, },
libmultipath/hwtable.c static struct hwentry default_hw[] = { · line 1085
Quoted 10 lines
libmultipath/hwtable.c +10
-0+/* +* Generic NVMe devices +*/ + { + .vendor = "NVME", + .product = ".*", + .uid_attribute = "ID_WWN", + .checker_name = DIRECTIO, + .retain_hwhandler = RETAIN_HWHANDLER_OFF, + },
"NVME" is a too generic regex, could it be replaced by "^NVME" ?
Thanks.
Quoted 8 lines · Keith Busch
libmultipath/hwtable.c +0
-0@@ -1073,6 +1073,16 @@ static struct hwentry default_hw[] = { .prio_name = PRIO_ALUA, .no_path_retry = 30, },
libmultipath/hwtable.c static struct hwentry default_hw[] = { · line 1085
Quoted 10 lines
libmultipath/hwtable.c +10
-0+/* +* Generic NVMe devices +*/ + { + .vendor = "NVME", + .product = ".*", + .uid_attribute = "ID_WWN", + .checker_name = DIRECTIO, + .retain_hwhandler = RETAIN_HWHANDLER_OFF, + },
Try #2.
"NVME" is a too generic regex, could it be replaced by "^NVME" and a "product name"?
Thanks.