diff --git a/s390-tools-sles15sp4-zdev-Fix-path-resolution-for-multi-mount-point-file-.patch b/s390-tools-sles15sp4-zdev-Fix-path-resolution-for-multi-mount-point-file-.patch new file mode 100644 index 0000000..afde233 --- /dev/null +++ b/s390-tools-sles15sp4-zdev-Fix-path-resolution-for-multi-mount-point-file-.patch @@ -0,0 +1,169 @@ +Subject: [PATCH] [BZ 196440] zdev: Fix path resolution for multi-mount point file systems +From: Peter Oberparleiter + +Description: zdev: Fix path resolution for multi-mount point file systems +Symptom: Path resolution fails when a device provides multiple mount + points such as, for example, when using btrfs subvolumes, or + when mounting the same file system at multiple mount points. +Problem: The failure is caused by zdev relying on the MOUNTPOINT + attribute of lsblk's output which only contains a single + mount point. +Solution: Fix this by making use of lsblk's MOUNTPOINTS attribute that + contains the full list of mount points. +Reproduction: chzdev -f -e : In this case, if + the rootfs is soread across multiple devices, zdev adds only the + first device in to the initrd and the system does not boot. +Upstream-ID: 1faa5d2957eb82ab235778959d70a38062b7aa7d +Problem-ID: 196440 + +Upstream-Description: + + zdev: Fix path resolution for multi-mount point file systems + + zdev provides path resolution logic to determine which z-specific + devices contribute to the file system mounted at a specific mount point. + This logic is used by command-line option --by-path, but also to + determine the list of devices needed to enable the root file system. + + Path resolution fails when a device provides multiple mount points such + as, for example, when using btrfs subvolumes, or when mounting the same + file system at multiple mount points. The failure is caused by zdev + relying on the MOUNTPOINT attribute of lsblk's output which only + contains a single mount point. + + Fix this by making use of lsblk's MOUNTPOINTS attribute that contains + the full list of mount points. Note that MOUNTPOINTS was only introduced + with util-linux v2.37, therefore a fall-back to the old format is + needed. + + Fixes: https://github.com/ibm-s390-linux/s390-tools/issues/129 + Signed-off-by: Peter Oberparleiter + Reviewed-by: Jan Hoeppner + Reviewed-by: Vineeth Vijayan + Reviewed-by: Eduard Shishkin + Reported-by: Dan Horak + Signed-off-by: Jan Hoeppner + + +Signed-off-by: Peter Oberparleiter +Index: s390-tools-service/zdev/src/blkinfo.c +=================================================================== +--- s390-tools-service.orig/zdev/src/blkinfo.c ++++ s390-tools-service/zdev/src/blkinfo.c +@@ -7,6 +7,7 @@ + * it under the terms of the MIT license. See LICENSE for details. + */ + ++#include + #include + #include + #include +@@ -16,6 +17,7 @@ + #include "misc.h" + + #define LSBLK_CMDLINE "lsblk -P -o NAME,MAJ:MIN,FSTYPE,UUID,MOUNTPOINT,PKNAME 2>/dev/null" ++#define LSBLK_CMDLINE2 "lsblk -P -o NAME,MAJ:MIN,FSTYPE,UUID,MOUNTPOINTS,PKNAME 2>/dev/null" + + struct blkinfo { + struct devnode *devnode; +@@ -82,6 +84,26 @@ void blkinfo_print(struct blkinfo *blkin + printf("%*sparent=%s\n", level, "", blkinfo->parent); + } + ++/* Convert each occurrence of '\xnn' in @str to character with hex code . */ ++static void hex_unescape(char *str) ++{ ++ unsigned int c; ++ ++ while ((str = strstr(str, "\\x"))) { ++ if (isxdigit(str[2]) && isxdigit(str[3]) && ++ sscanf(str + 2, "%2x", &c) == 1) { ++ str[0] = (char)c; ++ ++ /* Move remainder of str including nul behind . */ ++ memmove(str + /* */ 1, ++ str + /* '\xnn' */ 4, ++ strlen(str + 4) + /* */ 1); ++ } ++ ++ str++; ++ } ++} ++ + static char *isolate_keyword(char **line_ptr, const char *keyword) + { + char *start, *end; +@@ -102,9 +124,11 @@ static char *isolate_keyword(char **line + return start; + } + +-static struct blkinfo *blkinfo_from_line(char *line) ++static void add_blkinfos_from_line(struct util_list *blkinfos, ++ char *line) + { +- char *name, *majmin, *fstype, *uuid, *mountpoint, *parent; ++ char *name, *majmin, *fstype, *uuid, *mountpoint, *mountpoints, *parent; ++ struct blkinfo *blkinfo; + + name = isolate_keyword(&line, "NAME=\""); + majmin = isolate_keyword(&line, "MAJ:MIN=\""); +@@ -113,21 +137,45 @@ static struct blkinfo *blkinfo_from_line + fstype = isolate_keyword(&line, "FSTYPE=\""); + uuid = isolate_keyword(&line, "UUID=\""); + mountpoint = isolate_keyword(&line, "MOUNTPOINT=\""); ++ mountpoints = isolate_keyword(&line, "MOUNTPOINTS=\""); + parent = isolate_keyword(&line, "PKNAME=\""); + +- return blkinfo_new(name, majmin, fstype, uuid, mountpoint, parent); ++ if (!mountpoints) { ++ /* Handle old lsblk output format. */ ++ blkinfo = blkinfo_new(name, majmin, fstype, uuid, mountpoint, ++ parent); ++ ptrlist_add(blkinfos, blkinfo); ++ return; ++ } ++ ++ /* Restore newline mount point separator encoded as hex. */ ++ hex_unescape(mountpoints); ++ ++ /* Represent each mount point as a separate blkinfo to support ++ * resolution of multi-mount point file systems like btrfs ++ * subvolumes. */ ++ while ((mountpoint = strsep(&mountpoints, "\n"))) { ++ blkinfo = blkinfo_new(name, majmin, fstype, uuid, mountpoint, ++ parent); ++ ptrlist_add(blkinfos, blkinfo); ++ } + } + + static struct util_list *blkinfos_read(void) + { + char *output, *curr, *next; + struct util_list *blkinfos; +- struct blkinfo *blkinfo; + + if (cached_blkinfos) + return cached_blkinfos; + +- output = misc_read_cmd_output(LSBLK_CMDLINE, 0, 1); ++ output = misc_read_cmd_output(LSBLK_CMDLINE2, 0, 1); ++ if (output && !*output) { ++ /* No output might indicate no support for new lsblk command- ++ * line format - fall back to old format. */ ++ free(output); ++ output = misc_read_cmd_output(LSBLK_CMDLINE, 0, 1); ++ } + if (!output) + return NULL; + +@@ -136,9 +184,7 @@ static struct util_list *blkinfos_read(v + /* Iterate over each line. */ + next = output; + while ((curr = strsep(&next, "\n"))) { +- blkinfo = blkinfo_from_line(curr); +- if (blkinfo) +- ptrlist_add(blkinfos, blkinfo); ++ add_blkinfos_from_line(blkinfos, curr); + } + + free(output); diff --git a/s390-tools-sles15sp4-zdev-modify-the-lsblk-output-parser-in-lszdev.patch b/s390-tools-sles15sp4-zdev-modify-the-lsblk-output-parser-in-lszdev.patch new file mode 100644 index 0000000..5932192 --- /dev/null +++ b/s390-tools-sles15sp4-zdev-modify-the-lsblk-output-parser-in-lszdev.patch @@ -0,0 +1,44 @@ +Subject: [PATCH] [BZ 196072] zdev: modify the lsblk output parser in lszdev +From: Vineeth Vijayan + +Description: zdev: modify the lsblk output parser in lszdev +Symptom: lsblk parser function in lszdev not working +Problem: Version 2.37+ of util-linux modified the output + characters of lsblk,which breaks the parser function. +Solution: Align the parser function to support latest changes +Reproduction: execute lszdev --by-path / command +Upstream-ID: ad024c06e16ec4bba31d19fb848b42c67113143d +Problem-ID: 196072 + +Upstream-Description: + + zdev: modify the lsblk output parser in lszdev + + Since version 2.37.x, with the commit 58b510e58 ("libsmartcols: sanitize + variable names on export output"), util-linux changes the output + characters of lsblk, where the ":" is replaced with an "_". Align the + lsblk output parser function in lszdev as per this change. + + Signed-off-by: Vineeth Vijayan + Suggested-by: Peter Oberparleiter + Reported-by: Boris Fiuczynski + Reviewed-by: Peter Oberparleiter + Reviewed-by: Boris Fiuczynski + Tested-by: Boris Fiuczynski + Signed-off-by: Jan Hoeppner + + +Signed-off-by: Vineeth Vijayan +Index: s390-tools-service/zdev/src/blkinfo.c +=================================================================== +--- s390-tools-service.orig/zdev/src/blkinfo.c ++++ s390-tools-service/zdev/src/blkinfo.c +@@ -108,6 +108,8 @@ static struct blkinfo *blkinfo_from_line + + name = isolate_keyword(&line, "NAME=\""); + majmin = isolate_keyword(&line, "MAJ:MIN=\""); ++ if (!majmin) ++ majmin = isolate_keyword(&line, "MAJ_MIN=\""); + fstype = isolate_keyword(&line, "FSTYPE=\""); + uuid = isolate_keyword(&line, "UUID=\""); + mountpoint = isolate_keyword(&line, "MOUNTPOINT=\""); diff --git a/s390-tools.changes b/s390-tools.changes index cfe4659..ffc71e4 100644 --- a/s390-tools.changes +++ b/s390-tools.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Tue Feb 22 19:37:07 UTC 2022 - Mark Post + +- Added s390-tools-sles15sp4-zdev-modify-the-lsblk-output-parser-in-lszdev.patch + for bsc#1196255. Version 2.37+ of util-linux modified the output + characters of lsblk,which breaks the parser function. +- Added s390-tools-sles15sp4-zdev-Fix-path-resolution-for-multi-mount-point-file-.patch + for bsc#1196254. Path resolution fails when a device provides + multiple mount points such as, for example, when using btrfs + subvolumes, or when mounting the same file system at multiple + mount points. + ------------------------------------------------------------------- Wed Jan 12 21:27:13 UTC 2022 - Mark Post diff --git a/s390-tools.spec b/s390-tools.spec index f24d84f..6c4da68 100644 --- a/s390-tools.spec +++ b/s390-tools.spec @@ -1,7 +1,7 @@ # # spec file for package s390-tools # -# Copyright (c) 2001-2021 SUSE LLC +# Copyright (c) 2001-2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -90,6 +90,8 @@ Source99: zfcp_host_configure.8 # IBM patches Patch001: s390-tools-sles15sp4-chreipl-fcp-mpath-don-t-compress-the-manpage-before-.patch Patch002: s390-tools-sles15sp4-chreipl-fcp-mpath-remove-shebang-from-chreipl-fcp-mp.patch +Patch003: s390-tools-sles15sp4-zdev-modify-the-lsblk-output-parser-in-lszdev.patch +Patch004: s390-tools-sles15sp4-zdev-Fix-path-resolution-for-multi-mount-point-file-.patch # SUSE patches Patch900: s390-tools-sles12-zipl_boot_msg.patch