268 lines
13 KiB
Diff
268 lines
13 KiB
Diff
From 9b3278d90704416bfe51a05d5681caf99445fb2f Mon Sep 17 00:00:00 2001
|
|
From: Lidong Zhong <lidong.zhong@suse.com>
|
|
Date: Wed, 15 Apr 2020 00:54:57 +0800
|
|
Subject: [PATCH] udev: rename the persistent link for ATA devices
|
|
|
|
ATA devices should use the ATA ids like port number and (possibly)
|
|
master/slave or multiplier id, not the generic SCSI ID.
|
|
Currently only port number is included in the link. With this patch
|
|
the link would be able to support more cases, which are a) when the
|
|
device is behind a port multiplexer b) the distinction between master
|
|
and slave (distinguished by target id).
|
|
|
|
I tried to verify scenario a) with this patch, but I failed to find a
|
|
machine with PMP SATA devices attached. But the link below
|
|
https://github.com/systemd/systemd/issues/3943
|
|
could show what's the difference. Here is my test for scenario b)
|
|
|
|
Current version:
|
|
linux-ql21:~ # ll /sys/class/block/sd[ab]
|
|
lrwxrwxrwx 1 root root 0 May 8 20:46 /sys/class/block/sda ->
|
|
../../devices/pci0000:00/0000:00:01.1/ata4/host3/target3:0:0/3:0:0:0/block/sda
|
|
lrwxrwxrwx 1 root root 0 May 8 20:46 /sys/class/block/sdb ->
|
|
../../devices/pci0000:00/0000:00:01.1/ata4/host3/target3:0:1/3:0:1:0/block/sdb
|
|
linux-ql21:~ # ll /dev/disk/by-path/pci-0000\:00\:01.1-ata-1
|
|
lrwxrwxrwx 1 root root 9 May 8 20:44
|
|
/dev/disk/by-path/pci-0000:00:01.1-ata-1 -> ../../sdb
|
|
linux-ql21:~ # udevadm info /sys/class/block/sda |grep by-path
|
|
S: disk/by-path/pci-0000:00:01.1-ata-1
|
|
E: DEVLINKS=/dev/disk/by-id/ata-VBOX_HARDDISK_VB3649e885-3e0cdd64
|
|
/dev/disk/by-id/scsi-0ATA_VBOX_HARDDISK_VB3649e885-3e0cdd64
|
|
/dev/disk/by-id/scsi-1ATA_VBOX_HARDDISK_VB3649e885-3e0cdd64
|
|
/dev/disk/by-path/pci-0000:00:01.1-ata-1
|
|
/dev/disk/by-id/scsi-SATA_VBOX_HARDDISK_VB3649e885-3e0cdd64
|
|
linux-ql21:~ # udevadm info /sys/class/block/sdb |grep by-path
|
|
S: disk/by-path/pci-0000:00:01.1-ata-1
|
|
E: DEVLINKS=/dev/disk/by-id/ata-VBOX_HARDDISK_VBc53b2498-d84ae8de
|
|
/dev/disk/by-id/scsi-SATA_VBOX_HARDDISK_VBc53b2498-d84ae8de
|
|
/dev/disk/by-id/scsi-1ATA_VBOX_HARDDISK_VBc53b2498-d84ae8de
|
|
/dev/disk/by-id/scsi-0ATA_VBOX_HARDDISK_VBc53b2498-d84ae8de
|
|
/dev/disk/by-path/pci-0000:00:01.1-ata-1
|
|
|
|
After patch applied:
|
|
linux-ql21:~ # ll /sys/class/block/sd[ab]
|
|
lrwxrwxrwx 1 root root 0 May 8 21:07 /sys/class/block/sda ->
|
|
../../devices/pci0000:00/0000:00:01.1/ata4/host3/target3:0:0/3:0:0:0/block/sda
|
|
lrwxrwxrwx 1 root root 0 May 8 21:07 /sys/class/block/sdb ->
|
|
../../devices/pci0000:00/0000:00:01.1/ata4/host3/target3:0:1/3:0:1:0/block/sdb
|
|
linux-ql21:~ # ll /dev/disk/by-path/pci-0000\:00\:01.1-ata-*
|
|
lrwxrwxrwx 1 root root 9 May 8 21:07
|
|
/dev/disk/by-path/pci-0000:00:01.1-ata-1.0 -> ../../sda
|
|
lrwxrwxrwx 1 root root 9 May 8 21:07
|
|
/dev/disk/by-path/pci-0000:00:01.1-ata-1.1 -> ../../sdb
|
|
linux-ql21:~ # udevadm info /sys/class/block/sda |grep by-path
|
|
S: disk/by-path/pci-0000:00:01.1-ata-1.0
|
|
E: DEVLINKS=/dev/disk/by-id/scsi-1ATA_VBOX_HARDDISK_VB3649e885-3e0cdd64
|
|
/dev/disk/by-id/scsi-0ATA_VBOX_HARDDISK_VB3649e885-3e0cdd64
|
|
/dev/disk/by-id/ata-VBOX_HARDDISK_VB3649e885-3e0cdd64
|
|
/dev/disk/by-path/pci-0000:00:01.1-ata-1.0
|
|
/dev/disk/by-id/scsi-SATA_VBOX_HARDDISK_VB3649e885-3e0cdd64
|
|
linux-ql21:~ # udevadm info /sys/class/block/sdb |grep by-path
|
|
S: disk/by-path/pci-0000:00:01.1-ata-1.1
|
|
E: DEVLINKS=/dev/disk/by-id/scsi-0ATA_VBOX_HARDDISK_VBc53b2498-d84ae8de
|
|
/dev/disk/by-id/ata-VBOX_HARDDISK_VBc53b2498-d84ae8de
|
|
/dev/disk/by-id/scsi-1ATA_VBOX_HARDDISK_VBc53b2498-d84ae8de
|
|
/dev/disk/by-id/scsi-SATA_VBOX_HARDDISK_VBc53b2498-d84ae8de
|
|
/dev/disk/by-path/pci-0000:00:01.1-ata-1.1
|
|
|
|
Changelog:
|
|
v5: add another parameter compat_link in handle_scsi()
|
|
v4: comment for ID_PATH_ATA_COMPAT
|
|
get string length with pointer difference
|
|
(suggested by Franck Bui<fbui@suse.com>)
|
|
v3: creating compatible link from env
|
|
variables type change
|
|
v2: remove udev rules modification for compatible link
|
|
setup a test scenario of master/slave ATA devices
|
|
v1: initial patch
|
|
|
|
Conflict: directory "rules.d" does not exist, and the file "60-persistent-storage.rules" is in the directory "rules"
|
|
Reference:https://github.com/systemd/systemd/commit/9b3278d90704416bfe51a05d5681caf99445fb2f
|
|
---
|
|
rules/60-persistent-storage.rules | 3 ++
|
|
src/udev/udev-builtin-path_id.c | 55 +++++++++++++++++++++++++----
|
|
2 files changed, 52 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/rules/60-persistent-storage.rules b/rules/60-persistent-storage.rules
|
|
index 01586690bd..821e9db86f 100644
|
|
--- a/rules/60-persistent-storage.rules
|
|
+++ b/rules/60-persistent-storage.rules
|
|
@@ -93,6 +93,9 @@ ENV{DEVTYPE}=="disk", DEVPATH!="*/virtual/*", IMPORT{builtin}="path_id"
|
|
KERNEL=="mmcblk[0-9]boot[0-9]", ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-boot%n"
|
|
KERNEL!="mmcblk[0-9]boot[0-9]", 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"
|
|
+# compatible links for ATA devices
|
|
+KERNEL!="mmcblk[0-9]boot[0-9]", ENV{DEVTYPE}=="disk", ENV{ID_PATH_ATA_COMPAT}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH_ATA_COMPAT}"
|
|
+ENV{DEVTYPE}=="partition", ENV{ID_PATH_ATA_COMPAT}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH_ATA_COMPAT}-part%n"
|
|
|
|
# legacy virtio-pci by-path links (deprecated)
|
|
KERNEL=="vd*[!0-9]", ENV{ID_PATH}=="pci-*", SYMLINK+="disk/by-path/virtio-$env{ID_PATH}"
|
|
diff --git a/src/udev/udev-builtin-path_id.c b/src/udev/udev-builtin-path_id.c
|
|
index ca38f56087..48e9500548 100644
|
|
--- a/src/udev/udev-builtin-path_id.c
|
|
+++ b/src/udev/udev-builtin-path_id.c
|
|
@@ -253,14 +253,20 @@ static sd_device *handle_scsi_iscsi(sd_device *parent, char **path) {
|
|
return parent;
|
|
}
|
|
|
|
-static sd_device *handle_scsi_ata(sd_device *parent, char **path) {
|
|
+static sd_device *handle_scsi_ata(sd_device *parent, char **path, char **compat_path) {
|
|
sd_device *targetdev, *target_parent;
|
|
_cleanup_(sd_device_unrefp) sd_device *atadev = NULL;
|
|
- const char *port_no, *sysname;
|
|
+ const char *port_no, *sysname, *name;
|
|
+ unsigned host, bus, target, lun;
|
|
|
|
assert(parent);
|
|
assert(path);
|
|
|
|
+ if (sd_device_get_sysname(parent, &name) < 0)
|
|
+ return NULL;
|
|
+ if (sscanf(name, "%u:%u:%u:%u", &host, &bus, &target, &lun) != 4)
|
|
+ return NULL;
|
|
+
|
|
if (sd_device_get_parent_with_subsystem_devtype(parent, "scsi", "scsi_host", &targetdev) < 0)
|
|
return NULL;
|
|
|
|
@@ -275,7 +281,17 @@ static sd_device *handle_scsi_ata(sd_device *parent, char **path) {
|
|
if (sd_device_get_sysattr_value(atadev, "port_no", &port_no) < 0)
|
|
return NULL;
|
|
|
|
- path_prepend(path, "ata-%s", port_no);
|
|
+ if (bus != 0)
|
|
+ /* Devices behind port multiplier have a bus != 0*/
|
|
+ path_prepend(path, "ata-%s.%u.0", port_no, bus);
|
|
+ else
|
|
+ /* Master/slave are distinguished by target id */
|
|
+ path_prepend(path, "ata-%s.%u", port_no, target);
|
|
+
|
|
+ /* old compatible persistent link for ATA devices */
|
|
+ if (compat_path)
|
|
+ path_prepend(compat_path, "ata-%s", port_no);
|
|
+
|
|
return parent;
|
|
}
|
|
|
|
@@ -392,7 +408,7 @@ static sd_device *handle_scsi_hyperv(sd_device *parent, char **path, size_t guid
|
|
return parent;
|
|
}
|
|
|
|
-static sd_device *handle_scsi(sd_device *parent, char **path, bool *supported_parent) {
|
|
+static sd_device *handle_scsi(sd_device *parent, char **path, char **compat_path, bool *supported_parent) {
|
|
const char *devtype, *id, *name;
|
|
|
|
if (sd_device_get_devtype(parent, &devtype) < 0 ||
|
|
@@ -426,7 +442,7 @@ static sd_device *handle_scsi(sd_device *parent, char **path, bool *supported_pa
|
|
}
|
|
|
|
if (strstr(name, "/ata"))
|
|
- return handle_scsi_ata(parent, path);
|
|
+ return handle_scsi_ata(parent, path, compat_path);
|
|
|
|
if (strstr(name, "/vmbus_"))
|
|
return handle_scsi_hyperv(parent, path, 37);
|
|
@@ -520,6 +536,7 @@ static sd_device *handle_ap(sd_device *parent, char **path) {
|
|
static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
|
|
sd_device *parent;
|
|
_cleanup_free_ char *path = NULL;
|
|
+ _cleanup_free_ char *compat_path = NULL;
|
|
bool supported_transport = false;
|
|
bool supported_parent = false;
|
|
const char *subsystem;
|
|
@@ -537,7 +554,7 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
|
|
} else if (streq(subsys, "scsi_tape")) {
|
|
handle_scsi_tape(parent, &path);
|
|
} else if (streq(subsys, "scsi")) {
|
|
- parent = handle_scsi(parent, &path, &supported_parent);
|
|
+ parent = handle_scsi(parent, &path, &compat_path, &supported_parent);
|
|
supported_transport = true;
|
|
} else if (streq(subsys, "cciss")) {
|
|
parent = handle_cciss(parent, &path);
|
|
@@ -557,19 +574,27 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
|
|
}
|
|
} else if (streq(subsys, "pci")) {
|
|
path_prepend(&path, "pci-%s", sysname);
|
|
+ if (compat_path)
|
|
+ path_prepend(&compat_path, "pci-%s", sysname);
|
|
parent = skip_subsystem(parent, "pci");
|
|
supported_parent = true;
|
|
} else if (streq(subsys, "platform")) {
|
|
path_prepend(&path, "platform-%s", sysname);
|
|
+ if (compat_path)
|
|
+ path_prepend(&compat_path, "platform-%s", sysname);
|
|
parent = skip_subsystem(parent, "platform");
|
|
supported_transport = true;
|
|
supported_parent = true;
|
|
} else if (streq(subsys, "acpi")) {
|
|
path_prepend(&path, "acpi-%s", sysname);
|
|
+ if (compat_path)
|
|
+ path_prepend(&compat_path, "acpi-%s", sysname);
|
|
parent = skip_subsystem(parent, "acpi");
|
|
supported_parent = true;
|
|
} else if (streq(subsys, "xen")) {
|
|
path_prepend(&path, "xen-%s", sysname);
|
|
+ if (compat_path)
|
|
+ path_prepend(&compat_path, "xen-%s", sysname);
|
|
parent = skip_subsystem(parent, "xen");
|
|
supported_parent = true;
|
|
} else if (streq(subsys, "virtio")) {
|
|
@@ -577,16 +602,22 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
|
|
supported_transport = true;
|
|
} else if (streq(subsys, "scm")) {
|
|
path_prepend(&path, "scm-%s", sysname);
|
|
+ if (compat_path)
|
|
+ path_prepend(&compat_path, "scm-%s", sysname);
|
|
parent = skip_subsystem(parent, "scm");
|
|
supported_transport = true;
|
|
supported_parent = true;
|
|
} else if (streq(subsys, "ccw")) {
|
|
path_prepend(&path, "ccw-%s", sysname);
|
|
+ if (compat_path)
|
|
+ path_prepend(&compat_path, "ccw-%s", sysname);
|
|
parent = skip_subsystem(parent, "ccw");
|
|
supported_transport = true;
|
|
supported_parent = true;
|
|
} else if (streq(subsys, "ccwgroup")) {
|
|
path_prepend(&path, "ccwgroup-%s", sysname);
|
|
+ if (compat_path)
|
|
+ path_prepend(&compat_path, "ccwgroup-%s", sysname);
|
|
parent = skip_subsystem(parent, "ccwgroup");
|
|
supported_transport = true;
|
|
supported_parent = true;
|
|
@@ -596,6 +627,8 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
|
|
supported_parent = true;
|
|
} else if (streq(subsys, "iucv")) {
|
|
path_prepend(&path, "iucv-%s", sysname);
|
|
+ if (compat_path)
|
|
+ path_prepend(&compat_path, "iucv-%s", sysname);
|
|
parent = skip_subsystem(parent, "iucv");
|
|
supported_transport = true;
|
|
supported_parent = true;
|
|
@@ -604,6 +637,8 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
|
|
|
|
if (sd_device_get_sysattr_value(dev, "nsid", &nsid) >= 0) {
|
|
path_prepend(&path, "nvme-%s", nsid);
|
|
+ if (compat_path)
|
|
+ path_prepend(&compat_path, "nvme-%s", nsid);
|
|
parent = skip_subsystem(parent, "nvme");
|
|
supported_parent = true;
|
|
supported_transport = true;
|
|
@@ -671,6 +706,14 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
|
|
udev_builtin_add_property(dev, test, "ID_PATH_TAG", tag);
|
|
}
|
|
|
|
+ /*
|
|
+ * Compatible link generation for ATA devices
|
|
+ * we assign compat_link to the env variable
|
|
+ * ID_PATH_ATA_COMPAT
|
|
+ */
|
|
+ if (compat_path)
|
|
+ udev_builtin_add_property(dev, test, "ID_PATH_ATA_COMPAT", compat_path);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
--
|
|
2.27.0
|
|
|