diff --git a/backport-udev-support-by-path-devlink-for-multipath-nvme-bloc.patch b/backport-udev-support-by-path-devlink-for-multipath-nvme-bloc.patch new file mode 100644 index 0000000..92ee8b3 --- /dev/null +++ b/backport-udev-support-by-path-devlink-for-multipath-nvme-bloc.patch @@ -0,0 +1,132 @@ +From 67c3e1f63a5221b47a8fea85ae421671f29f3b7e Mon Sep 17 00:00:00 2001 +From: Yu Watanabe +Date: Wed, 21 Sep 2022 02:26:42 +0900 +Subject: [PATCH] udev: support by-path devlink for multipath nvme block + devices + +If multipath feature is enabled, nvme block devices may belong to the +"nvme-subsystem" subsystem, instead of "nvme" subsystem. +(What a confusing name...) + +Then, the syspath is something like the following, + /sys/devices/virtual/nvme-subsystem/nvme-subsys0/nvme0n1 +Hence, we need to find the 'real parent' device, such as + /sys/devices/pci0000:00/0000:00:1c.4/0000:3c:00.0/nvme/nvme0 + +Fixes https://bugzilla.redhat.com/show_bug.cgi?id=2031810. +Fixes https://bugzilla.redhat.com/show_bug.cgi?id=2124964. +Replaces #24748. + +Conflict:different code contexts, manual synchronization path, and include patch 6209bb and f4a449 to fix coredump in 67c3e1f +Reference:https://github.com/systemd/systemd/commit/67c3e1f63a5221b47a8fea85ae421671f29f3b7e +--- + rules.d/60-persistent-storage.rules | 1 + + src/udev/udev-builtin-path_id.c | 61 +++++++++++++++++++++++++---- + 2 files changed, 54 insertions(+), 8 deletions(-) + +diff --git a/rules.d/60-persistent-storage.rules b/rules.d/60-persistent-storage.rules +index 03f0a619dc..64a2409196 100644 +--- a/rules.d/60-persistent-storage.rules ++++ b/rules.d/60-persistent-storage.rules +@@ -88,6 +88,7 @@ KERNEL=="msblk[0-9]p[0-9]|mspblk[0-9]p[0-9]", ENV{ID_NAME}=="?*", ENV{ID_SERIAL} + + # by-path + ENV{DEVTYPE}=="disk", DEVPATH!="*/virtual/*", IMPORT{builtin}="path_id" ++ENV{DEVTYPE}=="disk", SUBSYSTEMS=="nvme-subsystem", 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" +diff --git a/src/udev/udev-builtin-path_id.c b/src/udev/udev-builtin-path_id.c +index ce7bc5caf0..7ec2e94583 100644 +--- a/src/udev/udev-builtin-path_id.c ++++ b/src/udev/udev-builtin-path_id.c +@@ -543,19 +543,55 @@ static sd_device *handle_ap(sd_device *parent, char **path) { + return skip_subsystem(parent, "ap"); + } + ++static int find_real_nvme_parent(sd_device *dev, sd_device **ret) { ++ _cleanup_(sd_device_unrefp) sd_device *nvme = NULL; ++ const char *sysname, *end; ++ int r; ++ ++ /* If the device belongs to "nvme-subsystem" (not to be confused with "nvme"), which happens when ++ * NVMe multipathing is enabled in the kernel (/sys/module/nvme_core/parameters/multipath is Y), ++ * then the syspath is something like the following: ++ * /sys/devices/virtual/nvme-subsystem/nvme-subsys0/nvme0n1 ++ * Hence, we need to find the 'real parent' in "nvme" subsystem, e.g, ++ * /sys/devices/pci0000:00/0000:00:1c.4/0000:3c:00.0/nvme/nvme0 */ ++ ++ assert(dev); ++ assert(ret); ++ ++ r = sd_device_get_sysname(dev, &sysname); ++ if (r < 0) ++ return r; ++ ++ /* The sysname format of nvme block device is nvme%d[c%d]n%d[p%d], e.g. nvme0n1p2 or nvme0c1n2. ++ * (Note, nvme device with 'c' can be ignored, as they are hidden. ) ++ * The sysname format of nvme subsystem device is nvme%d. ++ * See nvme_alloc_ns() and nvme_init_ctrl() in drivers/nvme/host/core.c for more details. */ ++ end = startswith(sysname, "nvme"); ++ if (!end) ++ return -ENXIO; ++ ++ end += strspn(end, DIGITS); ++ sysname = strndupa(sysname, end - sysname); ++ ++ r = sd_device_new_from_subsystem_sysname(&nvme, "nvme", sysname); ++ if (r < 0) ++ return r; ++ ++ *ret = TAKE_PTR(nvme); ++ return 0; ++} ++ + 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; ++ _cleanup_(sd_device_unrefp) sd_device *dev_other_branch = NULL; ++ _cleanup_free_ char *path = NULL, *compat_path = NULL; ++ bool supported_transport = false, supported_parent = false; + const char *subsystem; ++ int r; + + assert(dev); + + /* walk up the chain of devices and compose path */ +- parent = dev; +- while (parent) { ++ for (sd_device *parent = dev; parent; ) { + const char *subsys, *sysname; + + if (sd_device_get_subsystem(parent, &subsys) < 0 || +@@ -642,13 +678,22 @@ static int builtin_path_id(sd_device *dev, sd_netlink **rtnl, int argc, char *ar + parent = skip_subsystem(parent, "iucv"); + supported_transport = true; + supported_parent = true; +- } else if (streq(subsys, "nvme")) { ++ } else if (STR_IN_SET(subsys, "nvme", "nvme-subsystem")) { + const char *nsid; + + 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); ++ ++ if (streq(subsys, "nvme-subsystem")) { ++ r = find_real_nvme_parent(dev, &dev_other_branch); ++ if (r < 0) ++ return r; ++ ++ parent = dev_other_branch; ++ } ++ + parent = skip_subsystem(parent, "nvme"); + supported_parent = true; + supported_transport = true; +-- +2.33.0 + diff --git a/systemd.spec b/systemd.spec index 75fed90..30c16d4 100644 --- a/systemd.spec +++ b/systemd.spec @@ -21,7 +21,7 @@ Name: systemd Url: https://www.freedesktop.org/wiki/Software/systemd Version: 249 -Release: 47 +Release: 48 License: MIT and LGPLv2+ and GPLv2+ Summary: System and Service Manager @@ -440,6 +440,7 @@ Patch6392: backport-mount-util-fix-error-code.patch Patch6393: backport-analyze-add-forgotten-return-statement.patch Patch6394: backport-shared-condition-avoid-nss-lookup-in-PID1.patch Patch6395: backport-logind-fix-getting-property-OnExternalPower-via-D-Bu.patch +Patch6396: backport-udev-support-by-path-devlink-for-multipath-nvme-bloc.patch Patch9001: update-rtc-with-system-clock-when-shutdown.patch Patch9002: udev-add-actions-while-rename-netif-failed.patch @@ -1910,6 +1911,9 @@ fi %{_libdir}/security/pam_systemd.so %changelog +* Tue Mar 7 2023 wangyuhang -249-48 +- fix symlinks to NVMe drives are missing in /dev/disk/by-path + * Tue Feb 28 2023 misaka00251 -249-47 - Exclude riscv64 unsupported files for now, might add them back later