You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.3 KiB
120 lines
3.3 KiB
--- |
|
libmultipath/print.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++- |
|
1 file changed, 83 insertions(+), 1 deletion(-) |
|
|
|
Index: multipath-tools-130222/libmultipath/print.c |
|
=================================================================== |
|
--- multipath-tools-130222.orig/libmultipath/print.c |
|
+++ multipath-tools-130222/libmultipath/print.c |
|
@@ -10,6 +10,7 @@ |
|
#include <unistd.h> |
|
#include <string.h> |
|
#include <errno.h> |
|
+#include <libudev.h> |
|
|
|
#include "checkers.h" |
|
#include "vector.h" |
|
@@ -44,7 +45,7 @@ |
|
* information printing helpers |
|
*/ |
|
static int |
|
-snprint_str (char * buff, size_t len, char * str) |
|
+snprint_str (char * buff, size_t len, const char * str) |
|
{ |
|
return snprintf(buff, len, "%s", str); |
|
} |
|
@@ -432,6 +433,83 @@ snprint_path_mpp (char * buff, size_t le |
|
} |
|
|
|
static int |
|
+snprint_host_attr (char * buff, size_t len, struct path * pp, char *attr) |
|
+{ |
|
+ struct udev_device *host_dev = NULL; |
|
+ char host_id[32]; |
|
+ const char *value = NULL; |
|
+ int ret; |
|
+ |
|
+ if (pp->sg_id.proto_id != SCSI_PROTOCOL_FCP) |
|
+ return snprintf(buff, len, "[undef]"); |
|
+ sprintf(host_id, "host%d", pp->sg_id.host_no); |
|
+ host_dev = udev_device_new_from_subsystem_sysname(conf->udev, "fc_host", |
|
+ host_id); |
|
+ if (!host_dev) { |
|
+ condlog(1, "%s: No fc_host device for '%s'", pp->dev, host_id); |
|
+ goto out; |
|
+ } |
|
+ value = udev_device_get_sysattr_value(host_dev, attr); |
|
+ if (value) |
|
+ ret = snprint_str(buff, len, value); |
|
+ udev_device_unref(host_dev); |
|
+out: |
|
+ if (!value) |
|
+ ret = snprintf(buff, len, "[unknown]"); |
|
+ return ret; |
|
+} |
|
+ |
|
+static int |
|
+snprint_host_wwnn (char * buff, size_t len, struct path * pp) |
|
+{ |
|
+ return snprint_host_attr(buff, len, pp, "node_name"); |
|
+} |
|
+ |
|
+static int |
|
+snprint_host_wwpn (char * buff, size_t len, struct path * pp) |
|
+{ |
|
+ return snprint_host_attr(buff, len, pp, "port_name"); |
|
+} |
|
+ |
|
+static int |
|
+snprint_tgt_wwpn (char * buff, size_t len, struct path * pp) |
|
+{ |
|
+ struct udev_device *rport_dev = NULL; |
|
+ char rport_id[32]; |
|
+ const char *value = NULL; |
|
+ int ret; |
|
+ |
|
+ if (pp->sg_id.proto_id != SCSI_PROTOCOL_FCP) |
|
+ return snprintf(buff, len, "[undef]"); |
|
+ sprintf(rport_id, "rport-%d:%d-%d", |
|
+ pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.transport_id); |
|
+ rport_dev = udev_device_new_from_subsystem_sysname(conf->udev, |
|
+ "fc_remote_ports", rport_id); |
|
+ if (!rport_dev) { |
|
+ condlog(1, "%s: No fc_remote_port device for '%s'", pp->dev, |
|
+ rport_id); |
|
+ goto out; |
|
+ } |
|
+ value = udev_device_get_sysattr_value(rport_dev, "port_name"); |
|
+ if (value) |
|
+ ret = snprint_str(buff, len, value); |
|
+ udev_device_unref(rport_dev); |
|
+out: |
|
+ if (!value) |
|
+ ret = snprintf(buff, len, "[unknown]"); |
|
+ return ret; |
|
+} |
|
+ |
|
+ |
|
+static int |
|
+snprint_tgt_wwnn (char * buff, size_t len, struct path * pp) |
|
+{ |
|
+ if (pp->tgt_node_name[0] == '\0') |
|
+ return snprintf(buff, len, "[undef]"); |
|
+ return snprint_str(buff, len, pp->tgt_node_name); |
|
+} |
|
+ |
|
+static int |
|
snprint_path_checker (char * buff, size_t len, struct path * pp) |
|
{ |
|
struct checker * c = &pp->checker; |
|
@@ -475,6 +553,10 @@ struct path_data pd[] = { |
|
{'S', "size", 0, snprint_path_size}, |
|
{'z', "serial", 0, snprint_path_serial}, |
|
{'m', "multipath", 0, snprint_path_mpp}, |
|
+ {'N', "host WWNN", 0, snprint_host_wwnn}, |
|
+ {'n', "target WWNN", 0, snprint_tgt_wwnn}, |
|
+ {'R', "host WWPN", 0, snprint_host_wwpn}, |
|
+ {'r', "target WWPN", 0, snprint_tgt_wwpn}, |
|
{0, NULL, 0 , NULL} |
|
}; |
|
|
|
|