diff --git a/backport-udev-rename-the-persistent-link-for-ATA-devices.patch b/backport-udev-rename-the-persistent-link-for-ATA-devices.patch new file mode 100644 index 0000000000000000000000000000000000000000..47ce1b64905c45d936533ba917e6716087d09bfb --- /dev/null +++ b/backport-udev-rename-the-persistent-link-for-ATA-devices.patch @@ -0,0 +1,267 @@ +From 9b3278d90704416bfe51a05d5681caf99445fb2f Mon Sep 17 00:00:00 2001 +From: Lidong Zhong +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) +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 + diff --git a/systemd.spec b/systemd.spec index 81a3ac84146043401a02f440ecd799afe252b0db..5f173a24f17ca37a19d53ba4f4c9be0dc64387e5 100644 --- a/systemd.spec +++ b/systemd.spec @@ -16,7 +16,7 @@ Name: systemd Url: https://www.freedesktop.org/wiki/Software/systemd Version: 243 -Release: 54 +Release: 55 License: MIT and LGPLv2+ and GPLv2+ Summary: System and Service Manager @@ -171,6 +171,7 @@ Patch0123: backport-0012-CVE-2020-13776-parse-util-make-return-parameter-op Patch0124: backport-0013-CVE-2020-13776-parse-util-rewrite-parse_mode-on-top-of-safe_atou_fu.patch Patch0125: backport-0014-CVE-2020-13776-user-util-be-stricter-in-parse_uid.patch Patch0126: backport-0015-CVE-2020-13776-parse-util-also-parse-integers-prefixed-with-0b-and-.patch +Patch0127: backport-udev-rename-the-persistent-link-for-ATA-devices.patch #openEuler @@ -1560,18 +1561,22 @@ fi %exclude /usr/share/man/man3/* %changelog -* Wed Feb 16 2021 yangmingtai - 243-54 +* Mon Feb 28 2022 yangmingtai - 243-54 +- add backport-udev-rename-the-persistent-link-for-ATA-devices.patch + for the link of ATA devices + +* Wed Feb 16 2022 yangmingtai - 243-54 - fix CVE-2020-13776 -* Wed Jan 26 2021 yangmingtai - 243-53 +* Wed Jan 26 2022 yangmingtai - 243-53 - fix ConditionDirectoryNotEmpty,ConditionPathIsReadWrite and DirectoryNotEmpty -* Wed Jan 26 2021 yangmingtai - 243-52 +* Wed Jan 26 2022 yangmingtai - 243-52 - fix some issue: 1.fix set blkio.bfq.weight 2.udevadm fix --tag-match 3.fix check of Listen* arguments -* Tue Jan 18 2021 yangmingtai - 243-51 +* Tue Jan 18 2022 yangmingtai - 243-51 - CVE:fix CVE-2021-3997 * Fri Dec 3 2021 yangmingtai - 243-50