summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extras/path_id/path_id.c35
-rw-r--r--rules/rules.d/60-persistent-storage.rules4
2 files changed, 36 insertions, 3 deletions
diff --git a/extras/path_id/path_id.c b/extras/path_id/path_id.c
index ce12e92c82..379334f02f 100644
--- a/extras/path_id/path_id.c
+++ b/extras/path_id/path_id.c
@@ -136,7 +136,40 @@ out:
static struct udev_device *handle_fc(struct udev_device *parent, char **path)
{
- path_prepend(path, "fc-PATH_ID_NOT_IMPLEMENTED");
+ struct udev *udev = udev_device_get_udev(parent);
+ struct udev_device *targetdev = NULL;
+ char *syspath = NULL;
+ struct udev_device *fcdev;
+ const char *port;
+ unsigned int lun;
+
+ targetdev = udev_device_get_parent_with_subsystem_devtype(parent, "scsi", "scsi_target");
+ if (targetdev == NULL) {
+ parent = NULL;
+ goto out;
+ }
+
+ if (asprintf(&syspath, "%s/fc_transport/%s", udev_device_get_syspath(targetdev), udev_device_get_sysname(targetdev)) < 0) {
+ parent = NULL;
+ goto out;
+ }
+ fcdev = udev_device_new_from_syspath(udev, syspath);
+ if (fcdev == NULL) {
+ parent = NULL;
+ goto out;
+ }
+
+ port = udev_device_get_sysattr_value(fcdev, "port_name");
+ if (port == NULL) {
+ parent = NULL;
+ goto out;
+ }
+
+ lun = strtoul(udev_device_get_sysnum(parent), NULL, 10);
+ path_prepend(path, "fc-%s:0x%04x%04x00000000", port, lun & 0xffff, (lun >> 16) & 0xffff);
+out:
+ free(syspath);
+ udev_device_unref(fcdev);
return parent;
}
diff --git a/rules/rules.d/60-persistent-storage.rules b/rules/rules.d/60-persistent-storage.rules
index b39ea03321..f4ac6a0277 100644
--- a/rules/rules.d/60-persistent-storage.rules
+++ b/rules/rules.d/60-persistent-storage.rules
@@ -47,8 +47,8 @@ KERNEL=="mspblk[0-9]", SUBSYSTEMS=="memstick", ATTRS{name}=="?*", ATTRS{serial}=
KERNEL=="mspblk[0-9]p[0-9]", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/memstick-$env{ID_NAME}_$env{ID_SERIAL}-part%n"
# by-path (parent device path)
-# old shell script for fc, sas, iscsi, s390, ide
-ENV{DEVTYPE}=="disk", DEVPATH=="*/css0/*|*/rport-[0-9]*|*/end_device-*|*/session[0-9]*|*/ide[0-9]*", IMPORT{program}="path_id.sh %p"
+# old shell script for sas, iscsi, ide
+ENV{DEVTYPE}=="disk", DEVPATH=="*/end_device-*|*/session[0-9]*|*/ide[0-9]*", IMPORT{program}="path_id.sh %p"
ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="", DEVPATH!="*/virtual/*", IMPORT{program}="path_id %p"
ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}"
ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part%n"