|
|
1abbee |
From 05004e584a76645dcbcaaa4d5c2d3d3255900770 Mon Sep 17 00:00:00 2001
|
|
|
0e8dd1 |
From: Mauricio Faria de Oliveira <mauricfo@linux.vnet.ibm.com>
|
|
|
0e8dd1 |
Date: Tue, 23 Feb 2016 15:02:02 -0300
|
|
|
0e8dd1 |
Subject: [PATCH] udev: path-id: fibre channel NPIV - use fc_vport's port_name
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
With the Fibre Channel NPIV (N_Port ID Virtualization) feature,
|
|
|
0e8dd1 |
a single physical N_Port (e.g., PCI address) can have multiple
|
|
|
0e8dd1 |
N_Port IDs (e.g., different fc_host nodes) - which can connect
|
|
|
0e8dd1 |
to the same target LUN (e.g., fc_remote_port's port_name and
|
|
|
0e8dd1 |
LUN number).
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
Thus, in order to be unique, the device persistent path should
|
|
|
0e8dd1 |
include the fc_vport's port_name (only if the fc_vport is used),
|
|
|
0e8dd1 |
in addition to the already in use PCI address, fc_remote_port's
|
|
|
0e8dd1 |
port_name and LUN number.
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
The patch merges the 2 proposals submitted upstream, addressing
|
|
|
0e8dd1 |
some problems with both:
|
|
|
0e8dd1 |
- #2500 (don't replace the fc_rport's port_name with fc_vport's)
|
|
|
0e8dd1 |
- #2665 (don't add a fc_host/fc_vport's port_name if not needed)
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
Links
|
|
|
0e8dd1 |
- https://github.com/systemd/systemd/pull/2500/
|
|
|
0e8dd1 |
- https://github.com/systemd/systemd/pull/2665/
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
Built, checked, tested on RHEL Server 7.1 with no regressions.
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
With the patch, /dev/disk/by-path symlinks are created correctly,
|
|
|
0e8dd1 |
and are unique, backward-compatible with the physical port case:
|
|
|
0e8dd1 |
- physical port (no vport field)
|
|
|
0e8dd1 |
- virtual ports (w/ vport field)
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
# ls -l /dev/disk/by-path | grep 0001:09:00.0
|
|
|
0e8dd1 |
<...> pci-0001:09:00.0-fc-0x500507680b2255fe-lun-0 -> ../../sdh
|
|
|
0e8dd1 |
<...> pci-0001:09:00.0-fc-0x500507680b2255ff-lun-0 -> ../../sdi
|
|
|
0e8dd1 |
<...> pci-0001:09:00.0-vport-0x5001a4aaf00a6785-fc-0x500507680b2255fe-lun-0 -> ../../sde
|
|
|
0e8dd1 |
<...> pci-0001:09:00.0-vport-0x5001a4aaf00a6785-fc-0x500507680b2255ff-lun-0 -> ../../sdd
|
|
|
0e8dd1 |
<...> pci-0001:09:00.0-vport-0x5001a4ad99d8c2de-fc-0x500507680b2255fe-lun-0 -> ../../sdc
|
|
|
0e8dd1 |
<...> pci-0001:09:00.0-vport-0x5001a4ad99d8c2de-fc-0x500507680b2255ff-lun-0 -> ../../sdb
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
Accordingly w/ sysfs:
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
# ls -ld /sys/block/sd* | grep host1
|
|
|
0e8dd1 |
<...> /sys/block/sdb -> ../devices/pci0001:00/<...>/0001:09:00.0/host1/vport-1:0-0/host3/rport-3:0-1/target3:0:0/3:0:0:0/block/sdb
|
|
|
0e8dd1 |
<...> /sys/block/sdc -> ../devices/pci0001:00/<...>/0001:09:00.0/host1/vport-1:0-0/host3/rport-3:0-2/target3:0:1/3:0:1:0/block/sdc
|
|
|
0e8dd1 |
<...> /sys/block/sdd -> ../devices/pci0001:00/<...>/0001:09:00.0/host1/vport-1:0-2/host5/rport-5:0-1/target5:0:0/5:0:0:0/block/sdd
|
|
|
0e8dd1 |
<...> /sys/block/sde -> ../devices/pci0001:00/<...>/0001:09:00.0/host1/vport-1:0-2/host5/rport-5:0-2/target5:0:1/5:0:1:0/block/sde
|
|
|
0e8dd1 |
<...> /sys/block/sdh -> ../devices/pci0001:00/<...>/0001:09:00.0/host1/rport-1:0-3/target1:0:0/1:0:0:0/block/sdh
|
|
|
0e8dd1 |
<...> /sys/block/sdi -> ../devices/pci0001:00/<...>/0001:09:00.0/host1/rport-1:0-4/target1:0:1/1:0:1:0/block/sdi
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
The symlinks still include the fc_remote_port's (target) port_name:
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
# grep . /sys/class/fc_remote_ports/rport-{3:0-{1,2},5:0-{1,2},1:0-{3,4}}/port_name
|
|
|
0e8dd1 |
/sys/class/fc_remote_ports/rport-3:0-1/port_name:0x500507680b2255ff
|
|
|
0e8dd1 |
/sys/class/fc_remote_ports/rport-3:0-2/port_name:0x500507680b2255fe
|
|
|
0e8dd1 |
/sys/class/fc_remote_ports/rport-5:0-1/port_name:0x500507680b2255ff
|
|
|
0e8dd1 |
/sys/class/fc_remote_ports/rport-5:0-2/port_name:0x500507680b2255fe
|
|
|
0e8dd1 |
/sys/class/fc_remote_ports/rport-1:0-3/port_name:0x500507680b2255fe
|
|
|
0e8dd1 |
/sys/class/fc_remote_ports/rport-1:0-4/port_name:0x500507680b2255ff
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
And now include the fc_vport's (virtual host) port_name *if* it's from a fc_vport:
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
# grep . /sys/class/fc_host/host1/port_name /sys/class/fc_vports/vport-1:0-{0,2}/port_name
|
|
|
0e8dd1 |
/sys/class/fc_host/host1/port_name:0x10000090fa8f0ebc
|
|
|
0e8dd1 |
/sys/class/fc_vports/vport-1:0-0/port_name:0x5001a4ad99d8c2de
|
|
|
0e8dd1 |
/sys/class/fc_vports/vport-1:0-2/port_name:0x5001a4aaf00a6785
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
Signed-off-by: Mauricio Faria de Oliveira <mauricfo@linux.vnet.ibm.com>
|
|
|
0e8dd1 |
Reported-by: Srikanth B. Aithal <bssrikanth@in.ibm.com>
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
Cherry-picked from: 6a3d3f9e5970cf982ac37c65d0b856146b675a12
|
|
|
0e8dd1 |
Resolves: #1266934
|
|
|
0e8dd1 |
---
|
|
|
0e8dd1 |
src/udev/udev-builtin-path_id.c | 30 ++++++++++++++++++++++++++++++
|
|
|
0e8dd1 |
1 file changed, 30 insertions(+)
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
diff --git a/src/udev/udev-builtin-path_id.c b/src/udev/udev-builtin-path_id.c
|
|
|
0e8dd1 |
index 9ca6084..3b72922 100644
|
|
|
0e8dd1 |
--- a/src/udev/udev-builtin-path_id.c
|
|
|
0e8dd1 |
+++ b/src/udev/udev-builtin-path_id.c
|
|
|
0e8dd1 |
@@ -92,7 +92,11 @@ static struct udev_device *skip_subsystem(struct udev_device *dev, const char *s
|
|
|
0e8dd1 |
static struct udev_device *handle_scsi_fibre_channel(struct udev_device *parent, char **path) {
|
|
|
0e8dd1 |
struct udev *udev = udev_device_get_udev(parent);
|
|
|
0e8dd1 |
struct udev_device *targetdev;
|
|
|
0e8dd1 |
+ struct udev_device *rportdev;
|
|
|
0e8dd1 |
+ struct udev_device *hostdev;
|
|
|
0e8dd1 |
+ struct udev_device *vportdev;
|
|
|
0e8dd1 |
struct udev_device *fcdev = NULL;
|
|
|
0e8dd1 |
+ struct udev_device *fc_vportdev = NULL;
|
|
|
0e8dd1 |
const char *port;
|
|
|
0e8dd1 |
char *lun = NULL;
|
|
|
0e8dd1 |
|
|
|
0e8dd1 |
@@ -113,6 +117,32 @@ static struct udev_device *handle_scsi_fibre_channel(struct udev_device *parent,
|
|
|
0e8dd1 |
path_prepend(path, "fc-%s-%s", port, lun);
|
|
|
0e8dd1 |
if (lun)
|
|
|
0e8dd1 |
free(lun);
|
|
|
0e8dd1 |
+
|
|
|
0e8dd1 |
+ /* NPIV */
|
|
|
0e8dd1 |
+ rportdev = udev_device_get_parent(targetdev);
|
|
|
0e8dd1 |
+ if (rportdev == NULL)
|
|
|
0e8dd1 |
+ goto out;
|
|
|
0e8dd1 |
+
|
|
|
0e8dd1 |
+ hostdev = udev_device_get_parent(rportdev);
|
|
|
0e8dd1 |
+ if (hostdev == NULL)
|
|
|
0e8dd1 |
+ goto out;
|
|
|
0e8dd1 |
+
|
|
|
0e8dd1 |
+ vportdev = udev_device_get_parent(hostdev);
|
|
|
0e8dd1 |
+ if (vportdev == NULL)
|
|
|
0e8dd1 |
+ goto out;
|
|
|
0e8dd1 |
+
|
|
|
0e8dd1 |
+ fc_vportdev = udev_device_new_from_subsystem_sysname(udev, "fc_vports", udev_device_get_sysname(vportdev));
|
|
|
0e8dd1 |
+ if (fc_vportdev == NULL)
|
|
|
0e8dd1 |
+ goto out;
|
|
|
0e8dd1 |
+
|
|
|
0e8dd1 |
+ port = udev_device_get_sysattr_value(fc_vportdev, "port_name");
|
|
|
0e8dd1 |
+ if (port == NULL)
|
|
|
0e8dd1 |
+ goto out_npiv;
|
|
|
0e8dd1 |
+
|
|
|
0e8dd1 |
+ path_prepend(path, "vport-%s", port);
|
|
|
0e8dd1 |
+
|
|
|
0e8dd1 |
+out_npiv:
|
|
|
0e8dd1 |
+ udev_device_unref(fc_vportdev);
|
|
|
0e8dd1 |
out:
|
|
|
0e8dd1 |
udev_device_unref(fcdev);
|
|
|
0e8dd1 |
return parent;
|