From 9198025136e78c50c296c33044a72b153f6bd262 Mon Sep 17 00:00:00 2001 From: James Antill Date: Thu, 26 May 2022 15:47:06 -0400 Subject: [PATCH] Auto sync2gitlab import of util-linux-2.32.1-35.el8.src.rpm --- .gitignore | 1 + 0000-login-create-var-log-lastlog.patch | 26 + ...d-Check-for-a-secondary-LUKS2-header.patch | 123 + ...eep-f-and-devname-mutually-exclusive.patch | 40 + ...-ext4-to-some-places-to-the-man-page.patch | 55 + 0004-logger-add-S-to-the-man-page.patch | 29 + ...d-info-about-single-user-output-mode.patch | 76 + ...ins-return-1-on-lslogins-nonexisting.patch | 105 + 0007-libuuid-fix-name-based-UUIDs.patch | 115 + 0008-test-update-UUID-v5-tests.patch | 25 + ...enlarge-backing-file-for-fstab-btrfs.patch | 30 + 0010-tests-make-lsns-netnsid-portable.patch | 81 + ...-large-strings-for-PySys_WriteStdout.patch | 111 + ...make-mnt_stat_mountpoin-usable-for-r.patch | 33 + ...tipath-partition-seperators-for-user.patch | 65 + ...ENTRY_-tags-optional-add-no-part-det.patch | 136 + ...-missing-ts_check_test_command-calls.patch | 132 + 0016-tests-add-use-system-commands.patch | 357 ++ ...tests-kill-do-not-use-shell-build-in.patch | 99 + ...ests-add-missing-TS_CMD_UMOUNT-check.patch | 27 + 0019-tests-add-noskip-commands.patch | 66 + 0020-tests-add-missing-program-checks.patch | 83 + 0021-tests-check-for-tar-and-b-g-zip.patch | 42 + ...sts-make-mount-oloop-use-more-robust.patch | 93 + ...file-descriptor-leak-in-blkid_verify.patch | 87 + ...findmnt-verify-ignore-passno-for-XFS.patch | 73 + ...rtx-don-t-report-ENXIO-as-error-on-d.patch | 41 + ...partx-document-d-vs.-nr-and-fix-test.patch | 59 + ...bmount-improve-mountinfo-reliability.patch | 396 ++ ...mopen-in-more-robust-way-coverity-sc.patch | 53 + ...u-use-the-first-VM-from-proc-sysinfo.patch | 28 + ...sts-lscpu-s390-nested-virtualization.patch | 206 ++ ...fn-don-t-append-extra-tailing-commas.patch | 43 + 0032-tests-add-new-test-for-chfn-gecos.patch | 83 + 0033-tests-update-lscpu-test-for-RHEL8.patch | 83 + ...-sure-we-use-the-same-sizes-for-MD-d.patch | 91 + ...sts-with-metadata-v0.90-as-KNOWN-FAI.patch | 80 + 0036-libblkid-add-BitLocker-detection.patch | 284 ++ ...d-retport-block-size-of-a-filesystem.patch | 1121 ++++++ ...lkid-xfs-fix-sector-size-calculation.patch | 29 + ...-make-flush_line-a-little-bit-robust.patch | 68 + 0040-libmount-improve-smb-2-3-support.patch | 49 + ...-libmount-fix-mount-a-EBUSY-for-cifs.patch | 65 + ...ges-losetup.8-Fix-direct-io-defaults.patch | 31 + ...FLAG_RESET_ON_FORK-for-sched_setattr.patch | 46 + ...ict-reset-on-fork-add-more-info-to-m.patch | 146 + ...no-suid-behavior-on-file-capabilitie.patch | 41 + 0046-lsblk-Fall-back-to-ID_SERIAL.patch | 59 + ...ault-on-PowerPC-systems-with-valid-h.patch | 32 + ...nt-gaps-to-possible-size-when-resize.patch | 33 + ...fix-memory-leak-on-error-before-end-.patch | 116 + ...-lscpu-update-ARM-identifiers-tables.patch | 104 + ...r-on-aarch64-machine-which-doesn-t-h.patch | 214 ++ 0052-lscpu-dmi-split-to-parse-dmi-table.patch | 115 + ...u-add-helper-to-get-physical-sockets.patch | 91 + ...cal-socket-on-aarch64-without-ACPI-P.patch | 51 + ...-arm-read-vendor-and-model-from-BIOS.patch | 137 + 0056-tests-update-sfdisk-resize.patch | 28 + ...at-to-get-the-current-terminal-statu.patch | 52 + ...ion-to-list-all-fs-independent-flags.patch | 212 ++ 0059-nologin-Prevent-error-from-su-c.patch | 83 + ...-ignore-well-known-shell-command-lin.patch | 124 + ...rtcols-introduce-default-sort-column.patch | 213 ++ ...-another-flags-on-MS_REMOUNT-MS_BIND.patch | 120 + 0063-libmount-improve-MS_REC-usage.patch | 135 + ...nsitive-to-another-SIGCHLD-ssi_codes.patch | 49 + ...tition-calculation-for-BLKPG_-ioctls.patch | 60 + ...sk_reread_changes-for-extended-parti.patch | 48 + 0067-logger-fix-size-use-for-stdin.patch | 76 + 0068-fstrim-improve-timer-setting.patch | 32 + ...nt-option-to-set-parent-death-signal.patch | 185 + ...ys-add-sysfs_chrdev_devno_to_devname.patch | 86 + ...-libblkid-check-UBI-char-device-name.patch | 39 + ...ck-device-type-and-name-before-probe.patch | 63 + ...t-all-devices-if-only-garbage-specif.patch | 40 + ...AM-compliance-for-forked-child-in-su.patch | 54 + ...y-LOOP_SET_STATUS64-and-LOOP_SET_BLO.patch | 109 + EMPTY | 1 - adjtime | 2 + sources | 1 + util-linux-60-raw.rules | 8 + util-linux-chsh-chfn.pamd | 6 + util-linux-login.pamd | 17 + util-linux-remote.pamd | 15 + util-linux-runuser-l.pamd | 5 + util-linux-runuser.pamd | 5 + util-linux-su-l.pamd | 6 + util-linux-su.pamd | 15 + util-linux.spec | 3282 +++++++++++++++++ 89 files changed, 11275 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 0000-login-create-var-log-lastlog.patch create mode 100644 0001-libblkid-Check-for-a-secondary-LUKS2-header.patch create mode 100644 0002-losetup-keep-f-and-devname-mutually-exclusive.patch create mode 100644 0003-mount-add-ext4-to-some-places-to-the-man-page.patch create mode 100644 0004-logger-add-S-to-the-man-page.patch create mode 100644 0005-lslogins-add-info-about-single-user-output-mode.patch create mode 100644 0006-lslogins-return-1-on-lslogins-nonexisting.patch create mode 100644 0007-libuuid-fix-name-based-UUIDs.patch create mode 100644 0008-test-update-UUID-v5-tests.patch create mode 100644 0009-tests-enlarge-backing-file-for-fstab-btrfs.patch create mode 100644 0010-tests-make-lsns-netnsid-portable.patch create mode 100644 0011-tests-break-up-large-strings-for-PySys_WriteStdout.patch create mode 100644 0012-libmount-umount-make-mnt_stat_mountpoin-usable-for-r.patch create mode 100644 0013-libfdisk-Fix-multipath-partition-seperators-for-user.patch create mode 100644 0014-blkid-make-PART_ENTRY_-tags-optional-add-no-part-det.patch create mode 100644 0015-tests-add-missing-ts_check_test_command-calls.patch create mode 100644 0016-tests-add-use-system-commands.patch create mode 100644 0017-tests-kill-do-not-use-shell-build-in.patch create mode 100644 0018-tests-add-missing-TS_CMD_UMOUNT-check.patch create mode 100644 0019-tests-add-noskip-commands.patch create mode 100644 0020-tests-add-missing-program-checks.patch create mode 100644 0021-tests-check-for-tar-and-b-g-zip.patch create mode 100644 0022-tests-make-mount-oloop-use-more-robust.patch create mode 100644 0023-libblkid-fix-file-descriptor-leak-in-blkid_verify.patch create mode 100644 0024-findmnt-verify-ignore-passno-for-XFS.patch create mode 100644 0025-partx-don-t-report-ENXIO-as-error-on-d.patch create mode 100644 0026-partx-document-d-vs.-nr-and-fix-test.patch create mode 100644 0027-libmount-improve-mountinfo-reliability.patch create mode 100644 0028-libmount-use-fmemopen-in-more-robust-way-coverity-sc.patch create mode 100644 0029-lscpu-use-the-first-VM-from-proc-sysinfo.patch create mode 100644 0030-tests-lscpu-s390-nested-virtualization.patch create mode 100644 0031-chfn-don-t-append-extra-tailing-commas.patch create mode 100644 0032-tests-add-new-test-for-chfn-gecos.patch create mode 100644 0033-tests-update-lscpu-test-for-RHEL8.patch create mode 100644 0034-tests-fdisk-make-sure-we-use-the-same-sizes-for-MD-d.patch create mode 100644 0035-tests-mark-MD-tests-with-metadata-v0.90-as-KNOWN-FAI.patch create mode 100644 0036-libblkid-add-BitLocker-detection.patch create mode 100644 0037-blkid-retport-block-size-of-a-filesystem.patch create mode 100644 0038-libblkid-xfs-fix-sector-size-calculation.patch create mode 100644 0039-col-make-flush_line-a-little-bit-robust.patch create mode 100644 0040-libmount-improve-smb-2-3-support.patch create mode 100644 0041-libmount-fix-mount-a-EBUSY-for-cifs.patch create mode 100644 0042-Manual-pages-losetup.8-Fix-direct-io-defaults.patch create mode 100644 0043-chrt-use-SCHED_FLAG_RESET_ON_FORK-for-sched_setattr.patch create mode 100644 0044-chrt-don-t-restrict-reset-on-fork-add-more-info-to-m.patch create mode 100644 0045-mount.8-clarify-no-suid-behavior-on-file-capabilitie.patch create mode 100644 0046-lsblk-Fall-back-to-ID_SERIAL.patch create mode 100644 0047-lscpu-avoid-segfault-on-PowerPC-systems-with-valid-h.patch create mode 100644 0048-libfdisk-count-gaps-to-possible-size-when-resize.patch create mode 100644 0049-libmount-parser-fix-memory-leak-on-error-before-end-.patch create mode 100644 0050-lscpu-update-ARM-identifiers-tables.patch create mode 100644 0051-lscpu-use-cluster-on-aarch64-machine-which-doesn-t-h.patch create mode 100644 0052-lscpu-dmi-split-to-parse-dmi-table.patch create mode 100644 0053-lscpu-add-helper-to-get-physical-sockets.patch create mode 100644 0054-lscpu-show-physical-socket-on-aarch64-without-ACPI-P.patch create mode 100644 0055-lscpu-arm-read-vendor-and-model-from-BIOS.patch create mode 100644 0056-tests-update-sfdisk-resize.patch create mode 100644 0057-mesg-use-only-stat-to-get-the-current-terminal-statu.patch create mode 100644 0058-findmnt-add-option-to-list-all-fs-independent-flags.patch create mode 100644 0059-nologin-Prevent-error-from-su-c.patch create mode 100644 0060-nologin-silently-ignore-well-known-shell-command-lin.patch create mode 100644 0061-libsmartcols-introduce-default-sort-column.patch create mode 100644 0062-libmount-accept-another-flags-on-MS_REMOUNT-MS_BIND.patch create mode 100644 0063-libmount-improve-MS_REC-usage.patch create mode 100644 0064-script-be-sensitive-to-another-SIGCHLD-ssi_codes.patch create mode 100644 0065-libfdisk-fix-partition-calculation-for-BLKPG_-ioctls.patch create mode 100644 0066-libfdisk-fix-fdisk_reread_changes-for-extended-parti.patch create mode 100644 0067-logger-fix-size-use-for-stdin.patch create mode 100644 0068-fstrim-improve-timer-setting.patch create mode 100644 0069-setpriv-implement-option-to-set-parent-death-signal.patch create mode 100644 0070-lib-sys-add-sysfs_chrdev_devno_to_devname.patch create mode 100644 0071-libblkid-check-UBI-char-device-name.patch create mode 100644 0072-blkid-check-device-type-and-name-before-probe.patch create mode 100644 0073-blkid-don-t-print-all-devices-if-only-garbage-specif.patch create mode 100644 0074-Complete-Linux-PAM-compliance-for-forked-child-in-su.patch create mode 100644 0075-lib-loopdev-retry-LOOP_SET_STATUS64-and-LOOP_SET_BLO.patch delete mode 100644 EMPTY create mode 100644 adjtime create mode 100644 sources create mode 100644 util-linux-60-raw.rules create mode 100644 util-linux-chsh-chfn.pamd create mode 100644 util-linux-login.pamd create mode 100644 util-linux-remote.pamd create mode 100644 util-linux-runuser-l.pamd create mode 100644 util-linux-runuser.pamd create mode 100644 util-linux-su-l.pamd create mode 100644 util-linux-su.pamd create mode 100644 util-linux.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..36c1fbc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/util-linux-2.32.1.tar.xz diff --git a/0000-login-create-var-log-lastlog.patch b/0000-login-create-var-log-lastlog.patch new file mode 100644 index 0000000..debe2db --- /dev/null +++ b/0000-login-create-var-log-lastlog.patch @@ -0,0 +1,26 @@ +From 2d57cb2d64ba4757dcfd9d0e7ed4873cae8a6fcd Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 20 Jun 2016 11:09:02 +0200 +Subject: [PATCH 0/6] login: create /var/log/lastlog + +Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=151635 +--- + login-utils/login.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/login-utils/login.c b/login-utils/login.c +index 09ee8f8ea..8c9e43292 100644 +--- a/login-utils/login.c ++++ b/login-utils/login.c +@@ -506,7 +506,7 @@ static void log_lastlog(struct login_context *cxt) + sa.sa_handler = SIG_IGN; + sigaction(SIGXFSZ, &sa, &oldsa_xfsz); + +- fd = open(_PATH_LASTLOG, O_RDWR, 0); ++ fd = open(_PATH_LASTLOG, O_RDWR | O_CREAT, 0); + if (fd < 0) + goto done; + +-- +2.14.4 + diff --git a/0001-libblkid-Check-for-a-secondary-LUKS2-header.patch b/0001-libblkid-Check-for-a-secondary-LUKS2-header.patch new file mode 100644 index 0000000..07477ef --- /dev/null +++ b/0001-libblkid-Check-for-a-secondary-LUKS2-header.patch @@ -0,0 +1,123 @@ +From 768b91ef6f68661462494bed800505064eb97bc8 Mon Sep 17 00:00:00 2001 +From: Milan Broz +Date: Wed, 11 Jul 2018 12:34:39 +0200 +Subject: [PATCH 1/6] libblkid: Check for a secondary LUKS2 header. + +This patch adds search for a secondary LUKS2 header, +if the primary one is corrupted. + +This patch is primarily needed for wipefs that should wipe +both signatures (otherwise LUKS2 header recovery can use +secondary header and revert wipefs action). + +Signed-off-by: Milan Broz +Upstream: http://github.com/karelzak/util-linux/commit/8bee1a220db8effbe5a75ba9bc68840e019ea89a +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1595882 +--- + libblkid/src/superblocks/luks.c | 60 ++++++++++++++++++++++++++++++++--------- + 1 file changed, 47 insertions(+), 13 deletions(-) + +diff --git a/libblkid/src/superblocks/luks.c b/libblkid/src/superblocks/luks.c +index bc3d7f558..67d7cfcc5 100644 +--- a/libblkid/src/superblocks/luks.c ++++ b/libblkid/src/superblocks/luks.c +@@ -1,5 +1,6 @@ + /* + * Copyright (C) 2008 Karel Zak ++ * Copyright (C) 2018 Milan Broz + * + * Inspired by libvolume_id by + * Kay Sievers +@@ -29,6 +30,15 @@ + #define LUKS2_CHECKSUM_ALG_L 32 + #define LUKS2_CHECKSUM_L 64 + ++#define LUKS_MAGIC "LUKS\xba\xbe" ++#define LUKS_MAGIC_2 "SKUL\xba\xbe" ++ ++/* Offsets for secondary header (for scan if primary header is corrupted). */ ++#define LUKS2_HDR2_OFFSETS { 0x04000, 0x008000, 0x010000, 0x020000, \ ++ 0x40000, 0x080000, 0x100000, 0x200000, 0x400000 } ++ ++static const uint64_t secondary_offsets[] = LUKS2_HDR2_OFFSETS; ++ + struct luks_phdr { + uint8_t magic[LUKS_MAGIC_L]; + uint16_t version; +@@ -59,18 +69,16 @@ struct luks2_phdr { + /* Padding to 4k, then JSON area */ + } __attribute__ ((packed)); + +-static int probe_luks(blkid_probe pr, const struct blkid_idmag *mag) ++static int luks_attributes(blkid_probe pr, struct luks2_phdr *header, uint64_t offset) + { +- struct luks_phdr *header_v1; +- struct luks2_phdr *header; + int version; ++ struct luks_phdr *header_v1; + +- header = blkid_probe_get_sb(pr, mag, struct luks2_phdr); +- if (header == NULL) +- return errno ? -errno : 1; ++ if (blkid_probe_set_magic(pr, offset, LUKS_MAGIC_L, (unsigned char *) &header->magic)) ++ return BLKID_PROBE_NONE; + + version = be16_to_cpu(header->version); +- blkid_probe_sprintf_version(pr, "%u", be16_to_cpu(header->version)); ++ blkid_probe_sprintf_version(pr, "%u", version); + + if (version == 1) { + header_v1 = (struct luks_phdr *)header; +@@ -84,7 +92,37 @@ static int probe_luks(blkid_probe pr, const struct blkid_idmag *mag) + blkid_probe_set_id_label(pr, "SUBSYSTEM", + (unsigned char *) header->subsystem, LUKS2_LABEL_L); + } +- return 0; ++ ++ return BLKID_PROBE_OK; ++} ++ ++static int probe_luks(blkid_probe pr, const struct blkid_idmag *mag __attribute__((__unused__))) ++{ ++ struct luks2_phdr *header; ++ size_t i; ++ ++ header = (struct luks2_phdr *) blkid_probe_get_buffer(pr, 0, sizeof(struct luks2_phdr)); ++ if (!header) ++ return errno ? -errno : BLKID_PROBE_NONE; ++ ++ if (!memcmp(header->magic, LUKS_MAGIC, LUKS_MAGIC_L)) { ++ /* LUKS primary header was found. */ ++ return luks_attributes(pr, header, 0); ++ } else { ++ /* No primary header, scan for known offsets of LUKS2 secondary header. */ ++ for (i = 0; i < ARRAY_SIZE(secondary_offsets); i++) { ++ header = (struct luks2_phdr *) blkid_probe_get_buffer(pr, ++ secondary_offsets[i], sizeof(struct luks2_phdr)); ++ ++ if (!header) ++ return errno ? -errno : BLKID_PROBE_NONE; ++ ++ if (!memcmp(header->magic, LUKS_MAGIC_2, LUKS_MAGIC_L)) ++ return luks_attributes(pr, header, secondary_offsets[i]); ++ } ++ } ++ ++ return BLKID_PROBE_NONE; + } + + const struct blkid_idinfo luks_idinfo = +@@ -92,9 +130,5 @@ const struct blkid_idinfo luks_idinfo = + .name = "crypto_LUKS", + .usage = BLKID_USAGE_CRYPTO, + .probefunc = probe_luks, +- .magics = +- { +- { .magic = "LUKS\xba\xbe", .len = 6 }, +- { NULL } +- } ++ .magics = BLKID_NONE_MAGIC + }; +-- +2.14.4 + diff --git a/0002-losetup-keep-f-and-devname-mutually-exclusive.patch b/0002-losetup-keep-f-and-devname-mutually-exclusive.patch new file mode 100644 index 0000000..824595b --- /dev/null +++ b/0002-losetup-keep-f-and-devname-mutually-exclusive.patch @@ -0,0 +1,40 @@ +From 315960fa9a89248e9d56682c1915567d38fef431 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Thu, 7 Jun 2018 12:05:08 +0200 +Subject: [PATCH 2/6] losetup: keep -f and mutually exclusive + +losetup tries to blindly use specified device as well as search for +the first free device, the result is: + + # losetup /dev/loop1 -f /tmp/tfile_loop1 + losetup: /dev/loop1: failed to set up loop device: Invalid argument + +fixed version: + + # losetup /dev/loop10 -f img + losetup: unexpected arguments + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614364 +Upstream: http://github.com/karelzak/util-linux/commit/c3f5a0f1d47dbc47f6d21da232d4eb1cfb7905db +Signed-off-by: Karel Zak +--- + sys-utils/losetup.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/sys-utils/losetup.c b/sys-utils/losetup.c +index 9c479c02d..e80ceacce 100644 +--- a/sys-utils/losetup.c ++++ b/sys-utils/losetup.c +@@ -749,6 +749,9 @@ int main(int argc, char **argv) + */ + act = A_CREATE; + file = argv[optind++]; ++ ++ if (optind < argc) ++ errx(EXIT_FAILURE, _("unexpected arguments")); + } + + if (list && !act && optind == argc) +-- +2.14.4 + diff --git a/0003-mount-add-ext4-to-some-places-to-the-man-page.patch b/0003-mount-add-ext4-to-some-places-to-the-man-page.patch new file mode 100644 index 0000000..4cd8bee --- /dev/null +++ b/0003-mount-add-ext4-to-some-places-to-the-man-page.patch @@ -0,0 +1,55 @@ +From 4859f218a3be0ae90908fc0ddbef498a784e9b24 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 10 Aug 2018 16:27:41 +0200 +Subject: [PATCH 3/6] mount: add ext4 to some places to the man page + +Upstream: http://github.com/karelzak/util-linux/commit/d901e4275f7c1899518bab3b34424c90af8dc35e +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614852 +--- + sys-utils/mount.8 | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/sys-utils/mount.8 b/sys-utils/mount.8 +index 562ecb187..1cc792979 100644 +--- a/sys-utils/mount.8 ++++ b/sys-utils/mount.8 +@@ -880,7 +880,7 @@ output for extN filesystems). + The following options apply to any filesystem that is being + mounted (but not every filesystem actually honors them \(en e.g.\&, the + .B sync +-option today has an effect only for ext2, ext3, fat, vfat and ufs): ++option today has an effect only for ext2, ext3, ext4, fat, vfat and ufs): + + .TP + .B async +@@ -916,7 +916,8 @@ The + .B context= + option is useful when mounting filesystems that do not support + extended attributes, such as a floppy or hard disk formatted with VFAT, or +-systems that are not normally running under SELinux, such as an ext3 formatted ++systems that are not normally running under SELinux, such as an ext3 or ext4 formatted ++ + disk from a non-SELinux workstation. You can also use + .B context= + on filesystems you do not trust, such as a floppy. It also helps in compatibility with +@@ -2314,7 +2315,7 @@ not specified or the filesystem is known for libblkid, for example: + .sp + .B "mount /tmp/disk.img /mnt" + .sp +-.B "mount \-t ext3 /tmp/disk.img /mnt" ++.B "mount \-t ext4 /tmp/disk.img /mnt" + .sp + .RE + This type of mount knows about three options, namely +@@ -2462,7 +2463,7 @@ It is possible for a corrupted filesystem to cause a crash. + .PP + Some Linux filesystems don't support + .BR "\-o sync " nor " \-o dirsync" +-(the ext2, ext3, fat and vfat filesystems ++(the ext2, ext3, ext4, fat and vfat filesystems + .I do + support synchronous updates (a la BSD) when mounted with the + .B sync +-- +2.14.4 + diff --git a/0004-logger-add-S-to-the-man-page.patch b/0004-logger-add-S-to-the-man-page.patch new file mode 100644 index 0000000..5d19e66 --- /dev/null +++ b/0004-logger-add-S-to-the-man-page.patch @@ -0,0 +1,29 @@ +From 56b9e31e6b9864bba07a25d2244ca0006eed5bb5 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 10 Aug 2018 16:55:14 +0200 +Subject: [PATCH 4/6] logger: add -S to the man page + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614843 +Upstream: http://github.com/karelzak/util-linux/commit/1f6583930b1061c5e79e09a9f2e80caaf9eeb405 +Reported-by: Radka Skvarilova +Signed-off-by: Karel Zak +--- + misc-utils/logger.1 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/misc-utils/logger.1 b/misc-utils/logger.1 +index f121c4dc9..f9655978d 100644 +--- a/misc-utils/logger.1 ++++ b/misc-utils/logger.1 +@@ -224,7 +224,7 @@ produces: + .fi + .IP + .TP +-.BR \-\-size " \fIsize ++.BR \-S , " -\-size " \fIsize + Sets the maximum permitted message size to \fIsize\fR. The default + is 1KiB characters, which is the limit traditionally used and specified + in RFC 3164. With RFC 5424, this limit has become flexible. A good assumption +-- +2.14.4 + diff --git a/0005-lslogins-add-info-about-single-user-output-mode.patch b/0005-lslogins-add-info-about-single-user-output-mode.patch new file mode 100644 index 0000000..9fed222 --- /dev/null +++ b/0005-lslogins-add-info-about-single-user-output-mode.patch @@ -0,0 +1,76 @@ +From e73085fe74356df96b0e694c906f22f9c71a56c7 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 13 Aug 2018 13:49:26 +0200 +Subject: [PATCH 5/6] lslogins: add info about single-user output mode + +The supported command line synopsis is also + + lslogins foo + +and it provides different output than + + lslogins -l foo + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614967 +Signed-off-by: Karel Zak +--- + login-utils/lslogins.1 | 11 ++++++++++- + login-utils/lslogins.c | 2 +- + 2 files changed, 11 insertions(+), 2 deletions(-) + +diff --git a/login-utils/lslogins.1 b/login-utils/lslogins.1 +index bd6955f82..effd42790 100644 +--- a/login-utils/lslogins.1 ++++ b/login-utils/lslogins.1 +@@ -9,10 +9,17 @@ lslogins \- display information about known users in the system + .RB [ \-s | \-u [ =\fIUID ]] + .RB [ \-g " \fIgroups\fR]" + .RB [ \-l " \fIlogins\fR]" ++.RB [\fIusername\fR] + .SH DESCRIPTION + .PP + Examine the wtmp and btmp logs, /etc/shadow (if necessary) and /etc/passwd + and output the desired data. ++ ++The optional argument \fIusername\fR forces ++.BR lslogins ++to print all available details about the specified user only. In this case the ++output format is different than in case of \fB\-l\fR or \fB\-g\fR. ++ + .PP + The default action is to list info about all the users in the system. + .SH OPTIONS +@@ -39,7 +46,8 @@ Show information about supplementary groups. + .TP + \fB\-g\fR, \fB\-\-groups\fR=\fIgroups\fR + Only show data of users belonging to \fIgroups\fR. More than one group +-may be specified; the list has to be comma-separated. ++may be specified; the list has to be comma-separated. The unknown group ++names are ignored. + + Note that relation between user and group may be invisible for primary group if + the user is not explicitly specify as group member (e.g. in /etc/group). If the +@@ -55,6 +63,7 @@ Display data containing information about the users' last login sessions. + \fB\-l\fR, \fB\-\-logins\fR=\fIlogins\fR + Only show data of users with a login specified in \fIlogins\fR (user names or user + IDS). More than one login may be specified; the list has to be comma-separated. ++The unknown login names are ignored. + .TP + \fB\-n\fR, \fB\-\-newline\fR + Display each piece of information on a separate line. +diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c +index 169962b72..501778e54 100644 +--- a/login-utils/lslogins.c ++++ b/login-utils/lslogins.c +@@ -1293,7 +1293,7 @@ static void __attribute__((__noreturn__)) usage(void) + size_t i; + + fputs(USAGE_HEADER, out); +- fprintf(out, _(" %s [options]\n"), program_invocation_short_name); ++ fprintf(out, _(" %s [options] []\n"), program_invocation_short_name); + + fputs(USAGE_SEPARATOR, out); + fputs(_("Display information about known users in the system.\n"), out); +-- +2.14.4 + diff --git a/0006-lslogins-return-1-on-lslogins-nonexisting.patch b/0006-lslogins-return-1-on-lslogins-nonexisting.patch new file mode 100644 index 0000000..6a665f6 --- /dev/null +++ b/0006-lslogins-return-1-on-lslogins-nonexisting.patch @@ -0,0 +1,105 @@ +From 0aa9097f9ecee3688b8659d7f7414f5fb26e147a Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 13 Aug 2018 14:16:28 +0200 +Subject: [PATCH 6/6] lslogins: return 1 on "lslogins nonexisting" + +The default behavior for -l and -g is to silently ignore unknown login +names, but this is very confusing when you explicitly specify just one +login name. + +Note that the current implementation also prints empty "Last log" for +nonexisting user. It seems ugly. + + # lslogins nonexisting + + Last logs: + +new version: + + # lslogins nonexisting + lt-lslogins: cannot found 'nonexisting' + # echo $? + 1 + +The -l and -g behaviour has not been changed. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614967 +Signed-off-by: Karel Zak +--- + login-utils/lslogins.1 | 3 ++- + login-utils/lslogins.c | 16 +++++++++++++--- + 2 files changed, 15 insertions(+), 4 deletions(-) + +diff --git a/login-utils/lslogins.1 b/login-utils/lslogins.1 +index effd42790..c831739d9 100644 +--- a/login-utils/lslogins.1 ++++ b/login-utils/lslogins.1 +@@ -18,7 +18,8 @@ and output the desired data. + The optional argument \fIusername\fR forces + .BR lslogins + to print all available details about the specified user only. In this case the +-output format is different than in case of \fB\-l\fR or \fB\-g\fR. ++output format is different than in case of \fB\-l\fR or \fB\-g\fR and unknown ++is \fIusername\fR reported as an error. + + .PP + The default action is to list info about all the users in the system. +diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c +index 501778e54..6f804aa35 100644 +--- a/login-utils/lslogins.c ++++ b/login-utils/lslogins.c +@@ -266,6 +266,7 @@ struct lslogins_control { + const char *journal_path; + + unsigned int selinux_enabled : 1, ++ fail_on_unknown : 1, /* fail if user does not exist */ + ulist_on : 1, + noheadings : 1, + notrunc : 1; +@@ -653,6 +654,7 @@ static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const c + uid_t uid; + errno = 0; + ++ errno = 0; + pwd = username ? getpwnam(username) : getpwent(); + if (!pwd) + return NULL; +@@ -675,6 +677,7 @@ static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const c + return NULL; + } + ++ errno = 0; + grp = getgrgid(pwd->pw_gid); + if (!grp) + return NULL; +@@ -965,10 +968,16 @@ static int create_usertree(struct lslogins_control *ctl) + + if (ctl->ulist_on) { + for (n = 0; n < ctl->ulsiz; n++) { +- if (get_user(ctl, &user, ctl->ulist[n])) ++ int rc = get_user(ctl, &user, ctl->ulist[n]); ++ ++ if (ctl->fail_on_unknown && !user) { ++ warnx(_("cannot found '%s'"), ctl->ulist[n]); ++ return -1; ++ } ++ if (rc || !user) + continue; +- if (user) /* otherwise an invalid user name has probably been given */ +- tsearch(user, &ctl->usertree, cmp_uid); ++ ++ tsearch(user, &ctl->usertree, cmp_uid); + } + } else { + while ((user = get_next_user(ctl))) +@@ -1518,6 +1527,7 @@ int main(int argc, char *argv[]) + errx(EXIT_FAILURE, _("Only one user may be specified. Use -l for multiple users.")); + logins = argv[optind]; + outmode = OUT_PRETTY; ++ ctl->fail_on_unknown = 1; + } else if (argc != optind) + errx(EXIT_FAILURE, _("Only one user may be specified. Use -l for multiple users.")); + +-- +2.14.4 + diff --git a/0007-libuuid-fix-name-based-UUIDs.patch b/0007-libuuid-fix-name-based-UUIDs.patch new file mode 100644 index 0000000..53b7144 --- /dev/null +++ b/0007-libuuid-fix-name-based-UUIDs.patch @@ -0,0 +1,115 @@ +From f942ba2c4c14b6bf7720e8316afe1971231553bc Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 31 Aug 2018 12:27:32 +0200 +Subject: [PATCH 7/8] libuuid: fix name-based UUIDs + +The current version is not fully compatible with RFC4122. It +incorrectly encodes UUID variant + + xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx + +where M is UUID version and N is UUID variant. + + $ python -c "import uuid ; print(uuid.uuid5(uuid.UUID(int=0), 'foo'))" + aa752cea-8222-5bc8-acd9-555b090c0ccb + ^^ + +Old version: + + $ uuidgen --namespace 00000000-0000-0000-0000-000000000000 --name 'foo' --sha1 + aa752cea-8222-5bc8-8cd9-555b090c0ccb + ^^ + +Fixed version: + ./uuidgen --namespace 00000000-0000-0000-0000-000000000000 --name 'foo' --sha1; + aa752cea-8222-5bc8-acd9-555b090c0ccb + ^^ + +The patch uses uuid_unpack and uuid_pack. It makes code more readable +and allow to access proper octens. The same way we already use for +time and random based UUIDs. + +Upstream: http://github.com/karelzak/util-linux/commit/d6ddf07d31dfdc894eb8e7e6842aa856342c526e +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1624877 +Addresses: https://github.com/karelzak/util-linux/issues/683 +Signed-off-by: Karel Zak +--- + libuuid/src/gen_uuid.c | 34 ++++++++++++++++------------------ + 1 file changed, 16 insertions(+), 18 deletions(-) + +diff --git a/libuuid/src/gen_uuid.c b/libuuid/src/gen_uuid.c +index a374e75c9..27c135db5 100644 +--- a/libuuid/src/gen_uuid.c ++++ b/libuuid/src/gen_uuid.c +@@ -96,9 +96,6 @@ + #define THREAD_LOCAL static + #endif + +-/* index with UUID_VARIANT_xxx and shift 5 bits */ +-static unsigned char variant_bits[] = { 0x00, 0x04, 0x06, 0x07 }; +- + #ifdef _WIN32 + static void gettimeofday (struct timeval *tv, void *dummy) + { +@@ -566,21 +563,22 @@ void uuid_generate_md5(uuid_t out, const uuid_t ns, const char *name, size_t len + { + UL_MD5_CTX ctx; + char hash[UL_MD5LENGTH]; ++ uuid_t buf; ++ struct uuid uu; + + ul_MD5Init(&ctx); +- /* hash concatenation of well-known UUID with name */ + ul_MD5Update(&ctx, ns, sizeof(uuid_t)); + ul_MD5Update(&ctx, (const unsigned char *)name, len); +- + ul_MD5Final((unsigned char *)hash, &ctx); + +- memcpy(out, hash, sizeof(uuid_t)); ++ assert(sizeof(buf) <= sizeof(hash)); + +- out[6] &= ~(UUID_TYPE_MASK << UUID_TYPE_SHIFT); +- out[6] |= (UUID_TYPE_DCE_MD5 << UUID_TYPE_SHIFT); ++ memcpy(buf, hash, sizeof(buf)); ++ uuid_unpack(buf, &uu); + +- out[8] &= ~(UUID_VARIANT_MASK << UUID_VARIANT_SHIFT); +- out[8] |= (variant_bits[UUID_VARIANT_DCE] << UUID_VARIANT_SHIFT); ++ uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000; ++ uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) | 0x3000; ++ uuid_pack(&uu, out); + } + + /* +@@ -591,20 +589,20 @@ void uuid_generate_sha1(uuid_t out, const uuid_t ns, const char *name, size_t le + { + UL_SHA1_CTX ctx; + char hash[UL_SHA1LENGTH]; ++ uuid_t buf; ++ struct uuid uu; + + ul_SHA1Init(&ctx); +- /* hash concatenation of well-known UUID with name */ + ul_SHA1Update(&ctx, ns, sizeof(uuid_t)); + ul_SHA1Update(&ctx, (const unsigned char *)name, len); +- + ul_SHA1Final((unsigned char *)hash, &ctx); + +- memcpy(out, hash, sizeof(uuid_t)); ++ assert(sizeof(buf) <= sizeof(hash)); + +- out[6] &= ~(UUID_TYPE_MASK << UUID_TYPE_SHIFT); +- out[6] |= (UUID_TYPE_DCE_SHA1 << UUID_TYPE_SHIFT); ++ memcpy(buf, hash, sizeof(buf)); ++ uuid_unpack(buf, &uu); + +- out[8] &= ~(UUID_VARIANT_MASK << UUID_VARIANT_SHIFT); +- out[8] |= (variant_bits[UUID_VARIANT_DCE] << UUID_VARIANT_SHIFT); ++ uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000; ++ uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) | 0x5000; ++ uuid_pack(&uu, out); + } +- +-- +2.14.4 + diff --git a/0008-test-update-UUID-v5-tests.patch b/0008-test-update-UUID-v5-tests.patch new file mode 100644 index 0000000..5d134ee --- /dev/null +++ b/0008-test-update-UUID-v5-tests.patch @@ -0,0 +1,25 @@ +From 2f75c4cdf6992af034bf02de55ad2ea90608e1c0 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 31 Aug 2018 12:48:46 +0200 +Subject: [PATCH 8/8] test: update UUID v5 tests + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1624877 +Upstream: http://github.com/karelzak/util-linux/commit/7edaf221d610309874e866670dceb4e2f3a04070 +Signed-off-by: Karel Zak +--- + tests/expected/uuid/oids | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/expected/uuid/oids b/tests/expected/uuid/oids +index 4644848e8..c121cbeee 100644 +--- a/tests/expected/uuid/oids ++++ b/tests/expected/uuid/oids +@@ -1,4 +1,4 @@ + 3d813cbb-47fb-32ba-91df-831e1593ac29 + 5df41881-3aed-3515-88a7-2f4a814cf09e + 2ed6657d-e927-568b-95e1-2665a8aea6a2 +-fcdc2122-78d2-59f7-91ed-041a561ef652 ++fcdc2122-78d2-59f7-b1ed-041a561ef652 +-- +2.14.4 + diff --git a/0009-tests-enlarge-backing-file-for-fstab-btrfs.patch b/0009-tests-enlarge-backing-file-for-fstab-btrfs.patch new file mode 100644 index 0000000..b5c9040 --- /dev/null +++ b/0009-tests-enlarge-backing-file-for-fstab-btrfs.patch @@ -0,0 +1,30 @@ +From a0753a5452e293da56e1e8579d17b4eb19a7d6a2 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 30 Nov 2018 12:22:48 +0100 +Subject: [PATCH 09/14] tests: enlarge backing file for fstab-btrfs + +It seems the new limit for Btrfs is 47MiB. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1656437 +Upstream: http://github.com/karelzak/util-linux/commit/7174b93dfda08f87228bb7aec6274fe60af581bd +Signed-off-by: Karel Zak +--- + tests/ts/mount/fstab-btrfs | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/ts/mount/fstab-btrfs b/tests/ts/mount/fstab-btrfs +index 090f52304..54c6bb8ba 100755 +--- a/tests/ts/mount/fstab-btrfs ++++ b/tests/ts/mount/fstab-btrfs +@@ -42,7 +42,7 @@ TS_MOUNTPOINT_SUBVOL="$TS_MOUNTPOINT-subvol" + TS_MOUNTPOINT_SUBVOLID="$TS_MOUNTPOINT-subvolid" + TS_MOUNTPOINT_BIND="$TS_MOUNTPOINT-bind" + +-ts_device_init 42 ++ts_device_init 50 + DEVICE=$TS_LODEV + [ -d "$TS_MOUNTPOINT_CREATE" ] || mkdir -p "$TS_MOUNTPOINT_CREATE" + [ -d "$TS_MOUNTPOINT_DEFAULT" ] || mkdir -p "$TS_MOUNTPOINT_DEFAULT" +-- +2.17.2 + diff --git a/0010-tests-make-lsns-netnsid-portable.patch b/0010-tests-make-lsns-netnsid-portable.patch new file mode 100644 index 0000000..691fd15 --- /dev/null +++ b/0010-tests-make-lsns-netnsid-portable.patch @@ -0,0 +1,81 @@ +From b48e972b3aa32710ed0495c35b2184f5d3ec9eb0 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 30 Nov 2018 12:24:15 +0100 +Subject: [PATCH 10/14] tests: make lsns-netnsid portable + +It seems ip(8) link-show command does not provide link-netnsid in all +cases (versions ?). Let's try to use "ip netns list-id" as fallback. + +This commit also add possibility to debug the script by $LOG variable. + +Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1656437 +Upstream: http://github.com/karelzak/util-linux/commit/0d79f5805ff2d7651ec70b06753e908cc782857a +Signed-off-by: Karel Zak +--- + tests/ts/lsns/netnsid | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +diff --git a/tests/ts/lsns/netnsid b/tests/ts/lsns/netnsid +index 72c14de6c..9d04f28f0 100755 +--- a/tests/ts/lsns/netnsid ++++ b/tests/ts/lsns/netnsid +@@ -36,6 +36,7 @@ vethb=lsns-vethb + NS=LSNS-TEST-NETNSID-NS + FIFO=$TS_OUTDIR/FIFO-NETNSID + NULL=/dev/null ++LOG=/dev/null #/root/foo.log + + function cleanup { + ip link delete $vetha 2> $NULL || : +@@ -43,24 +44,47 @@ function cleanup { + rm -f $FIFO + } + ++echo "==Cleanup" >> $LOG + cleanup ++ ++echo "==Create FIFO" >> $LOG + mkfifo $FIFO + ++echo "==Netns ADD" >> $LOG + if ip netns add $NS && + ip link add name $vetha type veth peer name $vethb && + ip link set $vethb netns $NS; then ++ echo "===Netns EXEC" >> $LOG + ip netns exec $NS dd if=$FIFO bs=1 count=2 of=$NULL 2> $NULL & + PID=$! ++ echo "====PID=$PID" >> $LOG + else + cleanup + ts_skip "failed to initialize" + fi + { ++ echo "==Write to FIFO" >> $LOG + dd if=/dev/zero bs=1 count=1 2> $NULL + { +- ip -o link show dev $vetha > $NULL ++ echo "===IP output" >> $LOG ++ ip -o link show dev $vetha >> $LOG ++ + IP_ID=$(ip -o link show dev $vetha | sed -ne 's/.* *link-netnsid *\([0-9]*\)/\1/p') ++ echo "====ip show: IP_ID=$IP_ID" >> $LOG ++ ++ if [ "x$IP_ID" = "x" ]; then ++ echo "===IP output list id" >> $LOG ++ ip netns list-id >> $LOG ++ ++ IP_ID=$(ip netns list-id | awk "/name: $NS/ { print \$2 }") ++ echo "====ip list-id: IP_ID=$IP_ID" >> $LOG ++ fi ++ ++ echo "===LSNS output" >> $LOG ++ $TS_CMD_LSNS -o+NETNSID,NSFS --type net >> $LOG ++ + LSNS_ID=$($TS_CMD_LSNS -n -o NETNSID --type net --task $PID | { read VAL; echo $VAL; } ) ++ echo "===LSNS_ID=$LSNS_ID" >> $LOG + } + dd if=/dev/zero bs=1 count=1 2> $NULL + } > $FIFO +-- +2.17.2 + diff --git a/0011-tests-break-up-large-strings-for-PySys_WriteStdout.patch b/0011-tests-break-up-large-strings-for-PySys_WriteStdout.patch new file mode 100644 index 0000000..a293dc3 --- /dev/null +++ b/0011-tests-break-up-large-strings-for-PySys_WriteStdout.patch @@ -0,0 +1,111 @@ +From c2b650ebe33a001b3bf19912b136dbbff5495600 Mon Sep 17 00:00:00 2001 +From: Frank Schaefer +Date: Tue, 10 Jul 2018 20:21:02 -0500 +Subject: [PATCH 11/14] tests: break up large strings for PySys_WriteStdout() + +Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1656437 +Upstream: http://github.com/karelzak/util-linux/commit/8a12ab57755afc36546834f175ef0b9e9376ba59 +Signed-off-by: Karel Zak +--- + libmount/python/fs.c | 56 ++++++++++++++++++++++++++++++++++---------- + 1 file changed, 43 insertions(+), 13 deletions(-) + +diff --git a/libmount/python/fs.c b/libmount/python/fs.c +index d6490d248..634a914ef 100644 +--- a/libmount/python/fs.c ++++ b/libmount/python/fs.c +@@ -63,32 +63,62 @@ static PyObject *Fs_get_devno(FsObject *self) + return PyObjectResultInt(mnt_fs_get_devno(self->fs)); + } + ++static void _dump_debug_string(const char *lead, const char *s, char quote) ++{ ++ /* PySys_WriteStdout() will automatically truncate any '%s' token ++ * longer than a certain length (documented as 1000 bytes, but we ++ * give ourselves some margin here just in case). The only way I ++ * know to get around this is to print such strings in bite-sized ++ * chunks. ++ */ ++ static const unsigned int _PY_MAX_LEN = 900; ++ static const char *_PY_MAX_LEN_FMT = "%.900s"; ++ unsigned int len; ++ ++ if (lead != NULL) ++ PySys_WriteStdout("%s", lead); ++ ++ if (quote != 0) ++ PySys_WriteStdout("%c", quote); ++ ++ for (len = strlen(s); len > _PY_MAX_LEN; len -= _PY_MAX_LEN, s += _PY_MAX_LEN) ++ PySys_WriteStdout(_PY_MAX_LEN_FMT, s); ++ ++ if (len > 0) ++ PySys_WriteStdout(_PY_MAX_LEN_FMT, s); ++ ++ if (quote != 0) ++ PySys_WriteStdout("%c\n", quote); ++ else ++ PySys_WriteStdout("\n"); ++} ++ + #define Fs_print_debug_HELP "print_debug()\n\n" + static PyObject *Fs_print_debug(FsObject *self) + { + PySys_WriteStdout("------ fs: %p\n", self->fs); +- PySys_WriteStdout("source: %s\n", mnt_fs_get_source(self->fs)); +- PySys_WriteStdout("target: %s\n", mnt_fs_get_target(self->fs)); +- PySys_WriteStdout("fstype: %s\n", mnt_fs_get_fstype(self->fs)); ++ _dump_debug_string("source: ", mnt_fs_get_source(self->fs), 0); ++ _dump_debug_string("target: ", mnt_fs_get_target(self->fs), 0); ++ _dump_debug_string("fstype: ", mnt_fs_get_fstype(self->fs), 0); + + if (mnt_fs_get_options(self->fs)) +- PySys_WriteStdout("optstr: %s\n", mnt_fs_get_options(self->fs)); ++ _dump_debug_string("optstr: ", mnt_fs_get_options(self->fs), 0); + if (mnt_fs_get_vfs_options(self->fs)) +- PySys_WriteStdout("VFS-optstr: %s\n", mnt_fs_get_vfs_options(self->fs)); ++ _dump_debug_string("VFS-optstr: ", mnt_fs_get_vfs_options(self->fs), 0); + if (mnt_fs_get_fs_options(self->fs)) +- PySys_WriteStdout("FS-opstr: %s\n", mnt_fs_get_fs_options(self->fs)); ++ _dump_debug_string("FS-opstr: ", mnt_fs_get_fs_options(self->fs), 0); + if (mnt_fs_get_user_options(self->fs)) +- PySys_WriteStdout("user-optstr: %s\n", mnt_fs_get_user_options(self->fs)); ++ _dump_debug_string("user-optstr: ", mnt_fs_get_user_options(self->fs), 0); + if (mnt_fs_get_optional_fields(self->fs)) +- PySys_WriteStdout("optional-fields: '%s'\n", mnt_fs_get_optional_fields(self->fs)); ++ _dump_debug_string("optional-fields: ", mnt_fs_get_optional_fields(self->fs), '\''); + if (mnt_fs_get_attributes(self->fs)) +- PySys_WriteStdout("attributes: %s\n", mnt_fs_get_attributes(self->fs)); ++ _dump_debug_string("attributes: ", mnt_fs_get_attributes(self->fs), 0); + + if (mnt_fs_get_root(self->fs)) +- PySys_WriteStdout("root: %s\n", mnt_fs_get_root(self->fs)); ++ _dump_debug_string("root: ", mnt_fs_get_root(self->fs), 0); + + if (mnt_fs_get_swaptype(self->fs)) +- PySys_WriteStdout("swaptype: %s\n", mnt_fs_get_swaptype(self->fs)); ++ _dump_debug_string("swaptype: ", mnt_fs_get_swaptype(self->fs), 0); + if (mnt_fs_get_size(self->fs)) + PySys_WriteStdout("size: %jd\n", mnt_fs_get_size(self->fs)); + if (mnt_fs_get_usedsize(self->fs)) +@@ -97,7 +127,7 @@ static PyObject *Fs_print_debug(FsObject *self) + PySys_WriteStdout("priority: %d\n", mnt_fs_get_priority(self->fs)); + + if (mnt_fs_get_bindsrc(self->fs)) +- PySys_WriteStdout("bindsrc: %s\n", mnt_fs_get_bindsrc(self->fs)); ++ _dump_debug_string("bindsrc: ", mnt_fs_get_bindsrc(self->fs), 0); + if (mnt_fs_get_freq(self->fs)) + PySys_WriteStdout("freq: %d\n", mnt_fs_get_freq(self->fs)); + if (mnt_fs_get_passno(self->fs)) +@@ -112,7 +142,7 @@ static PyObject *Fs_print_debug(FsObject *self) + if (mnt_fs_get_tid(self->fs)) + PySys_WriteStdout("tid: %d\n", mnt_fs_get_tid(self->fs)); + if (mnt_fs_get_comment(self->fs)) +- PySys_WriteStdout("comment: '%s'\n", mnt_fs_get_comment(self->fs)); ++ _dump_debug_string("comment: ", mnt_fs_get_comment(self->fs), '\''); + return UL_IncRef(self); + } + /* +-- +2.17.2 + diff --git a/0012-libmount-umount-make-mnt_stat_mountpoin-usable-for-r.patch b/0012-libmount-umount-make-mnt_stat_mountpoin-usable-for-r.patch new file mode 100644 index 0000000..bc637b3 --- /dev/null +++ b/0012-libmount-umount-make-mnt_stat_mountpoin-usable-for-r.patch @@ -0,0 +1,33 @@ +From 0afd0613fc738659fb0ff490e4e069366dee4a94 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 10 Dec 2018 16:25:08 +0100 +Subject: [PATCH 12/14] libmount: (umount) make mnt_stat_mountpoin() usable for + relative paths + + # mount -o loop devicefile /mnt/test + # umount devicefile + umount: devicefile: not mounted. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1653781 +Upstream: http://github.com/karelzak/util-linux/commit/2859592ecb7b48d47d2e34d589ea35f76e329416 +Signed-off-by: Karel Zak +--- + libmount/src/utils.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libmount/src/utils.c b/libmount/src/utils.c +index fd98d0529..c36187c07 100644 +--- a/libmount/src/utils.c ++++ b/libmount/src/utils.c +@@ -121,7 +121,7 @@ static int fstype_cmp(const void *v1, const void *v2) + int mnt_stat_mountpoint(const char *target, struct stat *st) + { + #ifdef AT_NO_AUTOMOUNT +- return fstatat(-1, target, st, AT_NO_AUTOMOUNT); ++ return fstatat(AT_FDCWD, target, st, AT_NO_AUTOMOUNT); + #else + return stat(target, st); + #endif +-- +2.17.2 + diff --git a/0013-libfdisk-Fix-multipath-partition-seperators-for-user.patch b/0013-libfdisk-Fix-multipath-partition-seperators-for-user.patch new file mode 100644 index 0000000..cb36706 --- /dev/null +++ b/0013-libfdisk-Fix-multipath-partition-seperators-for-user.patch @@ -0,0 +1,65 @@ +From 5aea6937edf77a753e0d504bb637214e116aaed2 Mon Sep 17 00:00:00 2001 +From: KyleMahlkuch +Date: Mon, 25 Jun 2018 14:52:01 -0500 +Subject: [PATCH 13/14] libfdisk: Fix multipath partition seperators for + user-friendly names + +The current code assumes "-part" is the only partition sepereator +but this is not true for some distros. + +For example in Ubuntu 18.04 fdisk does not print the correct names for +mpatha: + +~# ls -l /dev/mapper/mpatha* +lrwxrwxrwx 1 root root 7 Feb 1 04:39 /dev/mapper/mpatha -> ../dm-0 +lrwxrwxrwx 1 root root 7 Feb 1 04:38 /dev/mapper/mpatha1 -> ../dm-4 +lrwxrwxrwx 1 root root 7 Feb 1 04:38 /dev/mapper/mpatha2 -> ../dm-5 +lrwxrwxrwx 1 root root 7 Feb 1 04:38 /dev/mapper/mpatha3 -> ../dm-6 + +~# fdisk -l /dev/mapper/mpatha +Device Boot Start End Sectors Size Id Type +/dev/mapper/mpatha-part1 2048 419432447 419430400 200G 83 Linux +/dev/mapper/mpatha-part2 419432448 838862847 419430400 200G 83 Linux +/dev/mapper/mpatha-part3 838862848 1258291199 419428352 200G 83 Linux + +Instead of assuming a partition seperator of "-part" this patch uses +access to check the file system for a partition seperator of "p" or +the absense of a partition seperator. If neither of these work the patch +defaults to "-part" like we had before this patch. + +Upstream: http://github.com/karelzak/util-linux/commit/73775189767195f1d9f5b6b6f6a54e51f61c4356 +Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1655650 +Signed-off-by: Karel Zak +--- + libfdisk/src/utils.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/libfdisk/src/utils.c b/libfdisk/src/utils.c +index 5ba9e0466..54e28b2fa 100644 +--- a/libfdisk/src/utils.c ++++ b/libfdisk/src/utils.c +@@ -153,7 +153,20 @@ char *fdisk_partname(const char *dev, size_t partno) + if ((strncmp(dev, _PATH_DEV_BYID, sizeof(_PATH_DEV_BYID) - 1) == 0) || + strncmp(dev, _PATH_DEV_BYPATH, sizeof(_PATH_DEV_BYPATH) - 1) == 0 || + strncmp(dev, "/dev/mapper", sizeof("/dev/mapper") - 1) == 0) { +- p = "-part"; ++ asprintf(&res, "%.*s%zu", w, dev, partno); ++ if (access(res, F_OK) == 0){ ++ p = ""; ++ } else { ++ /* check for partition seperator "p" */ ++ p = "p"; ++ free(res); ++ asprintf(&res, "%.*s%s%zu", w, dev, p, partno); ++ if (access(res, F_OK) != 0){ ++ /* otherwise, default to "-path" */ ++ p = "-part"; ++ } ++ } ++ free(res); + } + + if (asprintf(&res, "%.*s%s%zu", w, dev, p, partno) <= 0) +-- +2.17.2 + diff --git a/0014-blkid-make-PART_ENTRY_-tags-optional-add-no-part-det.patch b/0014-blkid-make-PART_ENTRY_-tags-optional-add-no-part-det.patch new file mode 100644 index 0000000..755fa4a --- /dev/null +++ b/0014-blkid-make-PART_ENTRY_-tags-optional-add-no-part-det.patch @@ -0,0 +1,136 @@ +From 64473a830dc93e7fcd246a64bb8389d66f0034b8 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Thu, 29 Nov 2018 13:21:36 +0100 +Subject: [PATCH 14/14] blkid: make PART_ENTRY_* tags optional (add + --no-part-details) + +blkid(8) returns information from partition table also for empty +partitions. This is necessary for example for udev, but it could be +confusing if you care about on-device content only. + +Default: + # blkid -p /dev/md0p1; echo $? + /dev/md0p1: PART_ENTRY_SCHEME="dos" PART_ENTRY_UUID="6d8796b1-01" PART_ENTRY_TYPE="0x83" PART_ENTRY_NUMBER="1" PART_ENTRY_OFFSET="2048" PART_ENTRY_SIZE="204800" PART_ENTRY_DISK="9:0" + 0 + +With --no-part-details: + # blkid -p /dev/md0p1 --no-part-details; echo $? + 2 + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1653413 +Upstream: http://github.com/karelzak/util-linux/commit/5e91d5dd716ebc6144bcb0cabb0ec847a678be9e +Signed-off-by: Karel Zak +--- + misc-utils/blkid.8 | 6 +++++- + misc-utils/blkid.c | 15 +++++++++++---- + 2 files changed, 16 insertions(+), 5 deletions(-) + +diff --git a/misc-utils/blkid.8 b/misc-utils/blkid.8 +index 13b5edb4d..d1cec1dea 100644 +--- a/misc-utils/blkid.8 ++++ b/misc-utils/blkid.8 +@@ -35,6 +35,7 @@ blkid \- locate/print block device attributes + .IR list ] + .RB [ \-\-usages + .IR list ] ++.RB [ \-\-no\-part\-details ] + .IR device " ..." + + .IP \fBblkid\fR +@@ -114,6 +115,9 @@ Don't encode non-printing characters. The non-printing characters are encoded + by ^ and M- notation by default. Note that the \fB\-\-output udev\fR output format uses + a different encoding which cannot be disabled. + .TP ++\fB\-D\fR, \fB\-\-no\-part\-details\fR ++Don't print information (PART_ENTRY_* tags) from partition table in low-level probing mode. ++.TP + \fB\-g\fR, \fB\-\-garbage\-collect\fR + Perform a garbage collection pass on the blkid cache to remove + devices which no longer exist. +@@ -224,7 +228,7 @@ Note that low-level probing also returns information about partition table type + (PTTYPE tag) and partitions (PART_ENTRY_* tags). The tag names produced by + low-level probing are based on names used internally by libblkid and it may be + different than when executed without \fB\-\-probe\fR (for example PART_ENTRY_UUID= vs +-PARTUUID=). ++PARTUUID=). See also \fB\-\-no\-part\-details\fR. + .TP + \fB\-s\fR, \fB\-\-match\-tag\fR \fItag\fR + For each (specified) device, show only the tags that match +diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c +index 4cd85317f..61a6994c2 100644 +--- a/misc-utils/blkid.c ++++ b/misc-utils/blkid.c +@@ -58,6 +58,7 @@ struct blkid_control { + lowprobe:1, + lowprobe_superblocks:1, + lowprobe_topology:1, ++ no_part_details:1, + raw_chars:1; + }; + +@@ -101,6 +102,7 @@ static void __attribute__((__noreturn__)) usage(void) + fputs(_( " -O, --offset probe at the given offset\n"), out); + fputs(_( " -u, --usages filter by \"usage\" (e.g. -u filesystem,raid)\n"), out); + fputs(_( " -n, --match-types filter by filesystem type (e.g. -n vfat,ext3)\n"), out); ++ fputs(_( " -D, --no-part-details don't print info from partition table\n"), out); + + fputs(USAGE_SEPARATOR, out); + printf(USAGE_HELP_OPTIONS(28)); +@@ -444,7 +446,7 @@ done: + return rc; + } + +-static int lowprobe_superblocks(blkid_probe pr) ++static int lowprobe_superblocks(blkid_probe pr, struct blkid_control *ctl) + { + struct stat st; + int rc, fd = blkid_probe_get_fd(pr); +@@ -470,7 +472,8 @@ static int lowprobe_superblocks(blkid_probe pr) + return 0; /* partition table detected */ + } + +- blkid_probe_set_partitions_flags(pr, BLKID_PARTS_ENTRY_DETAILS); ++ if (!ctl->no_part_details) ++ blkid_probe_set_partitions_flags(pr, BLKID_PARTS_ENTRY_DETAILS); + blkid_probe_enable_superblocks(pr, 1); + + return blkid_do_safeprobe(pr); +@@ -509,7 +512,7 @@ static int lowprobe_device(blkid_probe pr, const char *devname, + if (ctl->lowprobe_topology) + rc = lowprobe_topology(pr); + if (rc >= 0 && ctl->lowprobe_superblocks) +- rc = lowprobe_superblocks(pr); ++ rc = lowprobe_superblocks(pr, ctl); + if (rc < 0) + goto done; + +@@ -661,6 +664,7 @@ int main(int argc, char **argv) + static const struct option longopts[] = { + { "cache-file", required_argument, NULL, 'c' }, + { "no-encoding", no_argument, NULL, 'd' }, ++ { "no-part-details", no_argument, NULL, 'D' }, + { "garbage-collect", no_argument, NULL, 'g' }, + { "output", required_argument, NULL, 'o' }, + { "list-filesystems", no_argument, NULL, 'k' }, +@@ -694,7 +698,7 @@ int main(int argc, char **argv) + strutils_set_exitcode(BLKID_EXIT_OTHER); + + while ((c = getopt_long (argc, argv, +- "c:dghilL:n:ko:O:ps:S:t:u:U:w:Vv", longopts, NULL)) != -1) { ++ "c:DdghilL:n:ko:O:ps:S:t:u:U:w:Vv", longopts, NULL)) != -1) { + + err_exclusive_options(c, NULL, excl, excl_st); + +@@ -705,6 +709,9 @@ int main(int argc, char **argv) + case 'd': + ctl.raw_chars = 1; + break; ++ case 'D': ++ ctl.no_part_details = 1; ++ break; + case 'L': + ctl.eval = 1; + search_value = xstrdup(optarg); +-- +2.17.2 + diff --git a/0015-tests-add-missing-ts_check_test_command-calls.patch b/0015-tests-add-missing-ts_check_test_command-calls.patch new file mode 100644 index 0000000..f9dcc0e --- /dev/null +++ b/0015-tests-add-missing-ts_check_test_command-calls.patch @@ -0,0 +1,132 @@ +From 9bccbbf06a91f4e7bf5c0cddadf18265dc2e9e4b Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 4 Mar 2019 16:42:30 +0100 +Subject: [PATCH 15/19] tests: add missing ts_check_test_command calls + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062 +Upstream: http://github.com/karelzak/util-linux/commit/19e00ec9e9e9c36305cf2dd163d0333e2d72c671 +Signed-off-by: Karel Zak +--- + tests/ts/fsck/ismounted | 2 ++ + tests/ts/hexdump/format-strings | 1 + + tests/ts/hexdump/highlighting | 1 + + tests/ts/ipcs/limits | 1 + + tests/ts/ipcs/limits2 | 1 + + tests/ts/ipcs/mk-rm-msg | 1 + + tests/ts/ipcs/mk-rm-sem | 1 + + tests/ts/ipcs/mk-rm-shm | 1 + + tests/ts/misc/swaplabel | 1 + + 9 files changed, 10 insertions(+) + +diff --git a/tests/ts/fsck/ismounted b/tests/ts/fsck/ismounted +index 2a55907a7..7d1fe6273 100755 +--- a/tests/ts/fsck/ismounted ++++ b/tests/ts/fsck/ismounted +@@ -22,6 +22,8 @@ ts_init "$*" + + ts_check_test_command "$TS_CMD_FDISK" + ts_check_test_command "$TS_CMD_MOUNT" ++ts_check_test_command "$TS_CMD_UMOUNT" ++ts_check_test_command "$TS_HELPER_ISMOUNTED" + + ts_skip_nonroot + ts_check_losetup +diff --git a/tests/ts/hexdump/format-strings b/tests/ts/hexdump/format-strings +index e6f9229a5..f2dc6a89b 100755 +--- a/tests/ts/hexdump/format-strings ++++ b/tests/ts/hexdump/format-strings +@@ -23,6 +23,7 @@ FILES="$TS_TOPDIR/ts/hexdump/files" + ts_init "$*" + + ts_check_test_command "$TS_CMD_HEXDUMP" ++ts_check_test_command "$TS_HELPER_SYSINFO" + + # on big endian systems some of the subtests have different expected output + BYTE_ORDER=$($TS_HELPER_SYSINFO byte-order) +diff --git a/tests/ts/hexdump/highlighting b/tests/ts/hexdump/highlighting +index cf78f7b96..e57757978 100755 +--- a/tests/ts/hexdump/highlighting ++++ b/tests/ts/hexdump/highlighting +@@ -25,6 +25,7 @@ ADDRFMT='-e "%07.7_Ax\n"' + ts_init "$*" + + ts_check_test_command "$TS_CMD_HEXDUMP" ++ts_check_test_command "$TS_HELPER_SYSINFO" + + # on big endian systems some of the subtests have different expected output + BYTE_ORDER=$($TS_HELPER_SYSINFO byte-order) +diff --git a/tests/ts/ipcs/limits b/tests/ts/ipcs/limits +index 7b64b3c17..671f23c77 100755 +--- a/tests/ts/ipcs/limits ++++ b/tests/ts/ipcs/limits +@@ -23,6 +23,7 @@ TS_DESC="limits overflow" + ts_init "$*" + + ts_check_test_command "$TS_CMD_IPCS" ++ts_check_test_command "$TS_HELPER_SYSINFO" + + ts_skip_nonroot + ts_check_prog "bc" +diff --git a/tests/ts/ipcs/limits2 b/tests/ts/ipcs/limits2 +index d23c41a35..77ad70f9b 100755 +--- a/tests/ts/ipcs/limits2 ++++ b/tests/ts/ipcs/limits2 +@@ -23,6 +23,7 @@ TS_DESC="basic limits" + ts_init "$*" + + ts_check_test_command "$TS_CMD_IPCS" ++ts_check_test_command "$TS_HELPER_SYSINFO" + ts_check_prog "bc" + + . $TS_SELF/functions.sh +diff --git a/tests/ts/ipcs/mk-rm-msg b/tests/ts/ipcs/mk-rm-msg +index 25460e25d..de3682e87 100755 +--- a/tests/ts/ipcs/mk-rm-msg ++++ b/tests/ts/ipcs/mk-rm-msg +@@ -21,6 +21,7 @@ ts_init "$*" + ts_check_test_command "$TS_CMD_IPCS" + ts_check_test_command "$TS_CMD_IPCMK" + ts_check_test_command "$TS_CMD_IPCRM" ++ts_check_test_command "$TS_HELPER_SYSINFO" + + . $TS_SELF/functions.sh + +diff --git a/tests/ts/ipcs/mk-rm-sem b/tests/ts/ipcs/mk-rm-sem +index 61e0cfdef..d7b505f7c 100755 +--- a/tests/ts/ipcs/mk-rm-sem ++++ b/tests/ts/ipcs/mk-rm-sem +@@ -21,6 +21,7 @@ ts_init "$*" + ts_check_test_command "$TS_CMD_IPCS" + ts_check_test_command "$TS_CMD_IPCMK" + ts_check_test_command "$TS_CMD_IPCRM" ++ts_check_test_command "$TS_HELPER_SYSINFO" + + . $TS_SELF/functions.sh + +diff --git a/tests/ts/ipcs/mk-rm-shm b/tests/ts/ipcs/mk-rm-shm +index 838fb3f21..c21547b82 100755 +--- a/tests/ts/ipcs/mk-rm-shm ++++ b/tests/ts/ipcs/mk-rm-shm +@@ -21,6 +21,7 @@ ts_init "$*" + ts_check_test_command "$TS_CMD_IPCS" + ts_check_test_command "$TS_CMD_IPCMK" + ts_check_test_command "$TS_CMD_IPCRM" ++ts_check_test_command "$TS_HELPER_SYSINFO" + + . $TS_SELF/functions.sh + +diff --git a/tests/ts/misc/swaplabel b/tests/ts/misc/swaplabel +index 646304508..22858b0ac 100755 +--- a/tests/ts/misc/swaplabel ++++ b/tests/ts/misc/swaplabel +@@ -20,6 +20,7 @@ ts_init "$*" + + ts_check_test_command "$TS_CMD_MKSWAP" + ts_check_test_command "$TS_CMD_SWAPLABEL" ++ts_check_test_command "$TS_HELPER_SYSINFO" + + # fallocate does not work on most file systems + function fallocate_or_skip() +-- +2.20.1 + diff --git a/0016-tests-add-use-system-commands.patch b/0016-tests-add-use-system-commands.patch new file mode 100644 index 0000000..1e5003a --- /dev/null +++ b/0016-tests-add-use-system-commands.patch @@ -0,0 +1,357 @@ +From 748fbfa9b1bb3b64b3fbc6b1e51d260d8376c791 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 4 Mar 2019 17:10:04 +0100 +Subject: [PATCH 16/19] tests: add --use-system-commands + +This change allows to use commands from $PATH rather than from +$top_builddir. There two basic use cases: + +* check differences between installed and git version + run.sh --use-system-command --show-diff + +* check system binaries by upstream tests (for example tests from + src.rpm package) + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062 +Upstream: http://github.com/karelzak/util-linux/commit/43b4a4d3c720a4e65fe9de884cd73e0b1b94fbe +Signed-off-by: Karel Zak +--- + tests/commands.sh | 194 ++++++++++++++++++++++----------------------- + tests/functions.sh | 34 ++++++-- + tests/run.sh | 33 +++++--- + 3 files changed, 146 insertions(+), 115 deletions(-) + +diff --git a/tests/commands.sh b/tests/commands.sh +index 1be2d25b4..93100caf6 100644 +--- a/tests/commands.sh ++++ b/tests/commands.sh +@@ -2,105 +2,105 @@ + TS_TESTUSER=${TS_TESTUSER:-"nobody"} + + # helpers +-TS_HELPER_BYTESWAP="$top_builddir/test_byteswap" +-TS_HELPER_CPUSET="$top_builddir/test_cpuset" +-TS_HELPER_DMESG="$top_builddir/test_dmesg" +-TS_HELPER_ISLOCAL="$top_builddir/test_islocal" +-TS_HELPER_ISMOUNTED="$top_builddir/test_ismounted" +-TS_HELPER_LIBFDISK_GPT="$top_builddir/test_fdisk_gpt" +-TS_HELPER_LIBFDISK_MKPART="$top_builddir/sample-fdisk-mkpart" +-TS_HELPER_LIBMOUNT_CONTEXT="$top_builddir/test_mount_context" +-TS_HELPER_LIBFDISK_MKPART_FULLSPEC="$top_builddir/sample-fdisk-mkpart-fullspec" +-TS_HELPER_LIBMOUNT_LOCK="$top_builddir/test_mount_lock" +-TS_HELPER_LIBMOUNT_OPTSTR="$top_builddir/test_mount_optstr" +-TS_HELPER_LIBMOUNT_TABDIFF="$top_builddir/test_mount_tab_diff" +-TS_HELPER_LIBMOUNT_TAB="$top_builddir/test_mount_tab" +-TS_HELPER_LIBMOUNT_UPDATE="$top_builddir/test_mount_tab_update" +-TS_HELPER_LIBMOUNT_UTILS="$top_builddir/test_mount_utils" +-TS_HELPER_LIBMOUNT_DEBUG="$top_builddir/test_mount_debug" +-TS_HELPER_LIBSMARTCOLS_FROMFILE="$top_builddir/sample-scols-fromfile" +-TS_HELPER_LIBSMARTCOLS_TITLE="$top_builddir/sample-scols-title" ++TS_HELPER_BYTESWAP="${ts_helpersdir}test_byteswap" ++TS_HELPER_CPUSET="${ts_helpersdir}test_cpuset" ++TS_HELPER_DMESG="${ts_helpersdir}test_dmesg" ++TS_HELPER_ISLOCAL="${ts_helpersdir}test_islocal" ++TS_HELPER_ISMOUNTED="${ts_helpersdir}test_ismounted" ++TS_HELPER_LIBFDISK_GPT="${ts_helpersdir}test_fdisk_gpt" ++TS_HELPER_LIBFDISK_MKPART="${ts_helpersdir}sample-fdisk-mkpart" ++TS_HELPER_LIBMOUNT_CONTEXT="${ts_helpersdir}test_mount_context" ++TS_HELPER_LIBFDISK_MKPART_FULLSPEC="${ts_helpersdir}sample-fdisk-mkpart-fullspec" ++TS_HELPER_LIBMOUNT_LOCK="${ts_helpersdir}test_mount_lock" ++TS_HELPER_LIBMOUNT_OPTSTR="${ts_helpersdir}test_mount_optstr" ++TS_HELPER_LIBMOUNT_TABDIFF="${ts_helpersdir}test_mount_tab_diff" ++TS_HELPER_LIBMOUNT_TAB="${ts_helpersdir}test_mount_tab" ++TS_HELPER_LIBMOUNT_UPDATE="${ts_helpersdir}test_mount_tab_update" ++TS_HELPER_LIBMOUNT_UTILS="${ts_helpersdir}test_mount_utils" ++TS_HELPER_LIBMOUNT_DEBUG="${ts_helpersdir}test_mount_debug" ++TS_HELPER_LIBSMARTCOLS_FROMFILE="${ts_helpersdir}sample-scols-fromfile" ++TS_HELPER_LIBSMARTCOLS_TITLE="${ts_helpersdir}sample-scols-title" + TS_HELPER_PYLIBMOUNT_CONTEXT="$top_srcdir/libmount/python/test_mount_context.py" + TS_HELPER_PYLIBMOUNT_TAB="$top_srcdir/libmount/python/test_mount_tab.py" + TS_HELPER_PYLIBMOUNT_UPDATE="$top_srcdir/libmount/python/test_mount_tab_update.py" +-TS_HELPER_LOGGER="$top_builddir/test_logger" +-TS_HELPER_LOGINDEFS="$top_builddir/test_logindefs" +-TS_HELPER_MD5="$top_builddir/test_md5" +-TS_HELPER_SHA1="$top_builddir/test_sha1" +-TS_HELPER_MKFS_MINIX="$top_builddir/test_mkfs_minix" +-TS_HELPER_MORE=${TS_HELPER_MORE-"$top_builddir/test_more"} +-TS_HELPER_PARTITIONS="$top_builddir/sample-partitions" +-TS_HELPER_PATHS="$top_builddir/test_pathnames" +-TS_HELPER_SCRIPT="$top_builddir/test_script" +-TS_HELPER_SIGRECEIVE="$top_builddir/test_sigreceive" +-TS_HELPER_STRUTILS="$top_builddir/test_strutils" +-TS_HELPER_SYSINFO="$top_builddir/test_sysinfo" +-TS_HELPER_TIOCSTI="$top_builddir/test_tiocsti" +-TS_HELPER_UUID_PARSER="$top_builddir/test_uuid_parser" +-TS_HELPER_UUID_NAMESPACE="$top_builddir/test_uuid_namespace" +-TS_HELPER_MBSENCODE="$top_builddir/test_mbsencode" +-TS_HELPER_CAL="$top_builddir/test_cal" ++TS_HELPER_LOGGER="${ts_helpersdir}test_logger" ++TS_HELPER_LOGINDEFS="${ts_helpersdir}test_logindefs" ++TS_HELPER_MD5="${ts_helpersdir}test_md5" ++TS_HELPER_SHA1="${ts_helpersdir}test_sha1" ++TS_HELPER_MKFS_MINIX="${ts_helpersdir}test_mkfs_minix" ++TS_HELPER_MORE=${TS_HELPER_MORE-"${ts_helpersdir}test_more"} ++TS_HELPER_PARTITIONS="${ts_helpersdir}sample-partitions" ++TS_HELPER_PATHS="${ts_helpersdir}test_pathnames" ++TS_HELPER_SCRIPT="${ts_helpersdir}test_script" ++TS_HELPER_SIGRECEIVE="${ts_helpersdir}test_sigreceive" ++TS_HELPER_STRUTILS="${ts_helpersdir}test_strutils" ++TS_HELPER_SYSINFO="${ts_helpersdir}test_sysinfo" ++TS_HELPER_TIOCSTI="${ts_helpersdir}test_tiocsti" ++TS_HELPER_UUID_PARSER="${ts_helpersdir}test_uuid_parser" ++TS_HELPER_UUID_NAMESPACE="${ts_helpersdir}test_uuid_namespace" ++TS_HELPER_MBSENCODE="${ts_helpersdir}test_mbsencode" ++TS_HELPER_CAL="${ts_helpersdir}test_cal" + + # paths to commands +-TS_CMD_ADDPART=${TS_CMD_ADDPART:-"$top_builddir/addpart"} +-TS_CMD_DELPART=${TS_CMD_DELPART:-"$top_builddir/delpart"} +-TS_CMD_BLKDISCARD=${TS_CMD_BLKID-"$top_builddir/blkdiscard"} +-TS_CMD_BLKID=${TS_CMD_BLKID-"$top_builddir/blkid"} +-TS_CMD_CAL=${TS_CMD_CAL-"$top_builddir/cal"} +-TS_CMD_COLCRT=${TS_CMD_COLCRT:-"$top_builddir/colcrt"} +-TS_CMD_COLRM=${TS_CMD_COLRM:-"$top_builddir/colrm"} +-TS_CMD_COL=${TS_CMD_COL:-"$top_builddir/col"} +-TS_CMD_COLUMN=${TS_CMD_COLUMN:-"$top_builddir/column"} +-TS_CMD_EJECT=${TS_CMD_EJECT-"$top_builddir/eject"} +-TS_CMD_FALLOCATE=${TS_CMD_FALLOCATE-"$top_builddir/fallocate"} +-TS_CMD_FDISK=${TS_CMD_FDISK-"$top_builddir/fdisk"} +-TS_CMD_FLOCK=${TS_CMD_FLOCK-"$top_builddir/flock"} +-TS_CMD_SFDISK=${TS_CMD_SFDISK-"$top_builddir/sfdisk"} +-TS_CMD_FINCORE=${TS_CMD_FINCORE-"$top_builddir/fincore"} +-TS_CMD_FINDMNT=${TS_CMD_FINDMNT-"$top_builddir/findmnt"} +-TS_CMD_FSCKCRAMFS=${TS_CMD_FSCKCRAMFS:-"$top_builddir/fsck.cramfs"} +-TS_CMD_FSCKMINIX=${TS_CMD_FSCKMINIX:-"$top_builddir/fsck.minix"} +-TS_CMD_GETOPT=${TS_CMD_GETOPT-"$top_builddir/getopt"} +-TS_CMD_HEXDUMP=${TS_CMD_HEXDUMP-"$top_builddir/hexdump"} +-TS_CMD_HWCLOCK=${TS_CMD_HWCLOCK-"$top_builddir/hwclock"} +-TS_CMD_IONICE=${TS_CMD_IONICE-"$top_builddir/ionice"} +-TS_CMD_IPCMK=${TS_CMD_IPCMK-"$top_builddir/ipcmk"} +-TS_CMD_IPCRM=${TS_CMD_IPCRM-"$top_builddir/ipcrm"} +-TS_CMD_IPCS=${TS_CMD_IPCS:-"$top_builddir/ipcs"} +-TS_CMD_ISOSIZE=${TS_CMD_ISOSIZE-"$top_builddir/isosize"} +-TS_CMD_KILL=${TS_CMD_KILL-"$top_builddir/kill"} +-TS_CMD_LAST=${TS_CMD_LAST-"$top_builddir/last"} +-TS_CMD_LINE=${TS_CMD_LINE-"$top_builddir/line"} +-TS_CMD_LOOK=${TS_CMD_LOOK-"$top_builddir/look"} +-TS_CMD_LOSETUP=${TS_CMD_LOSETUP:-"$top_builddir/losetup"} +-TS_CMD_LSBLK=${TS_CMD_LSBLK-"$top_builddir/lsblk"} +-TS_CMD_LSCPU=${TS_CMD_LSCPU-"$top_builddir/lscpu"} +-TS_CMD_LSMEM=${TS_CMD_LSMEM-"$top_builddir/lsmem"} +-TS_CMD_LSNS=${TS_CMD_LSNS-"$top_builddir/lsns"} +-TS_CMD_MCOOKIE=${TS_CMD_MCOOKIE-"$top_builddir/mcookie"} +-TS_CMD_MKCRAMFS=${TS_CMD_MKCRAMFS:-"$top_builddir/mkfs.cramfs"} +-TS_CMD_MKMINIX=${TS_CMD_MKMINIX:-"$top_builddir/mkfs.minix"} +-TS_CMD_MKSWAP=${TS_CMD_MKSWAP:-"$top_builddir/mkswap"} +-TS_CMD_MOUNT=${TS_CMD_MOUNT:-"$top_builddir/mount"} +-TS_CMD_MOUNTPOINT=${TS_CMD_MOUNTPOINT:-"$top_builddir/mountpoint"} +-TS_CMD_NAMEI=${TS_CMD_NAMEI-"$top_builddir/namei"} +-TS_CMD_PARTX=${TS_CMD_PARTX-"$top_builddir/partx"} +-TS_CMD_RENAME=${TS_CMD_RENAME-"$top_builddir/rename"} +-TS_CMD_RUNUSER=${TS_CMD_RUNUSER-"$top_builddir/runuser"} +-TS_CMD_REV=${TS_CMD_REV:-"$top_builddir/rev"} +-TS_CMD_SCRIPT=${TS_CMD_SCRIPT-"$top_builddir/script"} +-TS_CMD_SCRIPTREPLAY=${TS_CMD_SCRIPTREPLAY-"$top_builddir/scriptreplay"} +-TS_CMD_SETARCH=${TS_CMD_SETARCH-"$top_builddir/setarch"} +-TS_CMD_SETSID=${TS_CMD_SETSID-"$top_builddir/setsid"} +-TS_CMD_SWAPLABEL=${TS_CMD_SWAPLABEL:-"$top_builddir/swaplabel"} +-TS_CMD_SWAPOFF=${TS_CMD_SWAPOFF:-"$top_builddir/swapoff"} +-TS_CMD_SWAPON=${TS_CMD_SWAPON:-"$top_builddir/swapon"} +-TS_CMD_UL=${TS_CMD_UL-"$top_builddir/ul"} +-TS_CMD_UMOUNT=${TS_CMD_UMOUNT:-"$top_builddir/umount"} +-TS_CMD_UTMPDUMP=${TS_CMD_UTMPDUMP-"$top_builddir/utmpdump"} +-TS_CMD_UUIDD=${TS_CMD_UUIDD-"$top_builddir/uuidd"} +-TS_CMD_UUIDGEN=${TS_CMD_UUIDGEN-"$top_builddir/uuidgen"} +-TS_CMD_UUIDPARSE=${TS_CMD_UUIDPARSE-"$top_builddir/uuidparse"} +-TS_CMD_WHEREIS=${TS_CMD_WHEREIS-"$top_builddir/whereis"} +-TS_CMD_WIPEFS=${TS_CMD_WIPEFS-"$top_builddir/wipefs"} +-TS_CMD_CHRT=${TS_CMD_CHRT-"$top_builddir/chrt"} ++TS_CMD_ADDPART=${TS_CMD_ADDPART:-"${ts_commandsdir}addpart"} ++TS_CMD_DELPART=${TS_CMD_DELPART:-"${ts_commandsdir}delpart"} ++TS_CMD_BLKDISCARD=${TS_CMD_BLKID-"${ts_commandsdir}blkdiscard"} ++TS_CMD_BLKID=${TS_CMD_BLKID-"${ts_commandsdir}blkid"} ++TS_CMD_CAL=${TS_CMD_CAL-"${ts_commandsdir}cal"} ++TS_CMD_COLCRT=${TS_CMD_COLCRT:-"${ts_commandsdir}colcrt"} ++TS_CMD_COLRM=${TS_CMD_COLRM:-"${ts_commandsdir}colrm"} ++TS_CMD_COL=${TS_CMD_COL:-"${ts_commandsdir}col"} ++TS_CMD_COLUMN=${TS_CMD_COLUMN:-"${ts_commandsdir}column"} ++TS_CMD_EJECT=${TS_CMD_EJECT-"${ts_commandsdir}eject"} ++TS_CMD_FALLOCATE=${TS_CMD_FALLOCATE-"${ts_commandsdir}fallocate"} ++TS_CMD_FDISK=${TS_CMD_FDISK-"${ts_commandsdir}fdisk"} ++TS_CMD_FLOCK=${TS_CMD_FLOCK-"${ts_commandsdir}flock"} ++TS_CMD_SFDISK=${TS_CMD_SFDISK-"${ts_commandsdir}sfdisk"} ++TS_CMD_FINCORE=${TS_CMD_FINCORE-"${ts_commandsdir}fincore"} ++TS_CMD_FINDMNT=${TS_CMD_FINDMNT-"${ts_commandsdir}findmnt"} ++TS_CMD_FSCKCRAMFS=${TS_CMD_FSCKCRAMFS:-"${ts_commandsdir}fsck.cramfs"} ++TS_CMD_FSCKMINIX=${TS_CMD_FSCKMINIX:-"${ts_commandsdir}fsck.minix"} ++TS_CMD_GETOPT=${TS_CMD_GETOPT-"${ts_commandsdir}getopt"} ++TS_CMD_HEXDUMP=${TS_CMD_HEXDUMP-"${ts_commandsdir}hexdump"} ++TS_CMD_HWCLOCK=${TS_CMD_HWCLOCK-"${ts_commandsdir}hwclock"} ++TS_CMD_IONICE=${TS_CMD_IONICE-"${ts_commandsdir}ionice"} ++TS_CMD_IPCMK=${TS_CMD_IPCMK-"${ts_commandsdir}ipcmk"} ++TS_CMD_IPCRM=${TS_CMD_IPCRM-"${ts_commandsdir}ipcrm"} ++TS_CMD_IPCS=${TS_CMD_IPCS:-"${ts_commandsdir}ipcs"} ++TS_CMD_ISOSIZE=${TS_CMD_ISOSIZE-"${ts_commandsdir}isosize"} ++TS_CMD_KILL=${TS_CMD_KILL-"${ts_commandsdir}kill"} ++TS_CMD_LAST=${TS_CMD_LAST-"${ts_commandsdir}last"} ++TS_CMD_LINE=${TS_CMD_LINE-"${ts_commandsdir}line"} ++TS_CMD_LOOK=${TS_CMD_LOOK-"${ts_commandsdir}look"} ++TS_CMD_LOSETUP=${TS_CMD_LOSETUP:-"${ts_commandsdir}losetup"} ++TS_CMD_LSBLK=${TS_CMD_LSBLK-"${ts_commandsdir}lsblk"} ++TS_CMD_LSCPU=${TS_CMD_LSCPU-"${ts_commandsdir}lscpu"} ++TS_CMD_LSMEM=${TS_CMD_LSMEM-"${ts_commandsdir}lsmem"} ++TS_CMD_LSNS=${TS_CMD_LSNS-"${ts_commandsdir}lsns"} ++TS_CMD_MCOOKIE=${TS_CMD_MCOOKIE-"${ts_commandsdir}mcookie"} ++TS_CMD_MKCRAMFS=${TS_CMD_MKCRAMFS:-"${ts_commandsdir}mkfs.cramfs"} ++TS_CMD_MKMINIX=${TS_CMD_MKMINIX:-"${ts_commandsdir}mkfs.minix"} ++TS_CMD_MKSWAP=${TS_CMD_MKSWAP:-"${ts_commandsdir}mkswap"} ++TS_CMD_MOUNT=${TS_CMD_MOUNT:-"${ts_commandsdir}mount"} ++TS_CMD_MOUNTPOINT=${TS_CMD_MOUNTPOINT:-"${ts_commandsdir}mountpoint"} ++TS_CMD_NAMEI=${TS_CMD_NAMEI-"${ts_commandsdir}namei"} ++TS_CMD_PARTX=${TS_CMD_PARTX-"${ts_commandsdir}partx"} ++TS_CMD_RENAME=${TS_CMD_RENAME-"${ts_commandsdir}rename"} ++TS_CMD_RUNUSER=${TS_CMD_RUNUSER-"${ts_commandsdir}runuser"} ++TS_CMD_REV=${TS_CMD_REV:-"${ts_commandsdir}rev"} ++TS_CMD_SCRIPT=${TS_CMD_SCRIPT-"${ts_commandsdir}script"} ++TS_CMD_SCRIPTREPLAY=${TS_CMD_SCRIPTREPLAY-"${ts_commandsdir}scriptreplay"} ++TS_CMD_SETARCH=${TS_CMD_SETARCH-"${ts_commandsdir}setarch"} ++TS_CMD_SETSID=${TS_CMD_SETSID-"${ts_commandsdir}setsid"} ++TS_CMD_SWAPLABEL=${TS_CMD_SWAPLABEL:-"${ts_commandsdir}swaplabel"} ++TS_CMD_SWAPOFF=${TS_CMD_SWAPOFF:-"${ts_commandsdir}swapoff"} ++TS_CMD_SWAPON=${TS_CMD_SWAPON:-"${ts_commandsdir}swapon"} ++TS_CMD_UL=${TS_CMD_UL-"${ts_commandsdir}ul"} ++TS_CMD_UMOUNT=${TS_CMD_UMOUNT:-"${ts_commandsdir}umount"} ++TS_CMD_UTMPDUMP=${TS_CMD_UTMPDUMP-"${ts_commandsdir}utmpdump"} ++TS_CMD_UUIDD=${TS_CMD_UUIDD-"${ts_commandsdir}uuidd"} ++TS_CMD_UUIDGEN=${TS_CMD_UUIDGEN-"${ts_commandsdir}uuidgen"} ++TS_CMD_UUIDPARSE=${TS_CMD_UUIDPARSE-"${ts_commandsdir}uuidparse"} ++TS_CMD_WHEREIS=${TS_CMD_WHEREIS-"${ts_commandsdir}whereis"} ++TS_CMD_WIPEFS=${TS_CMD_WIPEFS-"${ts_commandsdir}wipefs"} ++TS_CMD_CHRT=${TS_CMD_CHRT-"${ts_commandsdir}chrt"} +diff --git a/tests/functions.sh b/tests/functions.sh +index 2fb0ddb5f..ab607c4ce 100644 +--- a/tests/functions.sh ++++ b/tests/functions.sh +@@ -75,9 +75,19 @@ function ts_report { + } + + function ts_check_test_command { +- if [ ! -x "$1" ]; then +- ts_skip "${1##*/} not found" +- fi ++ case "$1" in ++ */*) ++ # paths ++ if [ ! -x "$1" ]; then ++ ts_skip "${1##*/} not found" ++ fi ++ ;; ++ *) ++ # just command names (e.g. --use-system-commands) ++ local cmd=$1 ++ type "$cmd" >/dev/null 2>&1 || ts_skip "missing in PATH: $cmd" ++ ;; ++ esac + } + + function ts_check_prog { +@@ -254,8 +264,20 @@ function ts_init_env { + top_srcdir=$(ts_abspath $top_srcdir) + top_builddir=$(ts_abspath $top_builddir) + +- # some ul commands search other ul commands in $PATH +- export PATH="$top_builddir:$PATH" ++ # We use helpser always from build tree ++ ts_helpersdir="${top_builddir}/" ++ ++ TS_USE_SYSTEM_COMMANDS=$(ts_has_option "use-system-commands" "$*") ++ if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then ++ # Don't define anything, just follow current PATH ++ ts_commandsdir="" ++ else ++ # The default is to use commands from build tree ++ ts_commandsdir="${top_builddir}/" ++ ++ # some ul commands search other ul commands in $PATH ++ export PATH="$ts_commandsdir:$PATH" ++ fi + + TS_SCRIPT="$mydir/$(basename $0)" + TS_SUBDIR=$(dirname $TS_SCRIPT) +@@ -319,6 +341,8 @@ function ts_init_env { + if [ "$TS_VERBOSE" == "yes" ]; then + echo + echo " script: $TS_SCRIPT" ++ echo " commands: $ts_commandsdir" ++ echo " helpers: $ts_helpersdir" + echo " sub dir: $TS_SUBDIR" + echo " top dir: $TS_TOPDIR" + echo " self: $TS_SELF" +diff --git a/tests/run.sh b/tests/run.sh +index f40c9f801..28f8ee25a 100755 +--- a/tests/run.sh ++++ b/tests/run.sh +@@ -20,6 +20,7 @@ TS_TOPDIR=$(cd ${0%/*} && pwd) + SUBTESTS= + EXCLUDETESTS= + OPTS= ++SYSCOMMANDS= + + top_srcdir= + top_builddir= +@@ -68,6 +69,11 @@ while [ -n "$1" ]; do + # these options are simply forwarded to the test scripts + OPTS="$OPTS $1" + ;; ++ --use-system-commands) ++ OPTS="$OPTS $1" ++ SYSCOMMANDS="yes" ++ ;; ++ + --nonroot) + if [ $(id -ru) -eq 0 ]; then + echo "Ignore util-linux test suite [non-root UID expected]." +@@ -98,18 +104,19 @@ while [ -n "$1" ]; do + echo "Usage: " + echo " $(basename $0) [options] [ ...]" + echo "Options:" +- echo " --force execute demanding tests" +- echo " --fake do not run, setup tests only" +- echo " --memcheck-valgrind run with valgrind" +- echo " --memcheck-asan enable ASAN (requires ./configure --enable-asan)" +- echo " --nolocks don't use flock to lock resources" +- echo " --verbose verbose mode" +- echo " --show-diff show diff from failed tests" +- echo " --nonroot ignore test suite if user is root" +- echo " --srcdir= autotools top source directory" +- echo " --builddir= autotools top build directory" +- echo " --parallel= number of parallel test jobs, default: num cpus" +- echo " --exclude= exclude tests by list '/ ..'" ++ echo " --force execute demanding tests" ++ echo " --fake do not run, setup tests only" ++ echo " --memcheck-valgrind run with valgrind" ++ echo " --memcheck-asan enable ASAN (requires ./configure --enable-asan)" ++ echo " --nolocks don't use flock to lock resources" ++ echo " --verbose verbose mode" ++ echo " --show-diff show diff from failed tests" ++ echo " --nonroot ignore test suite if user is root" ++ echo " --use-system-commands use PATH rather than builddir" ++ echo " --srcdir= autotools top source directory" ++ echo " --builddir= autotools top build directory" ++ echo " --parallel= number of parallel test jobs, default: num cpus" ++ echo " --exclude= exclude tests by list '/ ..'" + echo + exit 1 + ;; +@@ -148,7 +155,7 @@ if [ -n "$SUBTESTS" ]; then + fi + done + else +- if [ ! -f "$top_builddir/test_ttyutils" ]; then ++ if [ -z "$SYSCOMMANDS" -a ! -f "$top_builddir/test_ttyutils" ]; then + echo "Tests not compiled! Run 'make check' to fix the problem." + exit 1 + fi +-- +2.20.1 + diff --git a/0017-tests-kill-do-not-use-shell-build-in.patch b/0017-tests-kill-do-not-use-shell-build-in.patch new file mode 100644 index 0000000..5ae2785 --- /dev/null +++ b/0017-tests-kill-do-not-use-shell-build-in.patch @@ -0,0 +1,99 @@ +From 47b0f3480a88be94ef73973e73ad9f7fb8258cad Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 4 Mar 2019 17:28:15 +0100 +Subject: [PATCH 17/19] tests: (kill) do not use shell build-in + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062 +Upstream: http://github.com/karelzak/util-linux/commit/2fadcded53add5b5b0ca7071f310a0f37c711c51 +Signed-off-by: Karel Zak +--- + tests/ts/kill/all_processes | 5 +++++ + tests/ts/kill/name_to_number | 5 +++++ + tests/ts/kill/options | 5 +++++ + tests/ts/kill/print_pid | 5 +++++ + tests/ts/kill/queue | 5 +++++ + 5 files changed, 25 insertions(+) + +diff --git a/tests/ts/kill/all_processes b/tests/ts/kill/all_processes +index 2596ef02b..7a0c95931 100755 +--- a/tests/ts/kill/all_processes ++++ b/tests/ts/kill/all_processes +@@ -20,6 +20,11 @@ ts_init "$*" + + ts_skip_nonroot + ++# make sure we do not use shell built-in command ++if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then ++ TS_CMD_KILL="/bin/kill" ++fi ++ + ts_check_test_command "$TS_CMD_KILL" + ts_check_test_command "$TS_HELPER_SIGRECEIVE" + +diff --git a/tests/ts/kill/name_to_number b/tests/ts/kill/name_to_number +index cde55c9ed..fd2aaafe0 100755 +--- a/tests/ts/kill/name_to_number ++++ b/tests/ts/kill/name_to_number +@@ -18,6 +18,11 @@ TS_DESC="name_to_number" + . "$TS_TOPDIR/functions.sh" + ts_init "$*" + ++# make sure we do not use shell built-in command ++if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then ++ TS_CMD_KILL="/bin/kill" ++fi ++ + ts_check_test_command "$TS_CMD_KILL" + ts_check_test_command "$TS_HELPER_SIGRECEIVE" + +diff --git a/tests/ts/kill/options b/tests/ts/kill/options +index 2c82bbccc..ee9e52f47 100755 +--- a/tests/ts/kill/options ++++ b/tests/ts/kill/options +@@ -18,6 +18,11 @@ TS_DESC="options" + . "$TS_TOPDIR/functions.sh" + ts_init "$*" + ++# make sure we do not use shell built-in command ++if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then ++ TS_CMD_KILL="/bin/kill" ++fi ++ + ts_check_test_command "$TS_CMD_KILL" + ts_check_test_command "$TS_HELPER_SIGRECEIVE" + +diff --git a/tests/ts/kill/print_pid b/tests/ts/kill/print_pid +index c6187f192..2a2a838ee 100755 +--- a/tests/ts/kill/print_pid ++++ b/tests/ts/kill/print_pid +@@ -18,6 +18,11 @@ TS_DESC="print_pid" + . "$TS_TOPDIR/functions.sh" + ts_init "$*" + ++# make sure we do not use shell built-in command ++if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then ++ TS_CMD_KILL="/bin/kill" ++fi ++ + ts_check_test_command "$TS_CMD_KILL" + ts_check_test_command "$TS_HELPER_SIGRECEIVE" + +diff --git a/tests/ts/kill/queue b/tests/ts/kill/queue +index 992acf7a6..4727cbfc4 100755 +--- a/tests/ts/kill/queue ++++ b/tests/ts/kill/queue +@@ -18,6 +18,11 @@ TS_DESC="queue" + . "$TS_TOPDIR/functions.sh" + ts_init "$*" + ++# make sure we do not use shell built-in command ++if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then ++ TS_CMD_KILL="/bin/kill" ++fi ++ + ts_check_test_command "$TS_CMD_KILL" + ts_check_test_command "$TS_HELPER_SIGRECEIVE" + +-- +2.20.1 + diff --git a/0018-tests-add-missing-TS_CMD_UMOUNT-check.patch b/0018-tests-add-missing-TS_CMD_UMOUNT-check.patch new file mode 100644 index 0000000..66e45cc --- /dev/null +++ b/0018-tests-add-missing-TS_CMD_UMOUNT-check.patch @@ -0,0 +1,27 @@ +From aa983f0eea49638f04de0fbafcd156c1472726ee Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 4 Mar 2019 17:32:03 +0100 +Subject: [PATCH 18/19] tests: add missing TS_CMD_UMOUNT check + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062 +Upstream: http://github.com/karelzak/util-linux/commit/bb872a239ce9faae7ac672a9137945dd8e4ee964 +Signed-off-by: Karel Zak +--- + tests/ts/libmount/loop | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tests/ts/libmount/loop b/tests/ts/libmount/loop +index b52b7476a..090b79fa4 100755 +--- a/tests/ts/libmount/loop ++++ b/tests/ts/libmount/loop +@@ -23,6 +23,7 @@ TS_DESC="losetup-loop" + ts_init "$*" + + ts_check_test_command "$TS_CMD_MOUNT" ++ts_check_test_command "$TS_CMD_UMOUNT" + ts_check_test_command "$TS_CMD_FINDMNT" + ts_check_test_command "$TS_CMD_LOSETUP" + +-- +2.20.1 + diff --git a/0019-tests-add-noskip-commands.patch b/0019-tests-add-noskip-commands.patch new file mode 100644 index 0000000..28358fc --- /dev/null +++ b/0019-tests-add-noskip-commands.patch @@ -0,0 +1,66 @@ +From 9e92f2ff939a885b70d3a5d20e8c94f6e41e821b Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 5 Mar 2019 11:06:41 +0100 +Subject: [PATCH 19/19] tests: add --noskip-commands + +The default is SKIP missing commands on --use-system-commands, but +with --noskip-commands the test will FAIL. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062 +Upstream: http://github.com/karelzak/util-linux/commit/7c90efa384cbb2ace873e2b90e8cc396a1719535 +Signed-off-by: Karel Zak +--- + tests/functions.sh | 9 ++++++++- + tests/run.sh | 2 ++ + 2 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/tests/functions.sh b/tests/functions.sh +index ab607c4ce..0605a1320 100644 +--- a/tests/functions.sh ++++ b/tests/functions.sh +@@ -85,7 +85,13 @@ function ts_check_test_command { + *) + # just command names (e.g. --use-system-commands) + local cmd=$1 +- type "$cmd" >/dev/null 2>&1 || ts_skip "missing in PATH: $cmd" ++ type "$cmd" >/dev/null 2>&1 ++ if [ $? -ne 0 ]; then ++ if [ "$TS_NOSKIP_COMMANDS" = "yes" ]; then ++ ts_failed "missing in PATH: $cmd" ++ fi ++ ts_skip "missing in PATH: $cmd" ++ fi + ;; + esac + } +@@ -301,6 +307,7 @@ function ts_init_env { + + ts_init_core_env + ++ TS_NOSKIP_COMMANDS=$(ts_has_option "noskip-commands" "$*") + TS_VERBOSE=$(ts_has_option "verbose" "$*") + TS_SHOWDIFF=$(ts_has_option "show-diff" "$*") + TS_PARALLEL=$(ts_has_option "parallel" "$*") +diff --git a/tests/run.sh b/tests/run.sh +index 28f8ee25a..e8328cc5d 100755 +--- a/tests/run.sh ++++ b/tests/run.sh +@@ -65,6 +65,7 @@ while [ -n "$1" ]; do + --show-diff |\ + --verbose |\ + --skip-loopdevs |\ ++ --noskip-commands |\ + --parsable) + # these options are simply forwarded to the test scripts + OPTS="$OPTS $1" +@@ -113,6 +114,7 @@ while [ -n "$1" ]; do + echo " --show-diff show diff from failed tests" + echo " --nonroot ignore test suite if user is root" + echo " --use-system-commands use PATH rather than builddir" ++ echo " --noskip-commands fail on missing commands" + echo " --srcdir= autotools top source directory" + echo " --builddir= autotools top build directory" + echo " --parallel= number of parallel test jobs, default: num cpus" +-- +2.20.1 + diff --git a/0020-tests-add-missing-program-checks.patch b/0020-tests-add-missing-program-checks.patch new file mode 100644 index 0000000..06d9d8d --- /dev/null +++ b/0020-tests-add-missing-program-checks.patch @@ -0,0 +1,83 @@ +From 68ab6d9691e667f89f72bc7eb39a5300b2f6cbaf Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 5 Mar 2019 13:56:45 +0100 +Subject: [PATCH] tests: add missing program checks + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062 +Signed-off-by: Karel Zak +--- + tests/ts/cal/bigyear | 2 +- + tests/ts/cal/month | 2 +- + tests/ts/cal/sep1752 | 2 +- + tests/ts/misc/mbsencode | 2 ++ + tests/ts/misc/strtosize | 2 ++ + 5 files changed, 7 insertions(+), 3 deletions(-) + +diff --git a/tests/ts/cal/bigyear b/tests/ts/cal/bigyear +index d205c3afd..34139fd27 100755 +--- a/tests/ts/cal/bigyear ++++ b/tests/ts/cal/bigyear +@@ -18,7 +18,7 @@ TS_DESC="Year 2147483646" + . $TS_TOPDIR/functions.sh + ts_init "$*" + +-ts_check_test_command "$TS_CMD_CAL" ++ts_check_test_command "$TS_HELPER_CAL" + + export TERM=linux + +diff --git a/tests/ts/cal/month b/tests/ts/cal/month +index 9794e90c0..37996acae 100755 +--- a/tests/ts/cal/month ++++ b/tests/ts/cal/month +@@ -22,7 +22,7 @@ TS_DESC="month" + . $TS_TOPDIR/functions.sh + ts_init "$*" + +-ts_check_test_command "$TS_CMD_CAL" ++ts_check_test_command "$TS_HELPER_CAL" + + export TERM=linux + +diff --git a/tests/ts/cal/sep1752 b/tests/ts/cal/sep1752 +index 3128261cd..41c30d40e 100755 +--- a/tests/ts/cal/sep1752 ++++ b/tests/ts/cal/sep1752 +@@ -18,7 +18,7 @@ TS_DESC="September 1752" + . $TS_TOPDIR/functions.sh + ts_init "$*" + +-ts_check_test_command "$TS_CMD_CAL" ++ts_check_test_command "$TS_HELPER_CAL" + + export TERM=linux + +diff --git a/tests/ts/misc/mbsencode b/tests/ts/misc/mbsencode +index 405d34c56..139148259 100755 +--- a/tests/ts/misc/mbsencode ++++ b/tests/ts/misc/mbsencode +@@ -22,6 +22,8 @@ TS_DESC="mbsencode" + . $TS_TOPDIR/functions.sh + ts_init "$*" + ++ts_check_test_command "$TS_HELPER_MBSENCODE" ++ + # These test may fail on some machines (locales, other libc...) + TS_KNOWN_FAIL="yes" + +diff --git a/tests/ts/misc/strtosize b/tests/ts/misc/strtosize +index 68b3b8bab..a5914a939 100755 +--- a/tests/ts/misc/strtosize ++++ b/tests/ts/misc/strtosize +@@ -21,6 +21,8 @@ TS_DESC="strtosize" + . $TS_TOPDIR/functions.sh + ts_init "$*" + ++ts_check_test_command "$TS_HELPER_STRUTILS" ++ + $TS_HELPER_STRUTILS --size -1 >> $TS_OUTPUT 2>&1 + $TS_HELPER_STRUTILS --size 0 >> $TS_OUTPUT 2>&1 + $TS_HELPER_STRUTILS --size 1 >> $TS_OUTPUT 2>&1 +-- +2.20.1 + diff --git a/0021-tests-check-for-tar-and-b-g-zip.patch b/0021-tests-check-for-tar-and-b-g-zip.patch new file mode 100644 index 0000000..17199f8 --- /dev/null +++ b/0021-tests-check-for-tar-and-b-g-zip.patch @@ -0,0 +1,42 @@ +From 0c57e5fedce0e627debda3258e2203842b427572 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 11 Dec 2018 11:44:48 +0100 +Subject: [PATCH] tests: check for tar and {b,g}zip + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062 +Upstream: http://github.com/karelzak/util-linux/commit/9e07672bb9989c88f6a7d8b8ab23158701fb4eec +Signed-off-by: Karel Zak +--- + tests/ts/lscpu/lscpu | 2 ++ + tests/ts/lsmem/lsmem | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/tests/ts/lscpu/lscpu b/tests/ts/lscpu/lscpu +index 70fbce9f3..ccf271149 100755 +--- a/tests/ts/lscpu/lscpu ++++ b/tests/ts/lscpu/lscpu +@@ -22,6 +22,8 @@ TS_TOPDIR="${0%/*}/../.." + + ts_init "$*" + ++ts_check_prog "tar" ++ts_check_prog "gzip" + ts_check_test_command "$TS_CMD_LSCPU" + + for dump in $(ls $TS_SELF/dumps/*.tar.gz | sort); do +diff --git a/tests/ts/lsmem/lsmem b/tests/ts/lsmem/lsmem +index f1a643f85..bedf4143f 100755 +--- a/tests/ts/lsmem/lsmem ++++ b/tests/ts/lsmem/lsmem +@@ -21,6 +21,8 @@ TS_TOPDIR="${0%/*}/../.." + ts_init "$*" + + ts_check_test_command "$TS_CMD_LSMEM" ++ts_check_prog "tar" ++ts_check_prog "bzip2" + + LSCOLUMNS="RANGE,SIZE,STATE,REMOVABLE,BLOCK,NODE" + +-- +2.20.1 + diff --git a/0022-tests-make-mount-oloop-use-more-robust.patch b/0022-tests-make-mount-oloop-use-more-robust.patch new file mode 100644 index 0000000..6b05766 --- /dev/null +++ b/0022-tests-make-mount-oloop-use-more-robust.patch @@ -0,0 +1,93 @@ +From 8822103e30121d95fa58b5e8b7ce8ce91d4e778e Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 3 Jun 2019 22:29:51 +0200 +Subject: [PATCH] tests: make mount -oloop use more robust + +The command creates loop device, so udevd is in the game and it seems +better to wait for him. + +Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1681062 +Signed-off-by: Karel Zak +--- + tests/ts/libmount/loop | 4 ++++ + tests/ts/libmount/loop-overlay | 11 +++++++++++ + 2 files changed, 15 insertions(+) + +diff --git a/tests/ts/libmount/loop b/tests/ts/libmount/loop +index 090b79fa4..50764781c 100755 +--- a/tests/ts/libmount/loop ++++ b/tests/ts/libmount/loop +@@ -65,6 +65,7 @@ ts_finalize_subtest + ts_init_subtest "file-o-loop" + [ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT + $TS_CMD_MOUNT -oloop "$BACKFILE" "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1 ++udevadm settle + $TS_CMD_UMOUNT "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1 + udevadm settle + ts_log "Success" +@@ -89,6 +90,7 @@ else + [ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT + LODEV=$( $TS_CMD_LOSETUP --find 2>> $TS_OUTPUT ) + $TS_CMD_MOUNT -oloop=$LODEV "$BACKFILE" "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1 ++ udevadm settle + verify_mount_dev "$LODEV" "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1 + $TS_CMD_UMOUNT "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1 + udevadm settle +@@ -122,6 +124,7 @@ ts_init_subtest "o-loop-val-initialized" + LODEV=$( $TS_CMD_LOSETUP --show -f "$BACKFILE" 2>>$TS_OUTPUT) + $TS_CMD_MOUNT -oloop=$LODEV "$BACKFILE" "$TS_MOUNTPOINT" 2>&1 \ + | sed 's/:.*:/: /; s/for .*/for /' > $TS_OUTPUT ++udevadm settle + $TS_CMD_LOSETUP --detach $LODEV >> $TS_OUTPUT 2>&1 + udevadm settle + ts_log "Success" +@@ -133,6 +136,7 @@ cp "$BACKFILE" "$BACKFILE"-2 + LODEV=$( $TS_CMD_LOSETUP --show -f "$BACKFILE"-2 2>> $TS_OUTPUT) + $TS_CMD_MOUNT -oloop=$LODEV "$BACKFILE" "$TS_MOUNTPOINT" 2>&1 \ + | sed 's/:.*:/: /; s/for .*/for /' > $TS_OUTPUT ++udevadm settle + $TS_CMD_LOSETUP --detach $LODEV >> $TS_OUTPUT 2>&1 + rm "$BACKFILE"-2 + udevadm settle +diff --git a/tests/ts/libmount/loop-overlay b/tests/ts/libmount/loop-overlay +index fffb823c0..1ba6eb06e 100755 +--- a/tests/ts/libmount/loop-overlay ++++ b/tests/ts/libmount/loop-overlay +@@ -43,23 +43,34 @@ dd if="$IMG" of="$IMG" oflag=append bs=1024k count=5 conv=notrunc &>/dev/null + + echo "second should fail" >>$TS_OUTPUT + $TS_CMD_MOUNT -oloop "$IMG" "$TS_MOUNTPOINT-1" >> $TS_OUTPUT 2>&1 ++udevadm settle + $TS_CMD_MOUNT -oloop,offset=$OFFSET "$IMG" "$TS_MOUNTPOINT-2" 2>&1 \ + | sed 's/:.*:/: /; s/for .*/for /' >> $TS_OUTPUT ++udevadm settle + $TS_CMD_UMOUNT "$TS_MOUNTPOINT-1" >> $TS_OUTPUT 2>&1 ++udevadm settle + + echo "should succeed" >>$TS_OUTPUT + $TS_CMD_MOUNT -oloop,sizelimit=$OFFSET "$IMG" "$TS_MOUNTPOINT-1" >> $TS_OUTPUT 2>&1 ++udevadm settle + $TS_CMD_MOUNT -oloop,offset=$OFFSET "$IMG" "$TS_MOUNTPOINT-2" >> $TS_OUTPUT 2>&1 ++udevadm settle + $TS_CMD_UMOUNT "$TS_MOUNTPOINT-1" >> $TS_OUTPUT 2>&1 ++udevadm settle + $TS_CMD_UMOUNT "$TS_MOUNTPOINT-2" >> $TS_OUTPUT 2>&1 ++udevadm settle + + echo "both should fail" >>$TS_OUTPUT + LOOPDEV=$($TS_CMD_LOSETUP --show -f --offset 1 --sizelimit $OFFSET "$IMG") ++udevadm settle + $TS_CMD_MOUNT -oloop,sizelimit=$OFFSET "$IMG" "$TS_MOUNTPOINT-1" 2>&1 \ + | sed 's/:.*:/: /; s/for .*/for /' >> $TS_OUTPUT ++udevadm settle + $TS_CMD_MOUNT -oloop,offset=$OFFSET "$IMG" "$TS_MOUNTPOINT-2" 2>&1 \ + | sed 's/:.*:/: /; s/for .*/for /' >> $TS_OUTPUT ++udevadm settle + $TS_CMD_LOSETUP --detach $LOOPDEV ++udevadm settle + + ts_log "Success" + ts_finalize +-- +2.21.0 + diff --git a/0023-libblkid-fix-file-descriptor-leak-in-blkid_verify.patch b/0023-libblkid-fix-file-descriptor-leak-in-blkid_verify.patch new file mode 100644 index 0000000..1c2f1c8 --- /dev/null +++ b/0023-libblkid-fix-file-descriptor-leak-in-blkid_verify.patch @@ -0,0 +1,87 @@ +From e431bfeca0f3e7be2eba30be83260f20976f871d Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 31 Jul 2019 16:18:27 +0200 +Subject: [PATCH 23/24] libblkid: fix file descriptor leak in blkid_verify() + +The function blkid_verify() uses private device file descriptor and +uses blkid_probe_set_device() to assign the descriptor to low-level +probing code. Unfortunately, close() in this case is not enough as the +prober can internally open whole-disk device too. + +The library API has been extended so blkid_probe_set_device() +deallocates and close previously used prober for whole-disk. This new +functionality is used in blkid_verify() now. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1734553 +Upstream: http://github.com/karelzak/util-linux/commit/c4d6d1c54dcd0eff701236d396d88b1fc6251768 +Signed-off-by: Karel Zak +--- + libblkid/src/probe.c | 19 ++++++++++++++++--- + libblkid/src/verify.c | 4 +++- + 2 files changed, 19 insertions(+), 4 deletions(-) + +diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c +index 647ae416a..a6dc8416a 100644 +--- a/libblkid/src/probe.c ++++ b/libblkid/src/probe.c +@@ -848,10 +848,15 @@ failed: + * @off: begin of probing area + * @size: size of probing area (zero means whole device/file) + * +- * Assigns the device to probe control struct, resets internal buffers and +- * resets the current probing. ++ * Assigns the device to probe control struct, resets internal buffers, resets ++ * the current probing, and close previously associated device (if open by ++ * libblkid). + * +- * Returns: -1 in case of failure, or 0 on success. ++ * If @fd is < 0 than only resets the prober and returns 1. Note that ++ * blkid_reset_probe() keeps the device associated with the prober, but ++ * blkid_probe_set_device() does complete reset. ++ * ++ * Returns: -1 in case of failure, 0 on success and 1 on reset. + */ + int blkid_probe_set_device(blkid_probe pr, int fd, + blkid_loff_t off, blkid_loff_t size) +@@ -866,6 +871,11 @@ int blkid_probe_set_device(blkid_probe pr, int fd, + if ((pr->flags & BLKID_FL_PRIVATE_FD) && pr->fd >= 0) + close(pr->fd); + ++ if (pr->disk_probe) { ++ blkid_free_probe(pr->disk_probe); ++ pr->disk_probe = NULL; ++ } ++ + pr->flags &= ~BLKID_FL_PRIVATE_FD; + pr->flags &= ~BLKID_FL_TINY_DEV; + pr->flags &= ~BLKID_FL_CDROM_DEV; +@@ -881,6 +891,9 @@ int blkid_probe_set_device(blkid_probe pr, int fd, + pr->wipe_size = 0; + pr->wipe_chain = NULL; + ++ if (fd < 0) ++ return 1; ++ + #if defined(POSIX_FADV_RANDOM) && defined(HAVE_POSIX_FADVISE) + /* Disable read-ahead */ + posix_fadvise(fd, 0, 0, POSIX_FADV_RANDOM); +diff --git a/libblkid/src/verify.c b/libblkid/src/verify.c +index 7f44f5497..750378f8c 100644 +--- a/libblkid/src/verify.c ++++ b/libblkid/src/verify.c +@@ -184,9 +184,11 @@ blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev) + dev->bid_name, (long long)st.st_rdev, dev->bid_type)); + } + +- blkid_reset_probe(cache->probe); ++ /* reset prober */ + blkid_probe_reset_superblocks_filter(cache->probe); ++ blkid_probe_set_device(cache->probe, -1, 0, 0); + close(fd); ++ + return dev; + } + +-- +2.21.0 + diff --git a/0024-findmnt-verify-ignore-passno-for-XFS.patch b/0024-findmnt-verify-ignore-passno-for-XFS.patch new file mode 100644 index 0000000..f0ed8c8 --- /dev/null +++ b/0024-findmnt-verify-ignore-passno-for-XFS.patch @@ -0,0 +1,73 @@ +From 3f6de92999cf63e234265f51d6ee02134bc75ac3 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 12 Jun 2019 11:02:51 +0200 +Subject: [PATCH 24/24] findmnt: (verify) ignore passno for XFS + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1719069 +Upstream: http://github.com/karelzak/util-linux/commit/f5b7bf155b9881de5b99cc0a23b4dccf9a2d4af3 +Signed-off-by: Karel Zak +--- + misc-utils/findmnt-verify.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/misc-utils/findmnt-verify.c b/misc-utils/findmnt-verify.c +index 1cc62def9..73e44a418 100644 +--- a/misc-utils/findmnt-verify.c ++++ b/misc-utils/findmnt-verify.c +@@ -28,7 +28,8 @@ struct verify_context { + int nwarnings; + int nerrors; + +- unsigned int target_printed : 1; ++ unsigned int target_printed : 1, ++ no_fsck : 1; + }; + + static void verify_mesg(struct verify_context *vfy, char type, const char *fmt, va_list ap) +@@ -408,6 +409,8 @@ static int verify_fstype(struct verify_context *vfy) + isauto = 1; + else if (strcmp(type, "swap") == 0) + isswap = 1; ++ else if (strcmp(type, "xfs") == 0) ++ vfy->no_fsck = 1; + + if (!isswap && !isauto && !none && !is_supported_filesystem(vfy, type)) + verify_warn(vfy, _("%s seems unsupported by the current kernel"), type); +@@ -422,6 +425,7 @@ static int verify_fstype(struct verify_context *vfy) + + if (realtype) { + isswap = strcmp(realtype, "swap") == 0; ++ vfy->no_fsck = strcmp(realtype, "xfs") == 0; + + if (type && !isauto && strcmp(type, realtype) != 0) + return verify_err(vfy, _("%s does not match with on-disk %s"), type, realtype); +@@ -440,7 +444,7 @@ static int verify_passno(struct verify_context *vfy) + int passno = mnt_fs_get_passno(vfy->fs); + const char *tgt = mnt_fs_get_target(vfy->fs); + +- if (tgt && strcmp("/", tgt) == 0 && passno != 1) ++ if (tgt && strcmp("/", tgt) == 0 && passno != 1 && !vfy->no_fsck) + return verify_warn(vfy, _("recommended root FS passno is 1 (current is %d)"), passno); + + return 0; +@@ -463,7 +467,7 @@ static int verify_filesystem(struct verify_context *vfy) + if (!rc) + rc = verify_fstype(vfy); + if (!rc) +- rc = verify_passno(vfy); ++ rc = verify_passno(vfy); /* depends on verify_fstype() */ + + return rc; + } +@@ -492,6 +496,8 @@ int verify_table(struct libmnt_table *tb) + + while (rc == 0 && (vfy.fs = get_next_fs(tb, itr))) { + vfy.target_printed = 0; ++ vfy.no_fsck = 0; ++ + if (check_order) + rc = verify_order(&vfy); + if (!rc) +-- +2.21.0 + diff --git a/0025-partx-don-t-report-ENXIO-as-error-on-d.patch b/0025-partx-don-t-report-ENXIO-as-error-on-d.patch new file mode 100644 index 0000000..0afeed4 --- /dev/null +++ b/0025-partx-don-t-report-ENXIO-as-error-on-d.patch @@ -0,0 +1,41 @@ +From be5e6b14db3cdd09dab711572116d7ee39344875 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 21 Aug 2019 10:51:18 +0200 +Subject: [PATCH 25/26] partx: don't report ENXIO as error on -d + +The errno ENXIO should be ignored, unfortunately the current code uses +variable 'rc' for ioctl return code as well as for final del_parts() +return value. So, failed ioctl (which should be ignored) affects all +del_parts() status. + + # modprobe scsi_debug dev_size_mb=100 + # partx -d --nr 1-1024 /dev/sdc; echo $? + 1 + +The device dos not contains any partitions, so 0 return code is +expected in this case. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1739179 +Upstream: http://github.com/karelzak/util-linux/commit/53ae7d60cfeacd4e87bfe6fcc015b58b78ef4555 +Signed-off-by: Karel Zak +--- + disk-utils/partx.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/disk-utils/partx.c b/disk-utils/partx.c +index e3443ea80..f3dcc9007 100644 +--- a/disk-utils/partx.c ++++ b/disk-utils/partx.c +@@ -327,8 +327,7 @@ static int del_parts(int fd, const char *device, dev_t devno, + } + + for (i = lower; i <= upper; i++) { +- rc = partx_del_partition(fd, i); +- if (rc == 0) { ++ if (partx_del_partition(fd, i) == 0) { + if (verbose) + printf(_("%s: partition #%d removed\n"), device, i); + continue; +-- +2.21.0 + diff --git a/0026-partx-document-d-vs.-nr-and-fix-test.patch b/0026-partx-document-d-vs.-nr-and-fix-test.patch new file mode 100644 index 0000000..33b50ff --- /dev/null +++ b/0026-partx-document-d-vs.-nr-and-fix-test.patch @@ -0,0 +1,59 @@ +From 5a9269c019f9cb0b2d54444501beb74663670693 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 21 Aug 2019 13:42:22 +0200 +Subject: [PATCH 26/26] partx: document -d vs. --nr and fix test + +The commit ab025087f91b66ee8e23a16bc49eb0d9bd421d65 has disabled error +message, but unfortunately it keeps wrong return code. This has been fixed +by commit 53ae7d60cfeacd4e87bfe6fcc015b58b78ef4555. + +This commit add hit about it to docs and fix regression test too. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1739179 +Upstream: http://github.com/karelzak/util-linux/commit/5200aa99d27e084b514e8b035db32f39b49562a3 +Signed-off-by: Karel Zak +--- + disk-utils/partx.8 | 5 ++++- + tests/ts/partx/partx | 9 +++++++-- + 2 files changed, 11 insertions(+), 3 deletions(-) + +diff --git a/disk-utils/partx.8 b/disk-utils/partx.8 +index af7313cb9..c6bbbae42 100644 +--- a/disk-utils/partx.8 ++++ b/disk-utils/partx.8 +@@ -53,7 +53,10 @@ Add the specified partitions, or read the disk and add all partitions. + Print the SIZE column in bytes rather than in human-readable format. + .TP + .BR \-d , " \-\-delete" +-Delete the specified partitions or all partitions. ++Delete the specified partitions or all partitions. It is not error to ++remove non-existing partitions, so this option is possible to use together with ++large \fB\-\-nr\fR ranges without care about the current partitions set on ++the device. + .TP + .BR \-g , " \-\-noheadings" + Do not print a header line with \fB\-\-show\fR or \fB\-\-raw\fR. +diff --git a/tests/ts/partx/partx b/tests/ts/partx/partx +index b21dc44ef..84c286a94 100755 +--- a/tests/ts/partx/partx ++++ b/tests/ts/partx/partx +@@ -137,9 +137,14 @@ udevadm settle + ts_init_subtest "delete-non-existent" + #attempt to remove it again + { ++ # remove non-existing partitions (ENXIO) is not error ++ # ++ # see ab025087f91b66ee8e23a16bc49eb0d9bd421d65 and ++ # 53ae7d60cfeacd4e87bfe6fcc015b58b78ef4555 ++ # + $TS_CMD_PARTX -d --nr $PARTS $TS_DEVICE && +- echo "partx failed: removed non-existing partition" || +- echo "partx: OK" ++ echo "partx: OK" || ++ echo "partx failed: removed non-existing partition" + } >$TS_OUTPUT 2>&1 + ts_finalize_subtest + +-- +2.21.0 + diff --git a/0027-libmount-improve-mountinfo-reliability.patch b/0027-libmount-improve-mountinfo-reliability.patch new file mode 100644 index 0000000..c78f9ad --- /dev/null +++ b/0027-libmount-improve-mountinfo-reliability.patch @@ -0,0 +1,396 @@ +From 32fe4f1dd8fbc104bd848e24de613122947f095a Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 28 Aug 2019 15:47:16 +0200 +Subject: [PATCH] libmount: improve mountinfo reliability +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The standard way how we read mount table is not reliable because +during the read() syscalls the table may be modified by some another +process. The changes in the table is possible to detect by poll() +event, and in this case it seems better to lseek to the begin of the file +and read it again. It's expensive, but better than races... + +This patch does not modify mountinfo parser, but it reads all file to +memory (by read()+poll()) and than it creates memory stream +from the buffer and use it rather than a regular file stream. + +It means the parser is still possible to use for normal files +(e.g. fstab) as well as for mountinfo and it's also portable to +systems where for some reason is no fmemopen(). + +Addresses: https://github.com/systemd/systemd/issues/10872 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1751447 +Upstream: http://github.com/karelzak/util-linux/commit/e4925f591c1bfb83719418b56b952830d15b77eb +Upstream: http://github.com/karelzak/util-linux/commit/ee551c909f95437fd9fcd162f398c069d0ce9720 +Reported-by: Zbigniew Jędrzejewski-Szmek +Signed-off-by: Karel Zak +--- + configure.ac | 1 + + libmount/src/mountP.h | 2 + + libmount/src/tab_parse.c | 87 +++++++++++++++++---- + libmount/src/utils.c | 158 +++++++++++++++++++++++++++++++++++++++ + 4 files changed, 233 insertions(+), 15 deletions(-) + +diff --git a/configure.ac b/configure.ac +index a05a294ad..245004890 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -456,6 +456,7 @@ AC_CHECK_FUNCS([ \ + err \ + errx \ + explicit_bzero \ ++ fmemopen \ + fsync \ + utimensat \ + getdomainname \ +diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h +index d47d26442..52a238ef3 100644 +--- a/libmount/src/mountP.h ++++ b/libmount/src/mountP.h +@@ -93,6 +93,7 @@ extern int mnt_valid_tagname(const char *tagname); + extern int append_string(char **a, const char *b); + + extern const char *mnt_statfs_get_fstype(struct statfs *vfs); ++extern int is_procfs_fd(int fd); + extern int is_file_empty(const char *name); + + extern int mnt_is_readonly(const char *path) +@@ -118,6 +119,7 @@ extern void mnt_free_filesystems(char **filesystems); + extern char *mnt_get_kernel_cmdline_option(const char *name); + extern int mnt_guess_system_root(dev_t devno, struct libmnt_cache *cache, char **path); + extern int mnt_stat_mountpoint(const char *target, struct stat *st); ++extern FILE *mnt_get_procfs_memstream(int fd, char **membuf); + + /* tab.c */ + extern int is_mountinfo(struct libmnt_table *tb); +diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c +index 3ed84ebc2..10fc68279 100644 +--- a/libmount/src/tab_parse.c ++++ b/libmount/src/tab_parse.c +@@ -603,15 +603,7 @@ static int kernel_fs_postparse(struct libmnt_table *tb, + return rc; + } + +-/** +- * mnt_table_parse_stream: +- * @tb: tab pointer +- * @f: file stream +- * @filename: filename used for debug and error messages +- * +- * Returns: 0 on success, negative number in case of error. +- */ +-int mnt_table_parse_stream(struct libmnt_table *tb, FILE *f, const char *filename) ++static int __table_parse_stream(struct libmnt_table *tb, FILE *f, const char *filename) + { + int rc = -1; + int flags = 0; +@@ -685,6 +677,40 @@ err: + return rc; + } + ++/** ++ * mnt_table_parse_stream: ++ * @tb: tab pointer ++ * @f: file stream ++ * @filename: filename used for debug and error messages ++ * ++ * Returns: 0 on success, negative number in case of error. ++ */ ++int mnt_table_parse_stream(struct libmnt_table *tb, FILE *f, const char *filename) ++{ ++ int fd, rc; ++ FILE *memf = NULL; ++ char *membuf = NULL; ++ ++ /* ++ * For /proc/#/{mountinfo,mount} we read all file to memory and use it ++ * as memory stream. For more details see mnt_read_procfs_file(). ++ */ ++ if ((fd = fileno(f)) >= 0 ++ && (tb->fmt == MNT_FMT_GUESS || ++ tb->fmt == MNT_FMT_MOUNTINFO || ++ tb->fmt == MNT_FMT_MTAB) ++ && is_procfs_fd(fd) ++ && (memf = mnt_get_procfs_memstream(fd, &membuf))) { ++ ++ rc = __table_parse_stream(tb, memf, filename); ++ fclose(memf); ++ free(membuf); ++ } else ++ rc = __table_parse_stream(tb, f, filename); ++ ++ return rc; ++} ++ + /** + * mnt_table_parse_file: + * @tb: tab pointer +@@ -700,18 +726,49 @@ err: + int mnt_table_parse_file(struct libmnt_table *tb, const char *filename) + { + FILE *f; +- int rc; ++ int rc, fd = -1; + + if (!filename || !tb) + return -EINVAL; + +- f = fopen(filename, "r" UL_CLOEXECSTR); ++ /* ++ * Try to use read()+poll() to realiably read all ++ * /proc/#/{mount,mountinfo} file to memory ++ */ ++ if (tb->fmt != MNT_FMT_SWAPS ++ && strncmp(filename, "/proc/", 6) == 0) { ++ ++ FILE *memf; ++ char *membuf = NULL; ++ ++ fd = open(filename, O_RDONLY|O_CLOEXEC); ++ if (fd < 0) { ++ rc = -errno; ++ goto done; ++ } ++ memf = mnt_get_procfs_memstream(fd, &membuf); ++ if (memf) { ++ rc = __table_parse_stream(tb, memf, filename); ++ ++ fclose(memf); ++ free(membuf); ++ close(fd); ++ goto done; ++ } ++ /* else fallback to fopen/fdopen() */ ++ } ++ ++ if (fd >= 0) ++ f = fdopen(fd, "r" UL_CLOEXECSTR); ++ else ++ f = fopen(filename, "r" UL_CLOEXECSTR); ++ + if (f) { +- rc = mnt_table_parse_stream(tb, f, filename); ++ rc = __table_parse_stream(tb, f, filename); + fclose(f); + } else + rc = -errno; +- ++done: + DBG(TAB, ul_debugobj(tb, "parsing done [filename=%s, rc=%d]", filename, rc)); + return rc; + } +@@ -768,7 +825,7 @@ static int __mnt_table_parse_dir(struct libmnt_table *tb, const char *dirname) + + f = fopen_at(dd, d->d_name, O_RDONLY|O_CLOEXEC, "r" UL_CLOEXECSTR); + if (f) { +- mnt_table_parse_stream(tb, f, d->d_name); ++ __table_parse_stream(tb, f, d->d_name); + fclose(f); + } + } +@@ -809,7 +866,7 @@ static int __mnt_table_parse_dir(struct libmnt_table *tb, const char *dirname) + f = fopen_at(dirfd(dir), d->d_name, + O_RDONLY|O_CLOEXEC, "r" UL_CLOEXECSTR); + if (f) { +- mnt_table_parse_stream(tb, f, d->d_name); ++ __table_parse_stream(tb, f, d->d_name); + fclose(f); + } + } +diff --git a/libmount/src/utils.c b/libmount/src/utils.c +index c36187c07..f7d85d124 100644 +--- a/libmount/src/utils.c ++++ b/libmount/src/utils.c +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + #include + + #include "strutils.h" +@@ -408,6 +409,12 @@ const char *mnt_statfs_get_fstype(struct statfs *vfs) + return NULL; + } + ++int is_procfs_fd(int fd) ++{ ++ struct statfs sfs; ++ ++ return fstatfs(fd, &sfs) == 0 && sfs.f_type == STATFS_PROC_MAGIC; ++} + + /** + * mnt_match_fstype: +@@ -1117,8 +1124,158 @@ done: + return 1; + } + ++#if defined(HAVE_FMEMOPEN) || defined(TEST_PROGRAM) ++ ++/* ++ * This function tries to minimize possible races when we read ++ * /proc/#/{mountinfo,mount} files. ++ * ++ * The idea is to minimize number of read()s and check by poll() that during ++ * the read the mount table has not been modified. If yes, than re-read it ++ * (with some limitations to avoid never ending loop). ++ * ++ * Returns: <0 error, 0 success, 1 too many attempts ++ */ ++static int read_procfs_file(int fd, char **buf, size_t *bufsiz) ++{ ++ size_t bufmax = 0; ++ int rc = 0, tries = 0, ninters = 0; ++ char *bufptr = NULL;; ++ ++ assert(buf); ++ assert(bufsiz); ++ ++ *bufsiz = 0; ++ *buf = NULL; ++ ++ do { ++ ssize_t ret; ++ ++ if (!bufptr || bufmax == *bufsiz) { ++ char *tmp; ++ ++ bufmax = bufmax ? bufmax * 2 : (16 * 1024); ++ tmp = realloc(*buf, bufmax); ++ if (!tmp) ++ break; ++ *buf = tmp; ++ bufptr = tmp + *bufsiz; ++ } ++ ++ errno = 0; ++ ret = read(fd, bufptr, bufmax - *bufsiz); ++ ++ if (ret < 0) { ++ /* error */ ++ if ((errno == EAGAIN || errno == EINTR) && (ninters++ < 5)) { ++ xusleep(200000); ++ continue; ++ } ++ break; ++ ++ } else if (ret > 0) { ++ /* success -- verify no event during read */ ++ struct pollfd fds[] = { ++ { .fd = fd, .events = POLLPRI } ++ }; ++ ++ rc = poll(fds, 1, 0); ++ if (rc < 0) ++ break; /* poll() error */ ++ if (rc > 0) { ++ /* event -- read all again */ ++ if (lseek(fd, 0, SEEK_SET) != 0) ++ break; ++ *bufsiz = 0; ++ bufptr = *buf; ++ tries++; ++ ++ if (tries > 10) ++ /* busy system? -- wait */ ++ xusleep(10000); ++ continue; ++ } ++ ++ /* successful read() without active poll() */ ++ (*bufsiz) += (size_t) ret; ++ bufptr += ret; ++ tries = ninters = 0; ++ } else { ++ /* end-of-file */ ++ goto success; ++ } ++ } while (tries <= 100); ++ ++ rc = errno ? -errno : 1; ++ free(*buf); ++ return rc; ++ ++success: ++ return 0; ++} ++ ++/* ++ * Create FILE stream for data from read_procfs_file() ++ */ ++FILE *mnt_get_procfs_memstream(int fd, char **membuf) ++{ ++ FILE *memf; ++ size_t sz = 0; ++ off_t cur; ++ ++ /* in case of error, rewind to the original position */ ++ cur = lseek(fd, 0, SEEK_CUR); ++ ++ if (read_procfs_file(fd, membuf, &sz) == 0 ++ && sz > 0 ++ && (memf = fmemopen(*membuf, sz, "r"))) ++ return memf; ++ ++ /* error */ ++ lseek(fd, cur, SEEK_SET); ++ return NULL; ++} ++#else ++FILE *mnt_get_procfs_memstream(int fd __attribute((__unused__)), ++ char **membuf __attribute((__unused__))) ++{ ++ return NULL; ++} ++#endif /* HAVE_FMEMOPEN */ ++ + + #ifdef TEST_PROGRAM ++static int test_proc_read(struct libmnt_test *ts, int argc, char *argv[]) ++{ ++ char *buf = NULL; ++ char *filename = argv[1]; ++ size_t bufsiz = 0; ++ int rc = 0, fd = open(filename, O_RDONLY); ++ ++ if (fd <= 0) { ++ warn("%s: cannot open", filename); ++ return -errno; ++ } ++ ++ rc = read_procfs_file(fd, &buf, &bufsiz); ++ close(fd); ++ ++ switch (rc) { ++ case 0: ++ fwrite(buf, 1, bufsiz, stdout); ++ free(buf); ++ break; ++ case 1: ++ warnx("too many attempts"); ++ break; ++ default: ++ warn("%s: cannot read", filename); ++ break; ++ } ++ ++ return rc; ++} ++ + static int test_match_fstype(struct libmnt_test *ts, int argc, char *argv[]) + { + char *type = argv[1]; +@@ -1300,6 +1457,7 @@ int main(int argc, char *argv[]) + { "--guess-root", test_guess_root, "[]" }, + { "--mkdir", test_mkdir, "" }, + { "--statfs-type", test_statfs_type, "" }, ++ { "--read-procfs", test_proc_read, "" }, + + { NULL } + }; +-- +2.21.0 + diff --git a/0028-libmount-use-fmemopen-in-more-robust-way-coverity-sc.patch b/0028-libmount-use-fmemopen-in-more-robust-way-coverity-sc.patch new file mode 100644 index 0000000..e356bf4 --- /dev/null +++ b/0028-libmount-use-fmemopen-in-more-robust-way-coverity-sc.patch @@ -0,0 +1,53 @@ +From d9fe56d8da9015694fcba5f3dd850becff677ab5 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 20 Sep 2019 13:00:19 +0200 +Subject: [PATCH] libmount: use fmemopen() in more robust way [coverity scan] + +Upstream: http://github.com/karelzak/util-linux/commit/026f7d302066a4e6f5a69dc9818ec3180939f4a3 +Upstream: http://github.com/karelzak/util-linux/commit/bc747dfccf511419312ec872cefa90e25d83136a +Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1751447 +Signed-off-by: Karel Zak +--- + libmount/src/utils.c | 18 ++++++++++++------ + 1 file changed, 12 insertions(+), 6 deletions(-) + +diff --git a/libmount/src/utils.c b/libmount/src/utils.c +index f7d85d124..04e79f53f 100644 +--- a/libmount/src/utils.c ++++ b/libmount/src/utils.c +@@ -1219,20 +1219,26 @@ success: + */ + FILE *mnt_get_procfs_memstream(int fd, char **membuf) + { +- FILE *memf; + size_t sz = 0; + off_t cur; + ++ *membuf = NULL; ++ + /* in case of error, rewind to the original position */ + cur = lseek(fd, 0, SEEK_CUR); + +- if (read_procfs_file(fd, membuf, &sz) == 0 +- && sz > 0 +- && (memf = fmemopen(*membuf, sz, "r"))) +- return memf; ++ if (read_procfs_file(fd, membuf, &sz) == 0 && sz > 0) { ++ FILE *memf = fmemopen(*membuf, sz, "r"); ++ if (memf) ++ return memf; /* success */ ++ ++ free(*membuf); ++ *membuf = NULL; ++ } + + /* error */ +- lseek(fd, cur, SEEK_SET); ++ if (cur != (off_t) -1) ++ lseek(fd, cur, SEEK_SET); + return NULL; + } + #else +-- +2.21.0 + diff --git a/0029-lscpu-use-the-first-VM-from-proc-sysinfo.patch b/0029-lscpu-use-the-first-VM-from-proc-sysinfo.patch new file mode 100644 index 0000000..9552768 --- /dev/null +++ b/0029-lscpu-use-the-first-VM-from-proc-sysinfo.patch @@ -0,0 +1,28 @@ +From 6f16035b81cd7feca02d6df8eff1bb954ed7e58d Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 4 Sep 2018 14:30:37 +0200 +Subject: [PATCH 29/32] lscpu: use the first VM from /proc/sysinfo + +Addresses: https://github.com/karelzak/util-linux/issues/685 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1739443 +Upstream: http://github.com/karelzak/util-linux/commit/350f5c8df2cb6edbfb5bae95f00a9fff446d236c +Signed-off-by: Karel Zak +--- + sys-utils/lscpu.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c +index fd6d63bbf..1aa7bff4d 100644 +--- a/sys-utils/lscpu.c ++++ b/sys-utils/lscpu.c +@@ -866,6 +866,7 @@ read_hypervisor(struct lscpu_desc *desc, struct lscpu_modifier *mod) + *(str--) = '\0'; + while ((str = strstr(desc->hypervisor, " "))) + memmove(str, str + 1, strlen(str)); ++ break; + } + fclose(fd); + } +-- +2.21.0 + diff --git a/0030-tests-lscpu-s390-nested-virtualization.patch b/0030-tests-lscpu-s390-nested-virtualization.patch new file mode 100644 index 0000000..fa71cbc --- /dev/null +++ b/0030-tests-lscpu-s390-nested-virtualization.patch @@ -0,0 +1,206 @@ +From e10bdfc6cd623f02740cf2bcfd9867c56534c5e5 Mon Sep 17 00:00:00 2001 +From: Radka Skvarilova +Date: Sun, 22 Sep 2019 13:49:45 +0200 +Subject: [PATCH 30/32] tests: lscpu s390 nested virtualization + +Signed-off-by: Radka Skvarilova +Addresses:https://bugzilla.redhat.com/show_bug.cgi?id=1739443 +Upstream: http://github.com/karelzak/util-linux/commit/2062164894fffa314ecb7ac99dc6c98062484389 +--- + tests/expected/lscpu/lscpu-s390-nested-virt | 45 +++++++++++++++++++ + tests/ts/lscpu/dumps/s390-nested-virt.tar.gz | Bin 0 -> 7199 bytes + 2 files changed, 45 insertions(+) + create mode 100644 tests/expected/lscpu/lscpu-s390-nested-virt + create mode 100644 tests/ts/lscpu/dumps/s390-nested-virt.tar.gz + +diff --git a/tests/expected/lscpu/lscpu-s390-nested-virt b/tests/expected/lscpu/lscpu-s390-nested-virt +new file mode 100644 +index 000000000..2665fd8dc +--- /dev/null ++++ b/tests/expected/lscpu/lscpu-s390-nested-virt +@@ -0,0 +1,45 @@ ++CPU op-mode(s): 32-bit, 64-bit ++CPU(s): 2 ++On-line CPU(s) list: 0,1 ++Thread(s) per core: 1 ++Core(s) per socket: 1 ++Socket(s) per book: 1 ++Book(s) per drawer: 1 ++Drawer(s): 2 ++NUMA node(s): 1 ++Vendor ID: IBM/S390 ++Machine type: 2964 ++CPU dynamic MHz: 5000 ++CPU static MHz: 5000 ++BogoMIPS: 3033.00 ++Hypervisor: KVM/Linux ++Hypervisor vendor: KVM ++Virtualization type: full ++Dispatching mode: horizontal ++L1d cache: 256 KiB ++L1i cache: 192 KiB ++L2d cache: 4 MiB ++L2i cache: 4 MiB ++L3 cache: 64 MiB ++L4 cache: 480 MiB ++NUMA node0 CPU(s): 0,1 ++Vulnerability L1tf: Not affected ++Vulnerability Meltdown: Not affected ++Vulnerability Spec store bypass: Not affected ++Vulnerability Spectre v1: Mitigation; __user pointer sanitization ++Vulnerability Spectre v2: Mitigation; execute trampolines ++Flags: esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te vx ++ ++# The following is the parsable format, which can be fed to other ++# programs. Each different item in every column has an unique ID ++# starting from zero. ++# CPU,Core,Socket,Node,,L1d,L1i,L2d,L2i ++0,0,0,0,,0,0,0,0 ++1,1,1,0,,1,1,1,1 ++ ++# The following is the parsable format, which can be fed to other ++# programs. Each different item in every column has an unique ID ++# starting from zero. ++# CPU,Core,Socket,Node,,L1d,L1i,L2d,L2i ++0,0,0,0,,0,0,0,0 ++1,1,1,0,,1,1,1,1 +diff --git a/tests/ts/lscpu/dumps/s390-nested-virt.tar.gz b/tests/ts/lscpu/dumps/s390-nested-virt.tar.gz +new file mode 100644 +index 0000000000000000000000000000000000000000..7992699925395ed8d33b1e1466b74fc1aa235268 +GIT binary patch +literal 7199 +zcmb7|dpK14zsFsYO}nPFYuZ%PMd^Z336(4*TcRer3sNpgD3MZbv80PMNo`w{G9oG0 +zqzEx26v{10($JJUV=(5n*7}?^*}wgq^E~G{&vW`mYx%D4_jCJx-mecD^A|aJ^PPv} +z6bJ7eib<%-zkE8l+t#n8FlzI-@}kEz)axa}w(L)lt9PBsIIOAv%}zn7;nQdi5~WYu +zJ{neZKDMS$*w*%R=W)|!D?0w%vFL^?&s?4AW{mpAeg7e#;9SqG91c9*fS(3`-H^qX +z)Y3P;zr?$Q=%Hctr>gQ-q}_}aRkprjf_!Sec}n^BcIEO=O+sXSYPld#Gv=x#>uuQE8!Mw%zW>{Khm+}=AL~*n*W=aKaa>K@OPx!P +zguV%1Gi}4PWz*(N3z^$bNkO8j|F|199x+Se`nIt}`;Lxl^yalL86sWBl5d$`PJFZV +zNm+ZiQo9+&DG_(p0SmlkLwX; +zO@+n&> +zb%o^pf&LUq1pBnAcfeJ))LRVEyaF(6Pp&pe3IqnMY=o3fvB>ABC4(bBCXz0skmYlS +zi$wF(I?npN{KE=h6QA-xwGq-frF{BXr4A8&CUy|cZ^c%MW~Mr9ewKdOQ~W)bmQfv+ +z`M!l$v}uz|+Fw*Es7>W1S^T-8fkg)C5>7EnE3PN@{FKlTbixS +zfy8@Xn-%}6h;2*oNQt=oW4LRxyKSgZM@z+~wgEAe9^o~KYx~^;O1{4vT_)AJepS20 +z{5hB1V{<^0-xU)e?Qck_kM=cbu1;>R=wTzei5qlT8?qBO46|tLpfP@QIGz~WXcMJ8 +zx_e}~74>b_j2~F(hfVWg?;m~GQQ`PfVKvHR8nJ`V37aE{p2`RgrzGppx2|nz)#B2t +z-sv~R*+k?6;@Cm_udEpTjoW(rbfn1)zP445P3fjpdtH4~T~n47eq`s*7-iBMyPlmN +z!TC0~&#fA(+IUg0R$$j1jW_Z);Au~9@**tU%J^C<+yq_)|)qy7SwoQFR$0X^XdL>exr?jmgB`g3E2;khu^{d +z8B|@1YPMOHKR?l>U_R-S$N7?o7G%w#qhVs +zjvqW;NB3JlI&hmFU5g#K{Y!MH|Ev!+yZR3pw=h*JMtc3JDF<%nT<^EOcHC|Bh2xPd +z$F0K)Lh3brR?MF6_Vm8>`oG1~-L{z7f7)$uY=s8m^iaLueEkRJu}9RF-SqVPj(g2Y +z9$gNynJ!44`~_z>J=Cm3G+pq`@B{OId6+U?pr-%9s$n<1+_U6h35XJ))*!N6w91iJ7lD;tI7KRQ_WvxKq> +z2ey?NHL!93#p3&%TbEh}`{2!3Y}K +z5K^4C@ogOc*m!uJSuXLT#@Hb@I`C|Q#ej-bTu*7`#rR1D#85=Ry?qOEg04iYySqQ} +z(Sn@TLwG<*e}B)0>>`|xhUjqpvR$!}gfE~F(S#62{my+E!Q8eLw+!i9O}goSfAD|n +zJ1>%YemGg=yZ%^Fq;OwFeMWaH0|JFSPRQ96CK-2pTG3&txZFz6RGgz8>bU;T8tLr2 +zAFrj8XIbMS`*$O}mO9Sn8K+|N`0Rxe;XTE}CZLr%vIZ>5{kbSI)Y>X6J4_&Z-@xMg +zYX}L??d34GUXO|7bfe~v$V;so30`?a;|uhn(OxAxSlZPj8i3$@CxtO7I&a5y(H`gD +z;KaE!3#F>oPxMj!Oz?etol7^O7-z!nk*?N)91c4e@7ot!XS+;iXQ}UoLdKT_%e3TaypeAq>>)@BUlb5t~uq@!2HVnAbrp>EvGRZ7pacX-)#p1l+c2)g +z@G2~qs`Yf|g-JyTb)YgVbH02DAvVy7Ib)pl(!Sklxx&O|?BN89H36~IMZmgv;((W7 +zf_5w4f>E|bdmP#HVAi3~s0o6NZiF<2I=DIWMD4Gy{Nr?oApg_g?BCN`5RL4{&jc$9 +zLO4AQh*G@JKVgO>`l#C}YC$9@uf~J_G=<+x!Q1sdq}K*;CKx^ZRiAgZzRQyv!l7AA +zbJ{EBG{A`6YcwyBh@I1Hteamn$IjgC?)$UNmv1Lch*)1iakv~93d7_k4?sVmdTw&& +zZ{GRD(!erWE1I71*|BIrwZP{Vj5+hy6<-$PEM*VyER(R?=k+0X>d)lVi+r8Cxv1_F +z!a`Akdb=7C4(5TQCm_@A!trPQtlDM)(q{&m+UpiHXzQfR@t&f4_yHU#y_%Nib-Y*J +z%LgtrPawbM5{#|Awv=#bF`^_Y)@y~(Azt!JwzAh}ltR$dL@R#9oxew!eVKCb^>(Pu +z{F0ep@bLFesn{tG^Qq)x6t&E6PHv$Zb@By5*fqw!^ydqRDXZ?q3$Miz&kuWZYg?Ys +zx_*BLSHoO!)|5IZii#zuHiwxdk%22jT~uPMs%cDh=%R +zPkr#DQTlAV_kPQu_WZdX+31`_5Ha;v`0|j7Gi)sz7tLT2=$l3&CTxOpV&gc_z3{Bh +z=;INLq1HeY@1#h4JY_E;F(-BMIqDwa^K@{mYz%z^i{vG;LZIbCG#^pv1=(WSLx}D{ +zZ^-r<97pO?=)R$Szmz3I&N&gXJ&fph7(*x@1j-shOCCoH`piKw6Q+HKpC8mE!td{H +z@f)OU-z=2=YZojc3%OmSYY?QccaC#j4|`g9E@2gJjz#&O*KYMtzdpk7aGy$RqRtgiSU&8PZD%HKwJ%-39g4vXA^vlCM +zg8oUVX)7!oMLbCJst&-^V$(bIptR&7FsCp@T15rImUZ!R&u+uC5zI+#kc*1fh7}U2 +zqk3Qw9)i_&biZ;pCDZ-B8+|D!MAg3j;dW6ssrb_Xn#zN?%}O87VOp0W1Wsx<$ox!5 +z=(lVZ)~6LY7hN~l*{avd=DC2fdeYBG=u9=8hEKaBpsDG>0J)UqR%;a9+_tM0$x56$ +zK2+Ejb{1!Kqe^#EaIGyO`C+*kt~o$&%#J_G^xXSfn|5T)ciol#oRZ6dQktj%nZEQ9 +z$8%7?@@_Tsb?lJ8`ohav&Zian2!@HU6P7OC{X+hQbp#*A77(*P3(!)c#}#O5FXrLb +zHiePq!zm5t)RTD_ZDrsUjHX&t1!@}3131(Hb^CcKqA~)7J8f~N!-|=j-rcZgu?5+- +zWbb^2&$aTonPZMq#g0_*=ApR(Y!BamzKh^6ub +ztsu7*$_V5d{46diPU(UQ30)-~&S(VVltD0)G88bfALPJ!9Bn{Uc9S<^0JQ^J^%(gH +z)SuXR4T8tvUJjIlMTJoqUhg(2Kr(^h42W7$6{-icMA#|Yf;9Sq7)CHHwN5yl@bxp4 +z;^ZAzB0s?PZjK{@g|HYdOzGvEDC$R70Br(IE;k?!djKn1jHnKBktaaGQL=oH5dw{e +zW%5!ej4C0NC%^@>2oDq8t8yd_hjTJVNUMSxVJ1PE@mHAGN#^1c0y#gynj(TPlk1XD +z^(Vk0U12kT(}%I^HzdM#1>uzWVKbUtFir~4jfCKW$4%*4=_S{zHzA?bKsANj?nBOFBK5FtR+CJmGY0}+Aj22SSTK89kQP$7zzc|-OfVL!AF +zIF*5wVmI1BdS@p7xxv5QPChH+F>*g0{%5}%VE!{HE*NqHcu&aUC7qoN4_O5u8e>LKRqWtQLg_e%1wK5OwfJAJNk_ZHh~~W4EDby2 +zx?Uo1T~?4#5^jUh3$O)^4^dr44;V#2++_;8Gz2F)1{gVhVOp`NKBG~!Z1$&?l=yOL|^alV4lq9Adf>SiV?_lJb_!zTCcL;K$iyMymO +z7e+W|NH5zJ~z2U2q$vu}`kyw-H;qgql2tyX75 +z@YjE?hO{B1M~$quPVm$C9~jZ#OfZIept3fuH5xj+nEhtsj`G(BI4g*_G;Bd`G~0%t +z2}dxxy7o8JvW7EDy0FxSV2y5-HE0Ye$ZddSD^ZJQLST%+MOCr`DvXjjw32dejQVdo +zE=389%BhwhDwBlZvqQY;)mBJ+J?3O7>#bWM?g1IIuYlYG{v}hgVa(-oGSg7EO8sbN +zmbcP=n?m##y9(>w!B~AFRPZr>^^@RFdXUy;oIlfz>_!6G+YF2+6|nl#^W(g$eer}J +zaHMZZVMq7nm2%xebYT*nCO`0#Av{c4OH5L}a8$?m2-OZ!NUhSS;B!{h#Q4}eceqi$ +z{(zwVN1ud6l9<}9+cP|F-D*@dRG_YDLf1M~HrwZ~AD7E7fV6t_yUP^;suu2CSAC;2 +zFMa@JPx#w>TD8GpUp;C;2uJKH +z*)^C!yrMS`?scQnF5zsCPFI>?Xhd!kdw<=DbA{>?OO4mz$_f%KnUSk;dh+Ws!uLE; +zUxjX63^5l;A~^N`B!cQOB(iMirv}%K&VARqrj`9&0Y}tGrO9nZ3+uQZCOUs5?EC9$ +zewNam0Vkz5aDR&_>}qBbX&DbZW=5C;^4$Y0O{F}81rng<6Z?nQdjkk96%XimsEijp +zlfBqR(5I8nRlC5@ej>0_j2OdtSqI$Mi+&=IDj<=BXRx^!jVF*q*rM=Rb~YGCm%bLK +zE|p^vY}FfNXC3Dm+#5$aCFqrZ7=kXLIpa=C$k;w36FGs^d*okRIf0J7O2;F>H9-3t +zJBoKWMay)byg@KgJahg4Ths0}CxE*BG|t2cwv02YInLBK9|=wy5p7aU(Dj|cq9FI9 +zj1q>1NCAv)iu>7tk)oZ#33do|`&egP_3u?#;SUWU7#yvI7Ac8b|#&x27nxzo7S4;LbOic}O={O(eHm@L`vAV7W? +zG+##5{Bp?DpX}m0I6x0p%@m6msua@fMNoZWP~fDUVw}i0Q|`Cm#GP!HY?M<$Q1ll; +zE2#k}Q@&v)`Pasb?hQS|n)^LXIf)4~JX*n%ur14lY13a(PAZ?A7fcQi +zXDjs`tW%QT9JSoL+~2ZLI=sHF9m*mI&$4`$ObPvpOC!hnXY79M=Bf}-OfZD#=!OW0 +zzG&JtwR7!)Dya7tG02U@5>_;hZtpxizHV4<_;3!?o(PM5^==e>@Y{Sb@|#~2EHfzk +zD23ZVzo9^qk4zS`CG6Kz?JU34LE6^q*yKA>DyM2B@v)pQ9J2ltI>A@gXpboBe`Nn+ +z9!5g541dzW$}8;Ww7}Z!0=DX2-1>+Kvh|`eO>rjWN+vFB3*fY2IpgGz^4Ey2PR+TD +zO+5RniAfhoNhjA-p=3zOnit5#mW%u}$Z;IG2(n-&;r{;@5s;rJlI={U^FQ^IcMd1z +zQoTxk5Y?T8hfidLviY<+i0DCoYLQ?X*XkDMwKvVsY=52==HQogHCNSaU{fqX}A +zkOf3i5~Z8ec8W?qpK2zBt#x4IOq1bAFT}|HBZLZ!uJVag{r_gU@1(IZnIvx%i34&3 +zG6WQOlW$ucn5{ +zu#r4nZ8C?>1TsF!93;4qT#yLcen!DT$|(Sf*omYBu8iP(!0F1rxhlud078RwD2^1{ +zbScsem#hC9xGC}=LhSS(0Fc3!Ozlw_yZi%gRPywPbX+(LW`weA +zEFzOfdOir-UZwI`T9wOJxz}oztS|i|7-R6@;6*#ok{6-{g?s;*@}_2Uv{qe8cn86y +zqicY1-V@6RBwnm(=ia?VusaD)Ebt1>_H?dGc;c1&=u|+?JnroMx?@Ins4+Vi`Xs;H +zxMI22>>g&?(t}_vaI<_mps%ZS8V?QG4PLpQzZzqE;6qRdzKl^LT7D-a)JR(x!TZ=k +z?dytfLT>BSXu?3(n}Ap2?1u?n&x;Vv@%29Y+Xlx3e1}V=y9CQhziKBB^>_Wf)#PO` +zF8U)R*4#HF?~wL4tSdeTeQs=78xgG)j#oQW57^&E95>#5vhURCtkw5VZK`Xk&bT&1 +zDNvtLYBFDgSN|l^TaXlxioC*oA0zDS%pDFCi}6bK5pfSYpKlPFe(-V51UhuD!#hE5 +z-ev!n8NEtgs#6s#-+x@-qa1s7{)Y0t2GQ)ZpC8&H37Qux_v9XW*HR;$Z`9--UOvG@ +zN8Cg6k1gt$p}P1M+T)hj;ii~S$KNj~R9+sdq15rK_Gmt@l!%YKHC^p?26q4MyKOpS +zFG^{559{WcKJ%+R>R(W^BjNp>vju{>TJBCkgx1>1=E{XW#~1rp9c@0gbW9M+*?z&; +zC2`K+e0u%1gndpubJxx;oNs$%b?Uaopn0OU+}vH+ZRx5!#)gwmw|x(In7(ONilSDEPQvdhzHIdew_fehzWdhp?ygHR<_H*HnYnEbAHb?&~xyc{O3f+*9uFTKMvF +zOWY$j`sKWp_@3SpdrSPL!EwhA;W@>7LNsed2X9orUF3O_dQMXBfb^7c)|`OTj?||= +z>JK)}W5Ln`KsT52lzut=IldpL$5-#qw2~ZQRlOi`T4AOL4LrQ7Q+}hHwZQ4)?>eWB +zZ5Tz?K12n%7Fl?;6s7wqJ~XS?Uw`UIsq5ZBhkVI{9p*~glkC5Jm0?<7`R3sCj!O{rZCCd0~ +zIIr9HSXh2}4>6kYz*oeOv?y08gcqc}7m0WhoN;$*01PN)0?WW#g1&9vQ@sVI5Kf_C +zL>l?0hn+7spQ(~U>losD5eLlqAfdy(%#t?GLy6<$L^6L29Lq3xwx$K4U*Zn3D=@?| +zMzb7aQ@m<8CnoBXaIMdn(-j^nxu34&C}%xS1E*Qw6P}-@p$O&tK5Aoc8 +zfs~KVRBB*Tt!u%>X>Vp~!pk@2x+z{wPlh4FCEgkQ=`U`fZ&mLb*y~xkKEqoj;5%~* +zIEoyZ8b$57IueL^y$@dA-1pFJKzVIq)g$6L&iXc!0}~a7_IHKP+K+Z0E%|!-<5&GN +zjw<3>&t*$l#oLY5zpl*rh#JY3yY@oXynfc^+#yH3=Th6Y4>g=J8YcKlFT!$u~ +zU}h$^s+Aj*!kGRmg5qdO&I&L3*^3Ul-?>~uq%5kE(CDVnT(u4M-CNUBNu%BUi2BJ! +zPh2=Jj;*RtaKQNx;WG2G9dMOuN8=8i|I6T(=e2y0NWti}1f_5D7?+p(_g_E(Hg(Yb +L#Syu9MY;b1+Xr6l + +literal 0 +HcmV?d00001 + +-- +2.21.0 + diff --git a/0031-chfn-don-t-append-extra-tailing-commas.patch b/0031-chfn-don-t-append-extra-tailing-commas.patch new file mode 100644 index 0000000..256b95f --- /dev/null +++ b/0031-chfn-don-t-append-extra-tailing-commas.patch @@ -0,0 +1,43 @@ +From 90d4faece26c328c40336a0e02b875515c503e30 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 19 Aug 2019 14:03:07 +0200 +Subject: [PATCH 31/32] chfn: don't append extra tailing commas + + # grep kzak /etc/passwd + kzak:x:1000:1000::/home/kzak:/bin/bash + + # chfn kzak + ... + grep kzak /etc/passwd + +old version: + kzak:x:1000:1000:Karel Zak,,,,:/home/kzak:/bin/bash + +fixed version: + kzak:x:1000:1000:Karel Zak:/home/kzak:/bin/bash + +Reported-by: Filip Dvorak +References: f723cbf544a7eac2927634f2cb6d802437a2d519 +Upstream: http://github.com/karelzak/util-linux/commit/9210c0d225fd808da451d86055bf243a8b47a525 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1743555 +Signed-off-by: Karel Zak +--- + login-utils/chfn.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/login-utils/chfn.c b/login-utils/chfn.c +index c5312fa0c..4f32604c5 100644 +--- a/login-utils/chfn.c ++++ b/login-utils/chfn.c +@@ -377,7 +377,7 @@ static int save_new_data(struct chfn_control *ctl) + ctl->newf.other); + + /* remove trailing empty fields (but not subfields of ctl->newf.other) */ +- if (!ctl->newf.other) { ++ if (!ctl->newf.other || !*ctl->newf.other) { + while (len > 0 && gecos[len - 1] == ',') + len--; + gecos[len] = 0; +-- +2.21.0 + diff --git a/0032-tests-add-new-test-for-chfn-gecos.patch b/0032-tests-add-new-test-for-chfn-gecos.patch new file mode 100644 index 0000000..646efc0 --- /dev/null +++ b/0032-tests-add-new-test-for-chfn-gecos.patch @@ -0,0 +1,83 @@ +From 447b7d7222bf8cb3591d611aa51917bd4453f8d6 Mon Sep 17 00:00:00 2001 +From: Radka Skvarilova +Date: Mon, 16 Dec 2019 10:57:32 +0100 +Subject: [PATCH 32/32] tests: add new test for chfn gecos + +Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1743555 +Upstream: http://github.com/karelzak/util-linux/commit/02238bff663ce5fe823980d8119f3871cc348764 +Upstream: http://github.com/karelzak/util-linux/commit/b2ef43864f24b1a9c0c67fe2a7177a5110da1b6e +Signed-off-by: Karel Zak +--- + tests/commands.sh | 1 + + tests/expected/chfn/gecos | 6 ++++++ + tests/ts/chfn/gecos | 36 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 43 insertions(+) + create mode 100644 tests/expected/chfn/gecos + create mode 100755 tests/ts/chfn/gecos + +diff --git a/tests/commands.sh b/tests/commands.sh +index 93100caf6..b56381c9e 100644 +--- a/tests/commands.sh ++++ b/tests/commands.sh +@@ -104,3 +104,4 @@ TS_CMD_UUIDPARSE=${TS_CMD_UUIDPARSE-"${ts_commandsdir}uuidparse"} + TS_CMD_WHEREIS=${TS_CMD_WHEREIS-"${ts_commandsdir}whereis"} + TS_CMD_WIPEFS=${TS_CMD_WIPEFS-"${ts_commandsdir}wipefs"} + TS_CMD_CHRT=${TS_CMD_CHRT-"${ts_commandsdir}chrt"} ++TS_CMD_CHFN=${TS_CMD_CHFN-"${ts_commandsdir}chfn"} +diff --git a/tests/expected/chfn/gecos b/tests/expected/chfn/gecos +new file mode 100644 +index 000000000..af7b81b6c +--- /dev/null ++++ b/tests/expected/chfn/gecos +@@ -0,0 +1,6 @@ ++Initialize user ++testuser_chfn_test:x:9899:9899::/home/testuser_chfn_test:/bin/bash ++Changing finger information for testuser_chfn_test. ++ ++Finger information changed. ++testuser_chfn_test:x:9899:9899:test_gecos:/home/testuser_chfn_test:/bin/bash +diff --git a/tests/ts/chfn/gecos b/tests/ts/chfn/gecos +new file mode 100755 +index 000000000..aad27d40a +--- /dev/null ++++ b/tests/ts/chfn/gecos +@@ -0,0 +1,36 @@ ++#!/bin/bash ++ ++# ++# Copyright (C) 2019 Radka Skvarilova ++# ++# This file is part of util-linux. ++# ++# This file is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This file is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++ ++TS_TOPDIR="${0%/*}/../.." ++TS_DESC="gecos" ++ ++. $TS_TOPDIR/functions.sh ++ts_init "$*" ++ ++ts_skip_nonroot ++ts_check_test_command "$TS_CMD_CHFN" ++ts_check_prog "useradd" ++ts_check_prog "userdel" ++ ++ts_log "Initialize user" ++useradd -u 9899 --shell /bin/bash testuser_chfn_test ++grep testuser /etc/passwd >> $TS_OUTPUT ++$TS_CMD_CHFN -f test_gecos testuser_chfn_test >>$TS_OUTPUT ++grep testuser /etc/passwd >> $TS_OUTPUT ++userdel --remove testuser_chfn_test &> /dev/null ++ts_finalize +-- +2.21.0 + diff --git a/0033-tests-update-lscpu-test-for-RHEL8.patch b/0033-tests-update-lscpu-test-for-RHEL8.patch new file mode 100644 index 0000000..8ba4702 --- /dev/null +++ b/0033-tests-update-lscpu-test-for-RHEL8.patch @@ -0,0 +1,83 @@ +From b30f84e240bd60a23508797e33a4777cbaa50949 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 17 Dec 2019 10:53:47 +0100 +Subject: [PATCH] tests: update lscpu test for RHEL8 + +The test is originally from upstream (~v2.35), but RHEL-8 uses older +version with a little different output -- RHEL-8 has no vulnerability +fields and it counts cache sizes in different way. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1739443 +Signed-off-by: Karel Zak +--- + tests/expected/lscpu/lscpu-s390-nested-virt | 57 ++++++++++----------- + 1 file changed, 26 insertions(+), 31 deletions(-) + +diff --git a/tests/expected/lscpu/lscpu-s390-nested-virt b/tests/expected/lscpu/lscpu-s390-nested-virt +index 2665fd8dc..a6ab04f0b 100644 +--- a/tests/expected/lscpu/lscpu-s390-nested-virt ++++ b/tests/expected/lscpu/lscpu-s390-nested-virt +@@ -1,34 +1,29 @@ +-CPU op-mode(s): 32-bit, 64-bit +-CPU(s): 2 +-On-line CPU(s) list: 0,1 +-Thread(s) per core: 1 +-Core(s) per socket: 1 +-Socket(s) per book: 1 +-Book(s) per drawer: 1 +-Drawer(s): 2 +-NUMA node(s): 1 +-Vendor ID: IBM/S390 +-Machine type: 2964 +-CPU dynamic MHz: 5000 +-CPU static MHz: 5000 +-BogoMIPS: 3033.00 +-Hypervisor: KVM/Linux +-Hypervisor vendor: KVM +-Virtualization type: full +-Dispatching mode: horizontal +-L1d cache: 256 KiB +-L1i cache: 192 KiB +-L2d cache: 4 MiB +-L2i cache: 4 MiB +-L3 cache: 64 MiB +-L4 cache: 480 MiB +-NUMA node0 CPU(s): 0,1 +-Vulnerability L1tf: Not affected +-Vulnerability Meltdown: Not affected +-Vulnerability Spec store bypass: Not affected +-Vulnerability Spectre v1: Mitigation; __user pointer sanitization +-Vulnerability Spectre v2: Mitigation; execute trampolines +-Flags: esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te vx ++CPU op-mode(s): 32-bit, 64-bit ++CPU(s): 2 ++On-line CPU(s) list: 0,1 ++Thread(s) per core: 1 ++Core(s) per socket: 1 ++Socket(s) per book: 1 ++Book(s) per drawer: 1 ++Drawer(s): 2 ++NUMA node(s): 1 ++Vendor ID: IBM/S390 ++Machine type: 2964 ++CPU dynamic MHz: 5000 ++CPU static MHz: 5000 ++BogoMIPS: 3033.00 ++Hypervisor: KVM/Linux ++Hypervisor vendor: KVM ++Virtualization type: full ++Dispatching mode: horizontal ++L1d cache: 128K ++L1i cache: 96K ++L2d cache: 2048K ++L2i cache: 2048K ++L3 cache: 65536K ++L4 cache: 491520K ++NUMA node0 CPU(s): 0,1 ++Flags: esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te vx + + # The following is the parsable format, which can be fed to other + # programs. Each different item in every column has an unique ID +-- +2.21.0 + diff --git a/0034-tests-fdisk-make-sure-we-use-the-same-sizes-for-MD-d.patch b/0034-tests-fdisk-make-sure-we-use-the-same-sizes-for-MD-d.patch new file mode 100644 index 0000000..99cdd50 --- /dev/null +++ b/0034-tests-fdisk-make-sure-we-use-the-same-sizes-for-MD-d.patch @@ -0,0 +1,91 @@ +From 60f97394878d8b540ee6a4fb9c9edaae2f90d0d0 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 17 Dec 2019 18:10:31 +0100 +Subject: [PATCH] tests: (fdisk) make sure we use the same sizes for MD devices + +It seems on some kernels MD can return error if the devices in RAID +have different size + + # mdadm -q --create /dev/md8 --chunk=64 --level=0 --raid-devices=2 /dev/sda1 /dev/sda2 + mdadm: RUN_ARRAY failed: Unknown error 524 + + # dmesg + ... + [ 1485.148435] md/raid0:md8: cannot assemble multi-zone RAID0 with default_layout setting + [ 1485.152306] md/raid0: please set raid.default_layout to 1 or 2 + [ 1485.154050] md: pers->run() failed ... + [ 1485.154104] md: md8 stopped. + +Reference: https://bugzilla.redhat.com/show_bug.cgi?id=1784534 +Signed-off-by: Karel Zak +--- + tests/expected/fdisk/align-512-4K-md | 12 ++++++------ + tests/ts/fdisk/align-512-4K-md | 4 ++-- + 2 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/tests/expected/fdisk/align-512-4K-md b/tests/expected/fdisk/align-512-4K-md +index caca03154..3690c04c2 100644 +--- a/tests/expected/fdisk/align-512-4K-md ++++ b/tests/expected/fdisk/align-512-4K-md +@@ -16,7 +16,7 @@ Created a new . + Command (m for help): Partition type + p primary (1 primary, 0 extended, 3 free) + e extended (container for logical partitions) +-Select (default p): Partition number (2-4, default 2): First sector (43008-102399, default 43008): Last sector, +sectors or +size{K,M,G,T,P} (43008-102399, default 102399): ++Select (default p): Partition number (2-4, default 2): First sector (51199-102399, default 51200): Last sector, +sectors or +size{K,M,G,T,P} (51200-102399, default 102399): + Created a new . + + Command (m for help): Disk : 50 MiB, 52428800 bytes, 102400 sectors +@@ -27,8 +27,8 @@ Disklabel type: dos + Disk identifier: + + Device Boot Start End Sectors Size Id Type +-1 2048 43007 40960 20M 83 Linux +-2 43008 102399 59392 29M 83 Linux ++1 2048 51198 49151 24M 83 Linux ++2 51200 100350 49151 24M 83 Linux + + Command (m for help): The partition table has been altered. + Calling ioctl() to re-read partition table. +@@ -49,16 +49,16 @@ Created a new . + Command (m for help): Partition type + p primary (0 primary, 0 extended, 4 free) + e extended (container for logical partitions) +-Select (default p): Partition number (1-4, default 1): First sector (2048-100095, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-100095, default 100095): ++Select (default p): Partition number (1-4, default 1): First sector (2048-97791, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-97791, default 97791): + Created a new . + + Command (m for help): Partition type + p primary (1 primary, 0 extended, 3 free) + e extended (container for logical partitions) +-Select (default p): Partition number (2-4, default 2): First sector (22528-100095, default 22528): Last sector, +sectors or +size{K,M,G,T,P} (22528-100095, default 100095): ++Select (default p): Partition number (2-4, default 2): First sector (22528-97791, default 22528): Last sector, +sectors or +size{K,M,G,T,P} (22528-97791, default 97791): + Created a new . + +-Command (m for help): Disk : 48.9 MiB, 51249152 bytes, 100096 sectors ++Command (m for help): Disk : 47.8 MiB, 50069504 bytes, 97792 sectors + Units: sectors of 1 * 512 = 512 bytes + Sector size (logical/physical): 512 bytes / 4096 bytes + I/O size (minimum/optimal): 65536 bytes / bytes +diff --git a/tests/ts/fdisk/align-512-4K-md b/tests/ts/fdisk/align-512-4K-md +index 7f60a654f..68aaff0b7 100755 +--- a/tests/ts/fdisk/align-512-4K-md ++++ b/tests/ts/fdisk/align-512-4K-md +@@ -41,12 +41,12 @@ n + p + 1 + +-+20M +++49150 + n + p + 2 + +- +++49150 + p + w + q +-- +2.21.0 + diff --git a/0035-tests-mark-MD-tests-with-metadata-v0.90-as-KNOWN-FAI.patch b/0035-tests-mark-MD-tests-with-metadata-v0.90-as-KNOWN-FAI.patch new file mode 100644 index 0000000..8759594 --- /dev/null +++ b/0035-tests-mark-MD-tests-with-metadata-v0.90-as-KNOWN-FAI.patch @@ -0,0 +1,80 @@ +From 3fd5c8e78a9758a6fc9310485d2428e300ad3b63 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Thu, 11 Jun 2020 10:55:25 +0200 +Subject: [PATCH 35/40] tests: mark MD tests with metadata v0.90 as KNOWN-FAIL + +metadata v0.90 is deprecated thing and unsupported to create by some new +mdadm versions. It's possible to assemble this array (with +default_layout=1 on modprobe raid0), but impossible to create a new +one. + +Upstream: http://github.com/karelzak/util-linux/commit/4ae96cf77b36660255d5870a4209480bbec47902 +Upstream: http://github.com/karelzak/util-linux/commit/7519c3edab120b14623931d5ddb16fdc6e7cad5d +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1826251 +Signed-off-by: Karel Zak +--- + tests/ts/blkid/md-raid0-whole | 3 +++ + tests/ts/blkid/md-raid1-part | 3 +++ + tests/ts/blkid/md-raid1-whole | 3 +++ + tests/ts/fdisk/align-512-4K-md | 3 +++ + 4 files changed, 12 insertions(+) + +diff --git a/tests/ts/blkid/md-raid0-whole b/tests/ts/blkid/md-raid0-whole +index 45c6ee55b..1f3fc2634 100755 +--- a/tests/ts/blkid/md-raid0-whole ++++ b/tests/ts/blkid/md-raid0-whole +@@ -29,6 +29,9 @@ ts_skip_nonroot + ts_check_losetup + ts_check_prog "mdadm" + ++# rhbz#182625: It can't create new raid0 with metadata 0.90 from mdadm-4.1-12. ++TS_KNOWN_FAIL="yes" ++ + ts_log "Initialize devices" + IMGNAME="${TS_OUTDIR}/${TS_TESTNAME}" + +diff --git a/tests/ts/blkid/md-raid1-part b/tests/ts/blkid/md-raid1-part +index 3fa6395b0..3d42aadb8 100755 +--- a/tests/ts/blkid/md-raid1-part ++++ b/tests/ts/blkid/md-raid1-part +@@ -28,6 +28,9 @@ ts_check_test_command "$TS_CMD_BLKID" + ts_skip_nonroot + ts_check_prog "mdadm" + ++# rhbz#182625: It can't create new raid0 with metadata 0.90 from mdadm-4.1-12. ++TS_KNOWN_FAIL="yes" ++ + # set global variable TS_DEVICE + ts_scsi_debug_init dev_size_mb=51 sector_size=512 + +diff --git a/tests/ts/blkid/md-raid1-whole b/tests/ts/blkid/md-raid1-whole +index ddf4a6934..6eba9cc8e 100755 +--- a/tests/ts/blkid/md-raid1-whole ++++ b/tests/ts/blkid/md-raid1-whole +@@ -29,6 +29,9 @@ ts_skip_nonroot + ts_check_losetup + ts_check_prog "mdadm" + ++# rhbz#182625: It can't create new raid0 with metadata 0.90 from mdadm-4.1-12. ++TS_KNOWN_FAIL="yes" ++ + ts_log "Initialize devices" + IMGNAME="${TS_OUTDIR}/${TS_TESTNAME}" + +diff --git a/tests/ts/fdisk/align-512-4K-md b/tests/ts/fdisk/align-512-4K-md +index 68aaff0b7..0a8e09bc1 100755 +--- a/tests/ts/fdisk/align-512-4K-md ++++ b/tests/ts/fdisk/align-512-4K-md +@@ -31,6 +31,9 @@ ts_check_test_command "$TS_CMD_FDISK" + ts_skip_nonroot + ts_check_prog "mdadm" + ++# rhbz#182625: It can't create new raid0 with metadata 0.90 from mdadm-4.1-12. ++TS_KNOWN_FAIL="yes" ++ + # set global variable TS_DEVICE + ts_scsi_debug_init dev_size_mb=50 sector_size=512 physblk_exp=3 + DEVNAME=$(basename $TS_DEVICE) +-- +2.25.4 + diff --git a/0036-libblkid-add-BitLocker-detection.patch b/0036-libblkid-add-BitLocker-detection.patch new file mode 100644 index 0000000..993bf9d --- /dev/null +++ b/0036-libblkid-add-BitLocker-detection.patch @@ -0,0 +1,284 @@ +From ae7b79ff8a7fb576c018bc9a7eaf9e135b7b553e Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 24 Apr 2018 10:57:48 +0200 +Subject: [PATCH 36/40] libblkid: add BitLocker detection + +Supported: +* WinVista version +* Win7 and later versions (based on NTFS) +* BitLockerToGo (for removable media; based on FAT32) + +Unfortunately, it's without LABEL and UUID. It seems BitLocker does +not use volume_label and volume_serial stuff from NTFS header. + +Upstream: http://github.com/karelzak/util-linux/commit/136f89ce5ed8cd159a1c56b5a775dada2363ecd3 +Upstream: http://github.com/karelzak/util-linux/commit/47afae0caaa2b3440d6ac812079e3ada5f2aa0bd (bitlocker.c part) +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1812576 +Addresses: https://github.com/karelzak/util-linux/issues/617 +Signed-off-by: Karel Zak +--- + libblkid/src/Makemodule.am | 1 + + libblkid/src/superblocks/bitlocker.c | 191 +++++++++++++++++++++++++ + libblkid/src/superblocks/superblocks.c | 1 + + libblkid/src/superblocks/superblocks.h | 3 + + libblkid/src/superblocks/vfat.c | 3 + + 5 files changed, 199 insertions(+) + create mode 100644 libblkid/src/superblocks/bitlocker.c + +diff --git a/libblkid/src/Makemodule.am b/libblkid/src/Makemodule.am +index 0e1c765fb..ea0230702 100644 +--- a/libblkid/src/Makemodule.am ++++ b/libblkid/src/Makemodule.am +@@ -47,6 +47,7 @@ libblkid_la_SOURCES = \ + libblkid/src/superblocks/bcache.c \ + libblkid/src/superblocks/befs.c \ + libblkid/src/superblocks/bfs.c \ ++ libblkid/src/superblocks/bitlocker.c \ + libblkid/src/superblocks/btrfs.c \ + libblkid/src/superblocks/cramfs.c \ + libblkid/src/superblocks/ddf_raid.c \ +diff --git a/libblkid/src/superblocks/bitlocker.c b/libblkid/src/superblocks/bitlocker.c +new file mode 100644 +index 000000000..111edf39b +--- /dev/null ++++ b/libblkid/src/superblocks/bitlocker.c +@@ -0,0 +1,191 @@ ++/* ++ * Copyright (C) 2018 Karel Zak ++ * ++ * This file may be redistributed under the terms of the ++ * GNU Lesser General Public License. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "superblocks.h" ++ ++#define BDE_HDR_SIZE 512 ++#define BDE_HDR_OFFSET 0 ++ ++struct bde_header_win7 { ++/* 0 */ unsigned char boot_entry_point[3]; ++/* 3 */ unsigned char fs_signature[8]; ++/* 11 */ unsigned char __dummy1[67 - 11]; ++/* 67 */ uint32_t volume_serial; /* NTFS uses 64bit serial number */ ++/* 71 */ unsigned char volume_label[11]; /* "NO NAME\x20\x20\x20\x20" only */ ++/* 82 */ unsigned char __dummy2[160 - 82]; ++/* 160 */ unsigned char guid[16]; /* BitLocker specific GUID */ ++/* 176 */ uint64_t fve_metadata_offset; ++} __attribute__((packed)); ++ ++ ++struct bde_header_togo { ++/* 0 */ unsigned char boot_entry_point[3]; ++/* 3 */ unsigned char fs_signature[8]; ++/* 11 */ unsigned char __dummy[424 - 11]; ++/* 424 */ unsigned char guid[16]; ++/* 440 */ uint64_t fve_metadata_offset; ++} __attribute__((packed)); ++ ++ ++struct bde_fve_metadata { ++/* 0 */ unsigned char signature[8]; ++/* 8 */ uint16_t size; ++/* 10 */ uint16_t version; ++}; ++ ++enum { ++ BDE_VERSION_VISTA = 0, ++ BDE_VERSION_WIN7, ++ BDE_VERSION_TOGO ++}; ++ ++#define BDE_MAGIC_VISTA "\xeb\x52\x90-FVE-FS-" ++#define BDE_MAGIC_WIN7 "\xeb\x58\x90-FVE-FS-" ++#define BDE_MAGIC_TOGO "\xeb\x58\x90MSWIN4.1" ++ ++#define BDE_MAGIC_FVE "-FVE-FS-" ++ ++static int get_bitlocker_type(const unsigned char *buf) ++{ ++ size_t i; ++ static const char *map[] = { ++ [BDE_VERSION_VISTA] = BDE_MAGIC_VISTA, ++ [BDE_VERSION_WIN7] = BDE_MAGIC_WIN7, ++ [BDE_VERSION_TOGO] = BDE_MAGIC_TOGO ++ }; ++ ++ for (i = 0; i < ARRAY_SIZE(map); i++) { ++ if (memcmp(buf, map[i], 11) == 0) ++ return (int) i; ++ } ++ ++ return -1; ++} ++ ++/* Returns: < 0 error, 1 nothing, 0 success ++ */ ++static int get_bitlocker_headers(blkid_probe pr, ++ int *type, ++ const unsigned char **buf_hdr, ++ const unsigned char **buf_fve) ++{ ++ ++ const unsigned char *buf; ++ const struct bde_fve_metadata *fve; ++ uint64_t off = 0; ++ int kind; ++ ++ if (buf_hdr) ++ *buf_hdr = NULL; ++ if (buf_fve) ++ *buf_fve = NULL; ++ if (type) ++ *type = -1; ++ ++ buf = blkid_probe_get_buffer(pr, BDE_HDR_OFFSET, BDE_HDR_SIZE); ++ if (!buf) ++ return errno ? -errno : 1; ++ ++ kind = get_bitlocker_type(buf); ++ ++ /* Check BitLocker header */ ++ switch (kind) { ++ case BDE_VERSION_WIN7: ++ off = le64_to_cpu(((const struct bde_header_win7 *) buf)->fve_metadata_offset); ++ break; ++ case BDE_VERSION_TOGO: ++ off = le64_to_cpu(((const struct bde_header_togo *) buf)->fve_metadata_offset); ++ break; ++ case BDE_VERSION_VISTA: ++ goto done; ++ default: ++ goto nothing; ++ } ++ ++ if (!off) ++ goto nothing; ++ if (buf_hdr) ++ *buf_hdr = buf; ++ ++ /* Check Bitlocker FVE metadata header */ ++ buf = blkid_probe_get_buffer(pr, off, sizeof(struct bde_fve_metadata)); ++ if (!buf) ++ return errno ? -errno : 1; ++ ++ fve = (const struct bde_fve_metadata *) buf; ++ if (memcmp(fve->signature, BDE_MAGIC_FVE, sizeof(fve->signature)) != 0) ++ goto nothing; ++ if (buf_fve) ++ *buf_fve = buf; ++done: ++ if (type) ++ *type = kind; ++ return 0; ++nothing: ++ return 1; ++} ++ ++/* ++ * This is used by vFAT and NTFS prober to avoid collisions with bitlocker. ++ */ ++int blkid_probe_is_bitlocker(blkid_probe pr) ++{ ++ return get_bitlocker_headers(pr, NULL, NULL, NULL) == 0; ++} ++ ++static int probe_bitlocker(blkid_probe pr, ++ const struct blkid_idmag *mag __attribute__((__unused__))) ++{ ++ const unsigned char *buf_fve = NULL; ++ const unsigned char *buf_hdr = NULL; ++ int rc, kind; ++ ++ rc = get_bitlocker_headers(pr, &kind, &buf_hdr, &buf_fve); ++ if (rc) ++ return rc; ++ ++ if (kind == BDE_VERSION_WIN7) { ++ const struct bde_header_win7 *hdr = (const struct bde_header_win7 *) buf_hdr; ++ ++ /* Unfortunately, it seems volume_serial is always zero */ ++ blkid_probe_sprintf_uuid(pr, ++ (const unsigned char *) &hdr->volume_serial, ++ sizeof(hdr->volume_serial), ++ "%016d", le32_to_cpu(hdr->volume_serial)); ++ } ++ ++ if (buf_fve) { ++ const struct bde_fve_metadata *fve = (const struct bde_fve_metadata *) buf_fve; ++ ++ blkid_probe_sprintf_version(pr, "%d", fve->version); ++ } ++ return 0; ++} ++ ++/* See header details: ++ * https://github.com/libyal/libbde/blob/master/documentation/BitLocker%20Drive%20Encryption%20(BDE)%20format.asciidoc ++ */ ++const struct blkid_idinfo bitlocker_idinfo = ++{ ++ .name = "BitLocker", ++ .usage = BLKID_USAGE_CRYPTO, ++ .probefunc = probe_bitlocker, ++ .magics = ++ { ++ { .magic = BDE_MAGIC_VISTA, .len = 11 }, ++ { .magic = BDE_MAGIC_WIN7, .len = 11 }, ++ { .magic = BDE_MAGIC_TOGO, .len = 11 }, ++ { NULL } ++ } ++}; +diff --git a/libblkid/src/superblocks/superblocks.c b/libblkid/src/superblocks/superblocks.c +index 076541d1a..6dfd2be64 100644 +--- a/libblkid/src/superblocks/superblocks.c ++++ b/libblkid/src/superblocks/superblocks.c +@@ -115,6 +115,7 @@ static const struct blkid_idinfo *idinfos[] = + &ubi_idinfo, + &vdo_idinfo, + &stratis_idinfo, ++ &bitlocker_idinfo, + + /* Filesystems */ + &vfat_idinfo, +diff --git a/libblkid/src/superblocks/superblocks.h b/libblkid/src/superblocks/superblocks.h +index 2723fb1d5..d677f85bc 100644 +--- a/libblkid/src/superblocks/superblocks.h ++++ b/libblkid/src/superblocks/superblocks.h +@@ -81,6 +81,7 @@ extern const struct blkid_idinfo bcache_idinfo; + extern const struct blkid_idinfo mpool_idinfo; + extern const struct blkid_idinfo vdo_idinfo; + extern const struct blkid_idinfo stratis_idinfo; ++extern const struct blkid_idinfo bitlocker_idinfo; + + /* + * superblock functions +@@ -105,4 +106,6 @@ extern int blkid_probe_set_id_label(blkid_probe pr, const char *name, + extern int blkid_probe_set_utf8_id_label(blkid_probe pr, const char *name, + unsigned char *data, size_t len, int enc); + ++extern int blkid_probe_is_bitlocker(blkid_probe pr); ++ + #endif /* _BLKID_SUPERBLOCKS_H */ +diff --git a/libblkid/src/superblocks/vfat.c b/libblkid/src/superblocks/vfat.c +index 3aeba018a..29b3c501c 100644 +--- a/libblkid/src/superblocks/vfat.c ++++ b/libblkid/src/superblocks/vfat.c +@@ -268,6 +268,9 @@ static int fat_valid_superblock(blkid_probe pr, + } + } + ++ if (blkid_probe_is_bitlocker(pr)) ++ return 0; ++ + return 1; /* valid */ + } + +-- +2.25.4 + diff --git a/0037-blkid-retport-block-size-of-a-filesystem.patch b/0037-blkid-retport-block-size-of-a-filesystem.patch new file mode 100644 index 0000000..2795684 --- /dev/null +++ b/0037-blkid-retport-block-size-of-a-filesystem.patch @@ -0,0 +1,1121 @@ +From 9e9355c71c031f4d7445c30cb39bd6b33c10ff9d Mon Sep 17 00:00:00 2001 +From: Mikulas Patocka +Date: Mon, 2 Sep 2019 12:28:39 +0200 +Subject: [PATCH 37/40] blkid: retport block size of a filesystem + +This patch extends libblkid, so that it reports filesystem block size. + +When blkid returns a specific number in the BLOCK_SIZE attribute, it +guarantees that all the bios submitted by the filesystem are aligned on +this boundary. + +We need this because when we want to enable dm-integrity or dm-writecache +on an existing filesystem, we need to know filesystem block size, so that +dm-integrity or dm-writecache is initialized with matching block size. + +We could always use block size 512 for dm-integrity and dm-writecache, but +that would cause metadata overhead and performance degradation. On the +other hand, if we used block size 4096, it would fail if the filesystem +has smaller blocksize. + +[kzak@redhat.com: - move vfat BLOCK_SIZE to probing function + - remove unwanted debug fprintf from ZFS prober] + +RHEL-8.3: add regression tests updates to teh patch too + +Upstream: http://github.com/karelzak/util-linux/commit/cd129b7d2fecd5f2013512936de2db1bf244aa75 +Upstream: http://github.com/karelzak/util-linux/commit/e7d318a9dd63c9fae8f07754ce12aa9af4dce089 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1817726 +Signed-off-by: Mikulas Patocka +Signed-off-by: Karel Zak +--- + libblkid/src/superblocks/befs.c | 3 + + libblkid/src/superblocks/btrfs.c | 1 + + libblkid/src/superblocks/exfat.c | 2 + + libblkid/src/superblocks/exfs.c | 4 + + libblkid/src/superblocks/ext.c | 3 + + libblkid/src/superblocks/f2fs.c | 2 + + libblkid/src/superblocks/gfs.c | 1 + + libblkid/src/superblocks/hfs.c | 2 + + libblkid/src/superblocks/hpfs.c | 1 + + libblkid/src/superblocks/iso9660.c | 2 + + libblkid/src/superblocks/jfs.c | 1 + + libblkid/src/superblocks/minix.c | 5 ++ + libblkid/src/superblocks/nilfs.c | 3 + + libblkid/src/superblocks/ntfs.c | 2 + + libblkid/src/superblocks/ocfs.c | 3 + + libblkid/src/superblocks/reiserfs.c | 10 ++- + libblkid/src/superblocks/romfs.c | 3 + + libblkid/src/superblocks/squashfs.c | 2 + + libblkid/src/superblocks/superblocks.c | 7 ++ + libblkid/src/superblocks/superblocks.h | 2 + + libblkid/src/superblocks/udf.c | 2 + + libblkid/src/superblocks/ufs.c | 5 ++ + libblkid/src/superblocks/vfat.c | 2 + + libblkid/src/superblocks/vxfs.c | 18 ++++- + libblkid/src/superblocks/xfs.c | 1 + + libblkid/src/superblocks/zfs.c | 74 ++++++++++++++----- + tests/expected/blkid/low-probe-befs | 1 + + tests/expected/blkid/low-probe-exfat | 1 + + tests/expected/blkid/low-probe-ext2 | 1 + + tests/expected/blkid/low-probe-ext3 | 1 + + tests/expected/blkid/low-probe-f2fs | 1 + + tests/expected/blkid/low-probe-fat | 1 + + tests/expected/blkid/low-probe-fat16_noheads | 1 + + .../blkid/low-probe-fat32_cp850_O_tilde | 1 + + .../expected/blkid/low-probe-fat32_label_64MB | 1 + + tests/expected/blkid/low-probe-gfs2 | 1 + + tests/expected/blkid/low-probe-hfsplus | 1 + + tests/expected/blkid/low-probe-hpfs | 1 + + tests/expected/blkid/low-probe-iso | 1 + + tests/expected/blkid/low-probe-iso-joliet | 1 + + tests/expected/blkid/low-probe-iso-rr-joliet | 1 + + tests/expected/blkid/low-probe-jbd | 1 + + tests/expected/blkid/low-probe-jfs | 1 + + tests/expected/blkid/low-probe-minix-BE | 1 + + tests/expected/blkid/low-probe-minix-LE | 1 + + tests/expected/blkid/low-probe-nilfs2 | 1 + + tests/expected/blkid/low-probe-ntfs | 1 + + tests/expected/blkid/low-probe-ocfs2 | 1 + + tests/expected/blkid/low-probe-reiser3 | 1 + + tests/expected/blkid/low-probe-reiser4 | 1 + + tests/expected/blkid/low-probe-romfs | 1 + + tests/expected/blkid/low-probe-small-fat32 | 1 + + tests/expected/blkid/low-probe-udf | 1 + + .../blkid/low-probe-udf-bdr-2.60-nero | 1 + + .../blkid/low-probe-udf-cd-mkudfiso-20100208 | 1 + + tests/expected/blkid/low-probe-udf-cd-nero-6 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.0.0-1 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.0.0-2 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.3-1 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.3-2 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.3-3 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.3-4 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.3-5 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.3-6 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.3-7 | 1 + + .../blkid/low-probe-udf-hdd-mkudffs-1.3-8 | 1 + + .../blkid/low-probe-udf-hdd-udfclient-0.7.5 | 1 + + .../blkid/low-probe-udf-hdd-udfclient-0.7.7 | 1 + + tests/expected/blkid/low-probe-udf-hdd-win7 | 1 + + tests/expected/blkid/low-probe-ufs | 1 + + tests/expected/blkid/low-probe-xfs | 1 + + tests/expected/blkid/low-probe-zfs | 1 + + 72 files changed, 186 insertions(+), 21 deletions(-) + +diff --git a/libblkid/src/superblocks/befs.c b/libblkid/src/superblocks/befs.c +index 14af97217..516d80093 100644 +--- a/libblkid/src/superblocks/befs.c ++++ b/libblkid/src/superblocks/befs.c +@@ -519,6 +519,9 @@ static int probe_befs(blkid_probe pr, const struct blkid_idmag *mag) + blkid_probe_sprintf_uuid(pr, (unsigned char *) &volume_id, + sizeof(volume_id), "%016" PRIx64, + FS64_TO_CPU(volume_id, fs_le)); ++ ++ blkid_probe_set_block_size(pr, block_size); ++ + return BLKID_PROBE_OK; + } + +diff --git a/libblkid/src/superblocks/btrfs.c b/libblkid/src/superblocks/btrfs.c +index 7ce3dfff8..f0fde700d 100644 +--- a/libblkid/src/superblocks/btrfs.c ++++ b/libblkid/src/superblocks/btrfs.c +@@ -74,6 +74,7 @@ static int probe_btrfs(blkid_probe pr, const struct blkid_idmag *mag) + + blkid_probe_set_uuid(pr, bfs->fsid); + blkid_probe_set_uuid_as(pr, bfs->dev_item.uuid, "UUID_SUB"); ++ blkid_probe_set_block_size(pr, le32_to_cpu(bfs->sectorsize)); + + return 0; + } +diff --git a/libblkid/src/superblocks/exfat.c b/libblkid/src/superblocks/exfat.c +index 4bf92eac8..7622320d3 100644 +--- a/libblkid/src/superblocks/exfat.c ++++ b/libblkid/src/superblocks/exfat.c +@@ -137,6 +137,8 @@ static int probe_exfat(blkid_probe pr, const struct blkid_idmag *mag) + blkid_probe_sprintf_version(pr, "%u.%u", + sb->version.vermaj, sb->version.vermin); + ++ blkid_probe_set_block_size(pr, BLOCK_SIZE(sb)); ++ + return BLKID_PROBE_OK; + } + +diff --git a/libblkid/src/superblocks/exfs.c b/libblkid/src/superblocks/exfs.c +index f717b6530..e0eafafc6 100644 +--- a/libblkid/src/superblocks/exfs.c ++++ b/libblkid/src/superblocks/exfs.c +@@ -170,7 +170,11 @@ static int probe_exfs(blkid_probe pr, const struct blkid_idmag *mag) + if (*xs->sb_fname != '\0') + blkid_probe_set_label(pr, (unsigned char *) xs->sb_fname, + sizeof(xs->sb_fname)); ++ + blkid_probe_set_uuid(pr, xs->sb_uuid); ++ ++ blkid_probe_set_block_size(pr, be32_to_cpu(xs->sb_blocksize)); ++ + return 0; + } + +diff --git a/libblkid/src/superblocks/ext.c b/libblkid/src/superblocks/ext.c +index caf82c171..3870522fa 100644 +--- a/libblkid/src/superblocks/ext.c ++++ b/libblkid/src/superblocks/ext.c +@@ -187,6 +187,9 @@ static void ext_get_info(blkid_probe pr, int ver, struct ext2_super_block *es) + blkid_probe_sprintf_version(pr, "%u.%u", + le32_to_cpu(es->s_rev_level), + le16_to_cpu(es->s_minor_rev_level)); ++ ++ if (le32_to_cpu(es->s_log_block_size) < 32) ++ blkid_probe_set_block_size(pr, 1024U << le32_to_cpu(es->s_log_block_size)); + } + + +diff --git a/libblkid/src/superblocks/f2fs.c b/libblkid/src/superblocks/f2fs.c +index d1bf25a3a..255ef6384 100644 +--- a/libblkid/src/superblocks/f2fs.c ++++ b/libblkid/src/superblocks/f2fs.c +@@ -78,6 +78,8 @@ static int probe_f2fs(blkid_probe pr, const struct blkid_idmag *mag) + + blkid_probe_set_uuid(pr, sb->uuid); + blkid_probe_sprintf_version(pr, "%u.%u", vermaj, vermin); ++ if (le32_to_cpu(sb->log_blocksize) < 32) ++ blkid_probe_set_block_size(pr, 1U << le32_to_cpu(sb->log_blocksize)); + return 0; + } + +diff --git a/libblkid/src/superblocks/gfs.c b/libblkid/src/superblocks/gfs.c +index ea6036cb7..e22a6a3f9 100644 +--- a/libblkid/src/superblocks/gfs.c ++++ b/libblkid/src/superblocks/gfs.c +@@ -98,6 +98,7 @@ static int probe_gfs2(blkid_probe pr, const struct blkid_idmag *mag) + sizeof(sbd->sb_locktable)); + blkid_probe_set_uuid(pr, sbd->sb_uuid); + blkid_probe_set_version(pr, "1"); ++ blkid_probe_set_block_size(pr, be32_to_cpu(sbd->sb_bsize)); + return 0; + } + return 1; +diff --git a/libblkid/src/superblocks/hfs.c b/libblkid/src/superblocks/hfs.c +index 7b0117405..185c42c92 100644 +--- a/libblkid/src/superblocks/hfs.c ++++ b/libblkid/src/superblocks/hfs.c +@@ -241,6 +241,8 @@ static int probe_hfsplus(blkid_probe pr, const struct blkid_idmag *mag) + if (blocksize < HFSPLUS_SECTOR_SIZE) + return 1; + ++ blkid_probe_set_block_size(pr, blocksize); ++ + memcpy(extents, hfsplus->cat_file.extents, sizeof(extents)); + cat_block = be32_to_cpu(extents[0].start_block); + +diff --git a/libblkid/src/superblocks/hpfs.c b/libblkid/src/superblocks/hpfs.c +index 0565d370c..dcf4520b6 100644 +--- a/libblkid/src/superblocks/hpfs.c ++++ b/libblkid/src/superblocks/hpfs.c +@@ -99,6 +99,7 @@ static int probe_hpfs(blkid_probe pr, const struct blkid_idmag *mag) + hbb->vol_serno[1], hbb->vol_serno[0]); + } + blkid_probe_sprintf_version(pr, "%u", version); ++ blkid_probe_set_block_size(pr, 512); + + return 0; + } +diff --git a/libblkid/src/superblocks/iso9660.c b/libblkid/src/superblocks/iso9660.c +index 7356754ee..8dc2e5394 100644 +--- a/libblkid/src/superblocks/iso9660.c ++++ b/libblkid/src/superblocks/iso9660.c +@@ -182,6 +182,8 @@ static int probe_iso9660(blkid_probe pr, const struct blkid_idmag *mag) + + memcpy(label, iso->volume_id, sizeof(label)); + ++ blkid_probe_set_block_size(pr, 2048); ++ + if (!is_str_empty(iso->system_id, sizeof(iso->system_id))) + blkid_probe_set_id_label(pr, "SYSTEM_ID", + iso->system_id, sizeof(iso->system_id)); +diff --git a/libblkid/src/superblocks/jfs.c b/libblkid/src/superblocks/jfs.c +index 0f956ef00..3de8c2e3d 100644 +--- a/libblkid/src/superblocks/jfs.c ++++ b/libblkid/src/superblocks/jfs.c +@@ -52,6 +52,7 @@ static int probe_jfs(blkid_probe pr, const struct blkid_idmag *mag) + if (*((char *) js->js_label) != '\0') + blkid_probe_set_label(pr, js->js_label, sizeof(js->js_label)); + blkid_probe_set_uuid(pr, js->js_uuid); ++ blkid_probe_set_block_size(pr, le32_to_cpu(js->js_bsize)); + return 0; + } + +diff --git a/libblkid/src/superblocks/minix.c b/libblkid/src/superblocks/minix.c +index c47378d73..674a1f17b 100644 +--- a/libblkid/src/superblocks/minix.c ++++ b/libblkid/src/superblocks/minix.c +@@ -80,6 +80,7 @@ static int probe_minix(blkid_probe pr, + unsigned long zones, ninodes, imaps, zmaps; + off_t firstz; + size_t zone_size; ++ unsigned block_size; + + data = blkid_probe_get_buffer(pr, 1024, + max(sizeof(struct minix_super_block), +@@ -103,6 +104,7 @@ static int probe_minix(blkid_probe pr, + zmaps = minix_swab16(swabme, sb->s_zmap_blocks); + firstz = minix_swab16(swabme, sb->s_firstdatazone); + zone_size = sb->s_log_zone_size; ++ block_size = 1024; + break; + } + case 3: { +@@ -114,6 +116,8 @@ static int probe_minix(blkid_probe pr, + zmaps = minix_swab16(swabme, sb->s_zmap_blocks); + firstz = minix_swab16(swabme, sb->s_firstdatazone); + zone_size = sb->s_log_zone_size; ++ block_size = minix_swab16(swabme, sb->s_blocksize); ++ + break; + } + default: +@@ -143,6 +147,7 @@ static int probe_minix(blkid_probe pr, + return 1; + + blkid_probe_sprintf_version(pr, "%d", version); ++ blkid_probe_set_block_size(pr, block_size); + return 0; + } + +diff --git a/libblkid/src/superblocks/nilfs.c b/libblkid/src/superblocks/nilfs.c +index 95538ef7b..423bd1ac4 100644 +--- a/libblkid/src/superblocks/nilfs.c ++++ b/libblkid/src/superblocks/nilfs.c +@@ -157,6 +157,9 @@ static int probe_nilfs2(blkid_probe pr, + (unsigned char *) &sb->s_magic)) + return 1; + ++ if (le32_to_cpu(sb->s_log_block_size) < 32) ++ blkid_probe_set_block_size(pr, 1024U << le32_to_cpu(sb->s_log_block_size)); ++ + return 0; + } + +diff --git a/libblkid/src/superblocks/ntfs.c b/libblkid/src/superblocks/ntfs.c +index 32973095b..5bfebbb78 100644 +--- a/libblkid/src/superblocks/ntfs.c ++++ b/libblkid/src/superblocks/ntfs.c +@@ -206,6 +206,8 @@ static int probe_ntfs(blkid_probe pr, const struct blkid_idmag *mag) + attr_off += attr_len; + } + ++ blkid_probe_set_block_size(pr, sector_size); ++ + blkid_probe_sprintf_uuid(pr, + (unsigned char *) &ns->volume_serial, + sizeof(ns->volume_serial), +diff --git a/libblkid/src/superblocks/ocfs.c b/libblkid/src/superblocks/ocfs.c +index 3fe199d3f..463ed7bcf 100644 +--- a/libblkid/src/superblocks/ocfs.c ++++ b/libblkid/src/superblocks/ocfs.c +@@ -153,6 +153,9 @@ static int probe_ocfs2(blkid_probe pr, const struct blkid_idmag *mag) + le16_to_cpu(osb->s_major_rev_level), + le16_to_cpu(osb->s_minor_rev_level)); + ++ if (le32_to_cpu(osb->s_blocksize_bits) < 32) ++ blkid_probe_set_block_size(pr, 1U << le32_to_cpu(osb->s_blocksize_bits)); ++ + return 0; + } + +diff --git a/libblkid/src/superblocks/reiserfs.c b/libblkid/src/superblocks/reiserfs.c +index edbaaa946..6c5e5b0d7 100644 +--- a/libblkid/src/superblocks/reiserfs.c ++++ b/libblkid/src/superblocks/reiserfs.c +@@ -32,7 +32,8 @@ struct reiserfs_super_block { + + struct reiser4_super_block { + unsigned char rs4_magic[16]; +- uint16_t rs4_dummy[2]; ++ uint8_t rs4_dummy[3]; ++ uint8_t rs4_blocksize; + unsigned char rs4_uuid[16]; + unsigned char rs4_label[16]; + uint64_t rs4_dummy2; +@@ -73,22 +74,29 @@ static int probe_reiser(blkid_probe pr, const struct blkid_idmag *mag) + else + blkid_probe_set_version(pr, "3.5"); + ++ blkid_probe_set_block_size(pr, blocksize); ++ + return 0; + } + + static int probe_reiser4(blkid_probe pr, const struct blkid_idmag *mag) + { + struct reiser4_super_block *rs4; ++ unsigned int blocksize; + + rs4 = blkid_probe_get_sb(pr, mag, struct reiser4_super_block); + if (!rs4) + return errno ? -errno : 1; + ++ blocksize = rs4->rs4_blocksize * 256; ++ + if (*rs4->rs4_label) + blkid_probe_set_label(pr, rs4->rs4_label, sizeof(rs4->rs4_label)); + blkid_probe_set_uuid(pr, rs4->rs4_uuid); + blkid_probe_set_version(pr, "4"); + ++ blkid_probe_set_block_size(pr, blocksize); ++ + return 0; + } + +diff --git a/libblkid/src/superblocks/romfs.c b/libblkid/src/superblocks/romfs.c +index f3e9f8b05..1c2ac4315 100644 +--- a/libblkid/src/superblocks/romfs.c ++++ b/libblkid/src/superblocks/romfs.c +@@ -34,6 +34,9 @@ static int probe_romfs(blkid_probe pr, const struct blkid_idmag *mag) + if (*((char *) ros->ros_volume) != '\0') + blkid_probe_set_label(pr, ros->ros_volume, + sizeof(ros->ros_volume)); ++ ++ blkid_probe_set_block_size(pr, 1024); ++ + return 0; + } + +diff --git a/libblkid/src/superblocks/squashfs.c b/libblkid/src/superblocks/squashfs.c +index 7364beca2..4db842493 100644 +--- a/libblkid/src/superblocks/squashfs.c ++++ b/libblkid/src/superblocks/squashfs.c +@@ -71,6 +71,8 @@ static int probe_squashfs3(blkid_probe pr, const struct blkid_idmag *mag) + + blkid_probe_sprintf_version(pr, "%u.%u", vermaj, vermin); + ++ blkid_probe_set_block_size(pr, 1024); ++ + return 0; + } + +diff --git a/libblkid/src/superblocks/superblocks.c b/libblkid/src/superblocks/superblocks.c +index 6dfd2be64..a86a055fe 100644 +--- a/libblkid/src/superblocks/superblocks.c ++++ b/libblkid/src/superblocks/superblocks.c +@@ -74,6 +74,8 @@ + * @APPLICATION_ID: ISO9660 application identifier + * + * @BOOT_SYSTEM_ID: ISO9660 boot system identifier ++ * ++ * @BLOCK_SIZE: block size + */ + + static int superblocks_probe(blkid_probe pr, struct blkid_chain *chn); +@@ -550,6 +552,11 @@ int blkid_probe_sprintf_version(blkid_probe pr, const char *fmt, ...) + return rc; + } + ++int blkid_probe_set_block_size(blkid_probe pr, unsigned block_size) ++{ ++ return blkid_probe_sprintf_value(pr, "BLOCK_SIZE", "%u", block_size); ++} ++ + static int blkid_probe_set_usage(blkid_probe pr, int usage) + { + struct blkid_chain *chn = blkid_probe_get_chain(pr); +diff --git a/libblkid/src/superblocks/superblocks.h b/libblkid/src/superblocks/superblocks.h +index d677f85bc..d09046cfd 100644 +--- a/libblkid/src/superblocks/superblocks.h ++++ b/libblkid/src/superblocks/superblocks.h +@@ -106,6 +106,8 @@ extern int blkid_probe_set_id_label(blkid_probe pr, const char *name, + extern int blkid_probe_set_utf8_id_label(blkid_probe pr, const char *name, + unsigned char *data, size_t len, int enc); + ++int blkid_probe_set_block_size(blkid_probe pr, unsigned block_size); ++ + extern int blkid_probe_is_bitlocker(blkid_probe pr); + + #endif /* _BLKID_SUPERBLOCKS_H */ +diff --git a/libblkid/src/superblocks/udf.c b/libblkid/src/superblocks/udf.c +index 97e79dab0..1ab8a1e26 100644 +--- a/libblkid/src/superblocks/udf.c ++++ b/libblkid/src/superblocks/udf.c +@@ -464,6 +464,8 @@ real_blksz: + * E.g. number 0x0150 is revision 1.50, number 0x0201 is revision 2.01. */ + blkid_probe_sprintf_version(pr, "%x.%02x", (unsigned int)(udf_rev >> 8), (unsigned int)(udf_rev & 0xFF)); + ++ blkid_probe_set_block_size(pr, bs); ++ + return 0; + } + +diff --git a/libblkid/src/superblocks/ufs.c b/libblkid/src/superblocks/ufs.c +index 6ef2acddc..7a8396c1c 100644 +--- a/libblkid/src/superblocks/ufs.c ++++ b/libblkid/src/superblocks/ufs.c +@@ -233,6 +233,11 @@ found: + (unsigned char *) &ufs->fs_magic)) + return 1; + ++ if (!is_be) ++ blkid_probe_set_block_size(pr, le32_to_cpu(ufs->fs_fsize)); ++ else ++ blkid_probe_set_block_size(pr, be32_to_cpu(ufs->fs_fsize)); ++ + return 0; + } + +diff --git a/libblkid/src/superblocks/vfat.c b/libblkid/src/superblocks/vfat.c +index 29b3c501c..4e93a0e41 100644 +--- a/libblkid/src/superblocks/vfat.c ++++ b/libblkid/src/superblocks/vfat.c +@@ -436,6 +436,8 @@ static int probe_vfat(blkid_probe pr, const struct blkid_idmag *mag) + if (version) + blkid_probe_set_version(pr, version); + ++ blkid_probe_set_block_size(pr, sector_size); ++ + return 0; + } + +diff --git a/libblkid/src/superblocks/vxfs.c b/libblkid/src/superblocks/vxfs.c +index 19d284cbf..d9d26adcf 100644 +--- a/libblkid/src/superblocks/vxfs.c ++++ b/libblkid/src/superblocks/vxfs.c +@@ -12,6 +12,15 @@ + struct vxfs_super_block { + uint32_t vs_magic; + int32_t vs_version; ++ uint32_t vs_ctime; ++ uint32_t vs_cutime; ++ uint32_t __unused1; ++ uint32_t __unused2; ++ uint32_t vs_old_logstart; ++ uint32_t vs_old_logend; ++ uint32_t vs_bsize; ++ uint32_t vs_size; ++ uint32_t vs_dsize; + }; + + static int probe_vxfs(blkid_probe pr, const struct blkid_idmag *mag) +@@ -22,7 +31,13 @@ static int probe_vxfs(blkid_probe pr, const struct blkid_idmag *mag) + if (!vxs) + return errno ? -errno : 1; + +- blkid_probe_sprintf_version(pr, "%u", (unsigned int) vxs->vs_version); ++ if (le32_to_cpu(vxs->vs_magic) == 0xa501fcf5) { ++ blkid_probe_sprintf_version(pr, "%u", (unsigned int)le32_to_cpu(vxs->vs_version)); ++ blkid_probe_set_block_size(pr, le32_to_cpu(vxs->vs_bsize)); ++ } else if (be32_to_cpu(vxs->vs_magic) == 0xa501fcf5) { ++ blkid_probe_sprintf_version(pr, "%u", (unsigned int)be32_to_cpu(vxs->vs_version)); ++ blkid_probe_set_block_size(pr, be32_to_cpu(vxs->vs_bsize)); ++ } + return 0; + } + +@@ -35,6 +50,7 @@ const struct blkid_idinfo vxfs_idinfo = + .magics = + { + { .magic = "\365\374\001\245", .len = 4, .kboff = 1 }, ++ { .magic = "\245\001\374\365", .len = 4, .kboff = 8 }, + { NULL } + } + }; +diff --git a/libblkid/src/superblocks/xfs.c b/libblkid/src/superblocks/xfs.c +index 99848f900..eb513ac3e 100644 +--- a/libblkid/src/superblocks/xfs.c ++++ b/libblkid/src/superblocks/xfs.c +@@ -173,6 +173,7 @@ static int probe_xfs(blkid_probe pr, const struct blkid_idmag *mag) + blkid_probe_set_label(pr, (unsigned char *) xs->sb_fname, + sizeof(xs->sb_fname)); + blkid_probe_set_uuid(pr, xs->sb_uuid); ++ blkid_probe_set_block_size(pr, xs->sb_sectsize * 256); + return 0; + } + +diff --git a/libblkid/src/superblocks/zfs.c b/libblkid/src/superblocks/zfs.c +index ec3e1c5bf..cc779c02a 100644 +--- a/libblkid/src/superblocks/zfs.c ++++ b/libblkid/src/superblocks/zfs.c +@@ -37,6 +37,7 @@ struct zfs_uberblock { + + #define DATA_TYPE_UINT64 8 + #define DATA_TYPE_STRING 9 ++#define DATA_TYPE_DIRECTORY 19 + + struct nvpair { + uint32_t nvp_size; +@@ -60,32 +61,37 @@ struct nvuint64 { + uint64_t nvu_value; + }; + ++struct nvdirectory { ++ uint32_t nvd_type; ++ uint32_t nvd_unknown[3]; ++}; ++ + struct nvlist { + uint32_t nvl_unknown[3]; + struct nvpair nvl_nvpair; + }; + +-static int zfs_process_value(blkid_probe pr, char *name, size_t namelen, +- void *value, size_t max_value_size) ++static void zfs_process_value(blkid_probe pr, char *name, size_t namelen, ++ void *value, size_t max_value_size, unsigned directory_level) + { + if (strncmp(name, "name", namelen) == 0 && +- sizeof(struct nvstring) <= max_value_size) { ++ sizeof(struct nvstring) <= max_value_size && ++ !directory_level) { + struct nvstring *nvs = value; + uint32_t nvs_type = be32_to_cpu(nvs->nvs_type); + uint32_t nvs_strlen = be32_to_cpu(nvs->nvs_strlen); + + if (nvs_type != DATA_TYPE_STRING || + (uint64_t)nvs_strlen + sizeof(*nvs) > max_value_size) +- return 0; ++ return; + + DBG(LOWPROBE, ul_debug("nvstring: type %u string %*s\n", + nvs_type, nvs_strlen, nvs->nvs_string)); + + blkid_probe_set_label(pr, nvs->nvs_string, nvs_strlen); +- +- return 1; + } else if (strncmp(name, "guid", namelen) == 0 && +- sizeof(struct nvuint64) <= max_value_size) { ++ sizeof(struct nvuint64) <= max_value_size && ++ !directory_level) { + struct nvuint64 *nvu = value; + uint32_t nvu_type = be32_to_cpu(nvu->nvu_type); + uint64_t nvu_value; +@@ -94,17 +100,16 @@ static int zfs_process_value(blkid_probe pr, char *name, size_t namelen, + nvu_value = be64_to_cpu(nvu_value); + + if (nvu_type != DATA_TYPE_UINT64) +- return 0; ++ return; + + DBG(LOWPROBE, ul_debug("nvuint64: type %u value %"PRIu64"\n", + nvu_type, nvu_value)); + + blkid_probe_sprintf_value(pr, "UUID_SUB", + "%"PRIu64, nvu_value); +- +- return 1; + } else if (strncmp(name, "pool_guid", namelen) == 0 && +- sizeof(struct nvuint64) <= max_value_size) { ++ sizeof(struct nvuint64) <= max_value_size && ++ !directory_level) { + struct nvuint64 *nvu = value; + uint32_t nvu_type = be32_to_cpu(nvu->nvu_type); + uint64_t nvu_value; +@@ -113,7 +118,7 @@ static int zfs_process_value(blkid_probe pr, char *name, size_t namelen, + nvu_value = be64_to_cpu(nvu_value); + + if (nvu_type != DATA_TYPE_UINT64) +- return 0; ++ return; + + DBG(LOWPROBE, ul_debug("nvuint64: type %u value %"PRIu64"\n", + nvu_type, nvu_value)); +@@ -121,10 +126,21 @@ static int zfs_process_value(blkid_probe pr, char *name, size_t namelen, + blkid_probe_sprintf_uuid(pr, (unsigned char *) &nvu_value, + sizeof(nvu_value), + "%"PRIu64, nvu_value); +- return 1; +- } ++ } else if (strncmp(name, "ashift", namelen) == 0 && ++ sizeof(struct nvuint64) <= max_value_size) { ++ struct nvuint64 *nvu = value; ++ uint32_t nvu_type = be32_to_cpu(nvu->nvu_type); ++ uint64_t nvu_value; + +- return 0; ++ memcpy(&nvu_value, &nvu->nvu_value, sizeof(nvu_value)); ++ nvu_value = be64_to_cpu(nvu_value); ++ ++ if (nvu_type != DATA_TYPE_UINT64) ++ return; ++ ++ if (nvu_value < 32) ++ blkid_probe_set_block_size(pr, 1U << nvu_value); ++ } + } + + static void zfs_extract_guid_name(blkid_probe pr, loff_t offset) +@@ -133,7 +149,7 @@ static void zfs_extract_guid_name(blkid_probe pr, loff_t offset) + struct nvlist *nvl; + struct nvpair *nvp; + size_t left = 4096; +- int found = 0; ++ unsigned directory_level = 0; + + offset = (offset & ~(VDEV_LABEL_SIZE - 1)) + VDEV_LABEL_NVPAIR; + +@@ -152,13 +168,21 @@ static void zfs_extract_guid_name(blkid_probe pr, loff_t offset) + nvp = &nvl->nvl_nvpair; + left -= (unsigned char *)nvp - p; /* Already used up 12 bytes */ + +- while (left > sizeof(*nvp) && nvp->nvp_size != 0 && found < 3) { ++ while (left > sizeof(*nvp)) { + uint32_t nvp_size = be32_to_cpu(nvp->nvp_size); + uint32_t nvp_namelen = be32_to_cpu(nvp->nvp_namelen); + uint64_t namesize = ((uint64_t)nvp_namelen + 3) & ~3; + size_t max_value_size; + void *value; + ++ if (!nvp->nvp_size) { ++ if (!directory_level) ++ break; ++ directory_level--; ++ nvp_size = 8; ++ goto cont; ++ } ++ + DBG(LOWPROBE, ul_debug("left %zd nvp_size %u\n", + left, nvp_size)); + +@@ -174,9 +198,21 @@ static void zfs_extract_guid_name(blkid_probe pr, loff_t offset) + max_value_size = nvp_size - (namesize + sizeof(*nvp)); + value = nvp->nvp_name + namesize; + +- found += zfs_process_value(pr, nvp->nvp_name, nvp_namelen, +- value, max_value_size); ++ if (sizeof(struct nvdirectory) <= max_value_size) { ++ struct nvdirectory *nvu = value; ++ if (be32_to_cpu(nvu->nvd_type) == DATA_TYPE_DIRECTORY) { ++ nvp_size = sizeof(*nvp) + namesize + sizeof(*nvu); ++ directory_level++; ++ goto cont; ++ } ++ } ++ ++ zfs_process_value(pr, nvp->nvp_name, nvp_namelen, ++ value, max_value_size, directory_level); + ++cont: ++ if (nvp_size > left) ++ break; + left -= nvp_size; + + nvp = (struct nvpair *)((char *)nvp + nvp_size); +diff --git a/tests/expected/blkid/low-probe-befs b/tests/expected/blkid/low-probe-befs +index b7f25cdd2..5717049d2 100644 +--- a/tests/expected/blkid/low-probe-befs ++++ b/tests/expected/blkid/low-probe-befs +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=1024 + ID_FS_LABEL=befs_test + ID_FS_LABEL_ENC=befs_test + ID_FS_TYPE=befs +diff --git a/tests/expected/blkid/low-probe-exfat b/tests/expected/blkid/low-probe-exfat +index b9defbdf9..59cb35225 100644 +--- a/tests/expected/blkid/low-probe-exfat ++++ b/tests/expected/blkid/low-probe-exfat +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=Новый_том + ID_FS_LABEL_ENC=Новый\x20том + ID_FS_TYPE=exfat +diff --git a/tests/expected/blkid/low-probe-ext2 b/tests/expected/blkid/low-probe-ext2 +index c70b85698..087da97a4 100644 +--- a/tests/expected/blkid/low-probe-ext2 ++++ b/tests/expected/blkid/low-probe-ext2 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=1024 + ID_FS_LABEL=test-ext2 + ID_FS_LABEL_ENC=test-ext2 + ID_FS_TYPE=ext2 +diff --git a/tests/expected/blkid/low-probe-ext3 b/tests/expected/blkid/low-probe-ext3 +index 4bac43f57..8684884c1 100644 +--- a/tests/expected/blkid/low-probe-ext3 ++++ b/tests/expected/blkid/low-probe-ext3 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=1024 + ID_FS_LABEL=test-ext3 + ID_FS_LABEL_ENC=test-ext3 + ID_FS_SEC_TYPE=ext2 +diff --git a/tests/expected/blkid/low-probe-f2fs b/tests/expected/blkid/low-probe-f2fs +index ee328640e..272905125 100644 +--- a/tests/expected/blkid/low-probe-f2fs ++++ b/tests/expected/blkid/low-probe-f2fs +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=4096 + ID_FS_LABEL=test-f2fs + ID_FS_LABEL_ENC=test-f2fs + ID_FS_TYPE=f2fs +diff --git a/tests/expected/blkid/low-probe-fat b/tests/expected/blkid/low-probe-fat +index 420121117..75f99434d 100644 +--- a/tests/expected/blkid/low-probe-fat ++++ b/tests/expected/blkid/low-probe-fat +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=TEST-FAT + ID_FS_LABEL_ENC=TEST-FAT + ID_FS_SEC_TYPE=msdos +diff --git a/tests/expected/blkid/low-probe-fat16_noheads b/tests/expected/blkid/low-probe-fat16_noheads +index ba47078d2..ff9ef2e69 100644 +--- a/tests/expected/blkid/low-probe-fat16_noheads ++++ b/tests/expected/blkid/low-probe-fat16_noheads +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=VTech_1070 + ID_FS_LABEL_ENC=VTech\x201070 + ID_FS_SEC_TYPE=msdos +diff --git a/tests/expected/blkid/low-probe-fat32_cp850_O_tilde b/tests/expected/blkid/low-probe-fat32_cp850_O_tilde +index 096bcbf2c..9ce58e3d9 100644 +--- a/tests/expected/blkid/low-probe-fat32_cp850_O_tilde ++++ b/tests/expected/blkid/low-probe-fat32_cp850_O_tilde +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=___ + ID_FS_LABEL_ENC=\xe5\xe5\xe5 + ID_FS_TYPE=vfat +diff --git a/tests/expected/blkid/low-probe-fat32_label_64MB b/tests/expected/blkid/low-probe-fat32_label_64MB +index 1179490cf..4a99f8ff6 100644 +--- a/tests/expected/blkid/low-probe-fat32_label_64MB ++++ b/tests/expected/blkid/low-probe-fat32_label_64MB +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=BINGO + ID_FS_LABEL_ENC=BINGO + ID_FS_TYPE=vfat +diff --git a/tests/expected/blkid/low-probe-gfs2 b/tests/expected/blkid/low-probe-gfs2 +index cd5a664b4..f04529bc0 100644 +--- a/tests/expected/blkid/low-probe-gfs2 ++++ b/tests/expected/blkid/low-probe-gfs2 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=4096 + ID_FS_LABEL=mycluster:mygfs2 + ID_FS_LABEL_ENC=mycluster:mygfs2 + ID_FS_TYPE=gfs2 +diff --git a/tests/expected/blkid/low-probe-hfsplus b/tests/expected/blkid/low-probe-hfsplus +index f54b59f11..cc351a042 100644 +--- a/tests/expected/blkid/low-probe-hfsplus ++++ b/tests/expected/blkid/low-probe-hfsplus +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=4096 + ID_FS_LABEL=123456789ABCDE + ID_FS_LABEL_ENC=123456789ABCDE + ID_FS_TYPE=hfsplus +diff --git a/tests/expected/blkid/low-probe-hpfs b/tests/expected/blkid/low-probe-hpfs +index 47ae1af28..7e4a12b97 100644 +--- a/tests/expected/blkid/low-probe-hpfs ++++ b/tests/expected/blkid/low-probe-hpfs +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=P01_S16A + ID_FS_LABEL_ENC=P01\x20S16A + ID_FS_TYPE=hpfs +diff --git a/tests/expected/blkid/low-probe-iso b/tests/expected/blkid/low-probe-iso +index af9908aaa..082f0742a 100644 +--- a/tests/expected/blkid/low-probe-iso ++++ b/tests/expected/blkid/low-probe-iso +@@ -1,4 +1,5 @@ + ID_FS_APPLICATION_ID=GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) 1997-2006 J.PEARSON/J.SCHILLING (C) 2006-2007 CDRKIT TEAM ++ID_FS_BLOCK_SIZE=2048 + ID_FS_LABEL=IsoVolumeName + ID_FS_LABEL_ENC=IsoVolumeName + ID_FS_SYSTEM_ID=LINUX +diff --git a/tests/expected/blkid/low-probe-iso-joliet b/tests/expected/blkid/low-probe-iso-joliet +index 0229a0d2c..06f529d03 100644 +--- a/tests/expected/blkid/low-probe-iso-joliet ++++ b/tests/expected/blkid/low-probe-iso-joliet +@@ -1,4 +1,5 @@ + ID_FS_APPLICATION_ID=GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) 1997-2006 J.PEARSON/J.SCHILLING (C) 2006-2007 CDRKIT TEAM ++ID_FS_BLOCK_SIZE=2048 + ID_FS_LABEL=ThisWonderfulLabelIsVeryVeryLong + ID_FS_LABEL_ENC=ThisWonderfulLabelIsVeryVeryLong + ID_FS_SYSTEM_ID=LINUX +diff --git a/tests/expected/blkid/low-probe-iso-rr-joliet b/tests/expected/blkid/low-probe-iso-rr-joliet +index 14d550e90..bb3274db3 100644 +--- a/tests/expected/blkid/low-probe-iso-rr-joliet ++++ b/tests/expected/blkid/low-probe-iso-rr-joliet +@@ -1,4 +1,5 @@ + ID_FS_APPLICATION_ID=GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) 1997-2006 J.PEARSON/J.SCHILLING (C) 2006-2007 CDRKIT TEAM ++ID_FS_BLOCK_SIZE=2048 + ID_FS_LABEL=ThisIsVolumeName + ID_FS_LABEL_ENC=ThisIsVolumeName + ID_FS_SYSTEM_ID=LINUX +diff --git a/tests/expected/blkid/low-probe-jbd b/tests/expected/blkid/low-probe-jbd +index 8dbcdbce0..c9f9f6b79 100644 +--- a/tests/expected/blkid/low-probe-jbd ++++ b/tests/expected/blkid/low-probe-jbd +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=1024 + ID_FS_LOGUUID=0d7a07df-7b06-4829-bce7-3b9c3ece570c + ID_FS_TYPE=jbd + ID_FS_USAGE=other +diff --git a/tests/expected/blkid/low-probe-jfs b/tests/expected/blkid/low-probe-jfs +index 877fd168e..ac7d31bac 100644 +--- a/tests/expected/blkid/low-probe-jfs ++++ b/tests/expected/blkid/low-probe-jfs +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=4096 + ID_FS_LABEL=test-jfs + ID_FS_LABEL_ENC=test-jfs + ID_FS_TYPE=jfs +diff --git a/tests/expected/blkid/low-probe-minix-BE b/tests/expected/blkid/low-probe-minix-BE +index 9627799a3..f73f1b5db 100644 +--- a/tests/expected/blkid/low-probe-minix-BE ++++ b/tests/expected/blkid/low-probe-minix-BE +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=1024 + ID_FS_TYPE=minix + ID_FS_USAGE=filesystem + ID_FS_VERSION=1 +diff --git a/tests/expected/blkid/low-probe-minix-LE b/tests/expected/blkid/low-probe-minix-LE +index 9627799a3..f73f1b5db 100644 +--- a/tests/expected/blkid/low-probe-minix-LE ++++ b/tests/expected/blkid/low-probe-minix-LE +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=1024 + ID_FS_TYPE=minix + ID_FS_USAGE=filesystem + ID_FS_VERSION=1 +diff --git a/tests/expected/blkid/low-probe-nilfs2 b/tests/expected/blkid/low-probe-nilfs2 +index c6c9cab17..ff27e0b23 100644 +--- a/tests/expected/blkid/low-probe-nilfs2 ++++ b/tests/expected/blkid/low-probe-nilfs2 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=4096 + ID_FS_LABEL=test-nilfs2 + ID_FS_LABEL_ENC=test-nilfs2 + ID_FS_TYPE=nilfs2 +diff --git a/tests/expected/blkid/low-probe-ntfs b/tests/expected/blkid/low-probe-ntfs +index aaaa077da..790157aaa 100644 +--- a/tests/expected/blkid/low-probe-ntfs ++++ b/tests/expected/blkid/low-probe-ntfs +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=Новый_том + ID_FS_LABEL_ENC=Новый\x20том + ID_FS_TYPE=ntfs +diff --git a/tests/expected/blkid/low-probe-ocfs2 b/tests/expected/blkid/low-probe-ocfs2 +index 2328d21a0..9b84dbe67 100644 +--- a/tests/expected/blkid/low-probe-ocfs2 ++++ b/tests/expected/blkid/low-probe-ocfs2 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=1024 + ID_FS_LABEL=test-ocfs2 + ID_FS_LABEL_ENC=test-ocfs2 + ID_FS_TYPE=ocfs2 +diff --git a/tests/expected/blkid/low-probe-reiser3 b/tests/expected/blkid/low-probe-reiser3 +index d376ecae1..1c4b1478d 100644 +--- a/tests/expected/blkid/low-probe-reiser3 ++++ b/tests/expected/blkid/low-probe-reiser3 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=4096 + ID_FS_LABEL=TESTREISER + ID_FS_LABEL_ENC=TESTREISER + ID_FS_TYPE=reiserfs +diff --git a/tests/expected/blkid/low-probe-reiser4 b/tests/expected/blkid/low-probe-reiser4 +index 65d63aa65..66df064fd 100644 +--- a/tests/expected/blkid/low-probe-reiser4 ++++ b/tests/expected/blkid/low-probe-reiser4 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=4096 + ID_FS_LABEL=TESTR4 + ID_FS_LABEL_ENC=TESTR4 + ID_FS_TYPE=reiser4 +diff --git a/tests/expected/blkid/low-probe-romfs b/tests/expected/blkid/low-probe-romfs +index 2eb982bc1..b56a6b881 100644 +--- a/tests/expected/blkid/low-probe-romfs ++++ b/tests/expected/blkid/low-probe-romfs +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=1024 + ID_FS_LABEL=test-romfs + ID_FS_LABEL_ENC=test-romfs + ID_FS_TYPE=romfs +diff --git a/tests/expected/blkid/low-probe-small-fat32 b/tests/expected/blkid/low-probe-small-fat32 +index 39239e6b3..5dba03ec3 100644 +--- a/tests/expected/blkid/low-probe-small-fat32 ++++ b/tests/expected/blkid/low-probe-small-fat32 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=TESTVFAT + ID_FS_LABEL_ENC=TESTVFAT + ID_FS_TYPE=vfat +diff --git a/tests/expected/blkid/low-probe-udf b/tests/expected/blkid/low-probe-udf +index 902fb82f0..869a335db 100644 +--- a/tests/expected/blkid/low-probe-udf ++++ b/tests/expected/blkid/low-probe-udf +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=2048 + ID_FS_LABEL=test-udf + ID_FS_LABEL_ENC=test-udf + ID_FS_LOGICAL_VOLUME_ID=test-udf +diff --git a/tests/expected/blkid/low-probe-udf-bdr-2.60-nero b/tests/expected/blkid/low-probe-udf-bdr-2.60-nero +index c0b8867b5..fcf29b112 100644 +--- a/tests/expected/blkid/low-probe-udf-bdr-2.60-nero ++++ b/tests/expected/blkid/low-probe-udf-bdr-2.60-nero +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=2048 + ID_FS_LABEL=Label + ID_FS_LABEL_ENC=Label + ID_FS_LOGICAL_VOLUME_ID=Label +diff --git a/tests/expected/blkid/low-probe-udf-cd-mkudfiso-20100208 b/tests/expected/blkid/low-probe-udf-cd-mkudfiso-20100208 +index f57dee08b..768d0d2f0 100644 +--- a/tests/expected/blkid/low-probe-udf-cd-mkudfiso-20100208 ++++ b/tests/expected/blkid/low-probe-udf-cd-mkudfiso-20100208 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=2048 + ID_FS_LABEL=Volume_Label + ID_FS_LABEL_ENC=Volume\x20Label + ID_FS_LOGICAL_VOLUME_ID=Volume Label +diff --git a/tests/expected/blkid/low-probe-udf-cd-nero-6 b/tests/expected/blkid/low-probe-udf-cd-nero-6 +index cf85ea9c5..41f9ff509 100644 +--- a/tests/expected/blkid/low-probe-udf-cd-nero-6 ++++ b/tests/expected/blkid/low-probe-udf-cd-nero-6 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=2048 + ID_FS_LABEL=UDF_Label + ID_FS_LABEL_ENC=UDF\x20Label + ID_FS_LOGICAL_VOLUME_ID=UDF Label +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.0.0-1 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.0.0-1 +index 5446aec42..e26b2da0c 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.0.0-1 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.0.0-1 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=LinuxUDF + ID_FS_LABEL_ENC=LinuxUDF + ID_FS_LOGICAL_VOLUME_ID=LinuxUDF +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.0.0-2 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.0.0-2 +index b72fcac72..112768353 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.0.0-2 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.0.0-2 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=Label + ID_FS_LABEL_ENC=Label + ID_FS_LOGICAL_VOLUME_ID=Label +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-1 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-1 +index 20f148549..db9127d34 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-1 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-1 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=Label + ID_FS_LABEL_ENC=Label + ID_FS_LOGICAL_VOLUME_ID=Label +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-2 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-2 +index 34a2f49e3..f472284f3 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-2 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-2 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=2048 + ID_FS_LABEL=Label + ID_FS_LABEL_ENC=Label + ID_FS_LOGICAL_VOLUME_ID=Label +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-3 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-3 +index 3fef2b3c6..6f4802ca0 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-3 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-3 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=2048 + ID_FS_LABEL=ÿ + ID_FS_LABEL_ENC=ÿ + ID_FS_LOGICAL_VOLUME_ID=ÿ +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-4 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-4 +index 28cd73603..0ae5b910e 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-4 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-4 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=1024 + ID_FS_LABEL=Label + ID_FS_LABEL_ENC=Label + ID_FS_LOGICAL_VOLUME_ID=Label +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-5 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-5 +index d84ae8964..1b98c21ed 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-5 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-5 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=4096 + ID_FS_LABEL=Label + ID_FS_LABEL_ENC=Label + ID_FS_LOGICAL_VOLUME_ID=Label +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-6 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-6 +index d73914970..c22c96b0a 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-6 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-6 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ID_FS_LABEL_ENC=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ID_FS_LOGICAL_VOLUME_ID=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-7 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-7 +index a78606eea..c3b9d8a8a 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-7 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-7 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=4096 + ID_FS_LABEL=Label4096 + ID_FS_LABEL_ENC=Label4096 + ID_FS_LOGICAL_VOLUME_ID=Label4096 +diff --git a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-8 b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-8 +index 448c8f90b..58c131f7d 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-8 ++++ b/tests/expected/blkid/low-probe-udf-hdd-mkudffs-1.3-8 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=LinuxUDF + ID_FS_LABEL_ENC=LinuxUDF + ID_FS_LOGICAL_VOLUME_ID=LinuxUDF +diff --git a/tests/expected/blkid/low-probe-udf-hdd-udfclient-0.7.5 b/tests/expected/blkid/low-probe-udf-hdd-udfclient-0.7.5 +index b33c814d6..18930cead 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-udfclient-0.7.5 ++++ b/tests/expected/blkid/low-probe-udf-hdd-udfclient-0.7.5 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=discname + ID_FS_LABEL_ENC=discname + ID_FS_LOGICAL_VOLUME_ID=discname +diff --git a/tests/expected/blkid/low-probe-udf-hdd-udfclient-0.7.7 b/tests/expected/blkid/low-probe-udf-hdd-udfclient-0.7.7 +index a47bd3f12..13e984167 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-udfclient-0.7.7 ++++ b/tests/expected/blkid/low-probe-udf-hdd-udfclient-0.7.7 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=discname + ID_FS_LABEL_ENC=discname + ID_FS_LOGICAL_VOLUME_ID=discname +diff --git a/tests/expected/blkid/low-probe-udf-hdd-win7 b/tests/expected/blkid/low-probe-udf-hdd-win7 +index 759c8db3d..e68f180e5 100644 +--- a/tests/expected/blkid/low-probe-udf-hdd-win7 ++++ b/tests/expected/blkid/low-probe-udf-hdd-win7 +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=My_volume_label + ID_FS_LABEL_ENC=My\x20volume\x20label + ID_FS_LOGICAL_VOLUME_ID=My volume label +diff --git a/tests/expected/blkid/low-probe-ufs b/tests/expected/blkid/low-probe-ufs +index 96828d73e..256f065d2 100644 +--- a/tests/expected/blkid/low-probe-ufs ++++ b/tests/expected/blkid/low-probe-ufs +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=2048 + ID_FS_TYPE=ufs + ID_FS_USAGE=filesystem + ID_FS_UUID=4b0e640aec56ac70 +diff --git a/tests/expected/blkid/low-probe-xfs b/tests/expected/blkid/low-probe-xfs +index f21d881a5..6eb1b4600 100644 +--- a/tests/expected/blkid/low-probe-xfs ++++ b/tests/expected/blkid/low-probe-xfs +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=test-xfs + ID_FS_LABEL_ENC=test-xfs + ID_FS_TYPE=xfs +diff --git a/tests/expected/blkid/low-probe-zfs b/tests/expected/blkid/low-probe-zfs +index 952e0e591..0e7af2866 100644 +--- a/tests/expected/blkid/low-probe-zfs ++++ b/tests/expected/blkid/low-probe-zfs +@@ -1,3 +1,4 @@ ++ID_FS_BLOCK_SIZE=512 + ID_FS_LABEL=tank + ID_FS_LABEL_ENC=tank + ID_FS_TYPE=zfs_member +-- +2.25.4 + diff --git a/0038-libblkid-xfs-fix-sector-size-calculation.patch b/0038-libblkid-xfs-fix-sector-size-calculation.patch new file mode 100644 index 0000000..dd0d58d --- /dev/null +++ b/0038-libblkid-xfs-fix-sector-size-calculation.patch @@ -0,0 +1,29 @@ +From 28b89361bf574af24c2f9c857d0e5f7c84e2787c Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 3 Sep 2019 15:10:35 +0200 +Subject: [PATCH 38/40] libblkid: (xfs) fix sector size calculation + +Reported-by: Anatoly Pugachev +Upstream: http://github.com/karelzak/util-linux/commit/2771d40b88660a11306aa5d4e200fc0ebebfe315 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1817726 +Signed-off-by: Karel Zak +--- + libblkid/src/superblocks/xfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libblkid/src/superblocks/xfs.c b/libblkid/src/superblocks/xfs.c +index eb513ac3e..98e59ff7c 100644 +--- a/libblkid/src/superblocks/xfs.c ++++ b/libblkid/src/superblocks/xfs.c +@@ -173,7 +173,7 @@ static int probe_xfs(blkid_probe pr, const struct blkid_idmag *mag) + blkid_probe_set_label(pr, (unsigned char *) xs->sb_fname, + sizeof(xs->sb_fname)); + blkid_probe_set_uuid(pr, xs->sb_uuid); +- blkid_probe_set_block_size(pr, xs->sb_sectsize * 256); ++ blkid_probe_set_block_size(pr, be16_to_cpu(xs->sb_sectsize)); + return 0; + } + +-- +2.25.4 + diff --git a/0039-col-make-flush_line-a-little-bit-robust.patch b/0039-col-make-flush_line-a-little-bit-robust.patch new file mode 100644 index 0000000..f586752 --- /dev/null +++ b/0039-col-make-flush_line-a-little-bit-robust.patch @@ -0,0 +1,68 @@ +From 54e3d1414e1a031d6f635f8fcbe273eecfd65560 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 5 Feb 2019 12:06:00 +0100 +Subject: [PATCH 39/40] col: make flush_line() a little bit robust + +The code is horrible. The core of the problem are signed integers +and no check for the limits. + +This patch fixes c->c_column = cur_col; where c_column is "short" +and "cur_col" is int. Let's use "int" for all the variables. It's +really not perfect as for bigger lines it can segfault again... + +The patch also removes some unnecessary static variables. + +Upstream: http://github.com/karelzak/util-linux/commit/004356f05018e3bfcaddd2652846659a4d8481f3 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1803753 +Addresses: https://github.com/karelzak/util-linux/issues/749 +Signed-off-by: Karel Zak +--- + text-utils/col.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/text-utils/col.c b/text-utils/col.c +index 3d9e15d26..c2f8db64d 100644 +--- a/text-utils/col.c ++++ b/text-utils/col.c +@@ -88,7 +88,7 @@ typedef char CSET; + typedef struct char_str { + #define CS_NORMAL 1 + #define CS_ALTERNATE 2 +- short c_column; /* column character is in */ ++ int c_column; /* column character is in */ + CSET c_set; /* character set (currently only 2) */ + wchar_t c_char; /* character in question */ + int c_width; /* character width */ +@@ -476,8 +476,9 @@ void flush_line(LINE *l) + nchars = l->l_line_len; + + if (l->l_needs_sort) { +- static CHAR *sorted; +- static int count_size, *count, i, save, sorted_size, tot; ++ static CHAR *sorted = NULL; ++ static int count_size = 0, *count = NULL, sorted_size = 0; ++ int i, tot; + + /* + * Do an O(n) sort on l->l_line by column being careful to +@@ -494,7 +495,7 @@ void flush_line(LINE *l) + (unsigned)sizeof(int) * count_size); + } + memset(count, 0, sizeof(int) * l->l_max_col + 1); +- for (i = nchars, c = l->l_line; --i >= 0; c++) ++ for (i = nchars, c = l->l_line; c && --i >= 0; c++) + count[c->c_column]++; + + /* +@@ -502,7 +503,7 @@ void flush_line(LINE *l) + * indices into new line. + */ + for (tot = 0, i = 0; i <= l->l_max_col; i++) { +- save = count[i]; ++ int save = count[i]; + count[i] = tot; + tot += save; + } +-- +2.25.4 + diff --git a/0040-libmount-improve-smb-2-3-support.patch b/0040-libmount-improve-smb-2-3-support.patch new file mode 100644 index 0000000..d30a197 --- /dev/null +++ b/0040-libmount-improve-smb-2-3-support.patch @@ -0,0 +1,49 @@ +From 2cd5219da87274db251a7f836efe6ac724b70e53 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 11 Mar 2020 10:38:37 +0100 +Subject: [PATCH 40/40] libmount: improve smb{2,3} support + +It seems kernel can use smb3 as fstype in mountinfo. + +Upstream: http://github.com/karelzak/util-linux/commit/36d80cb6c11b3064ed9fb29c7c8b101e3f266441 +Upstream: http://github.com/karelzak/util-linux/commit/b7ff4134beea53688ab3c01484cf59b2ce2d9ce9 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1812118 +Signed-off-by: Karel Zak +--- + libmount/src/tab.c | 5 ++++- + libmount/src/utils.c | 1 + + 2 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/libmount/src/tab.c b/libmount/src/tab.c +index eb61dd33e..74d60df3d 100644 +--- a/libmount/src/tab.c ++++ b/libmount/src/tab.c +@@ -1644,9 +1644,12 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs) + if (root) { + const char *fstype = mnt_fs_get_fstype(fs); + +- if (fstype && strcmp(fstype, "cifs") == 0) { ++ if (fstype && (strcmp(fstype, "cifs") == 0 ++ || strcmp(fstype, "smb3") == 0)) { ++ + const char *unc_subdir = get_cifs_unc_subdir_path(src); + const char *path_on_fs = mnt_fs_get_root(fs); ++ + if (!unc_subdir || !path_on_fs || !streq_paths(unc_subdir, path_on_fs)) + continue; + } else { +diff --git a/libmount/src/utils.c b/libmount/src/utils.c +index 04e79f53f..e43588831 100644 +--- a/libmount/src/utils.c ++++ b/libmount/src/utils.c +@@ -315,6 +315,7 @@ int mnt_fstype_is_pseudofs(const char *type) + int mnt_fstype_is_netfs(const char *type) + { + if (strcmp(type, "cifs") == 0 || ++ strcmp(type, "smb3") == 0 || + strcmp(type, "smbfs") == 0 || + strncmp(type,"nfs", 3) == 0 || + strcmp(type, "afs") == 0 || +-- +2.25.4 + diff --git a/0041-libmount-fix-mount-a-EBUSY-for-cifs.patch b/0041-libmount-fix-mount-a-EBUSY-for-cifs.patch new file mode 100644 index 0000000..28e915e --- /dev/null +++ b/0041-libmount-fix-mount-a-EBUSY-for-cifs.patch @@ -0,0 +1,65 @@ +From 618aedc9e892b206492c1720bec261b043c66263 Mon Sep 17 00:00:00 2001 +From: Roberto Bergantinos Corpas +Date: Mon, 27 Apr 2020 15:46:02 +0200 +Subject: [PATCH] libmount: fix mount -a EBUSY for cifs + +fstab: + + //rhel73/myshare/sub/path /mnt cifs + +after mount in mountinfo: + + # grep cifs /proc/self/mountinfo + 47 39 0:40 /sub/path /mnt rw,relatime shared:60 - cifs //rhel73/myshare/sub/path ... + ^^^^^^^^^ +or: + + # grep cifs /proc/self/mountinfo + 47 39 0:40 / /mnt rw,relatime shared:60 - cifs //rhel73/myshare/sub/path ... + ^ + +That is so since on kernel cifs code, cifs_get_root (which returns the +entry associated with mnt_root) return s_root if +CIFS_MOUNT_USE_PREFIX_PATH is set, no questions asked. + +This situation can occurr often on CIFS mounts, as CIFS servers limit +frequently scope of access to the root path. + +[kzak@redhat.com: - add more info to the commit message, + - clean up variable names] + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1829245 +Upstream: http://github.com/karelzak/util-linux/commit/31b3a523eca2fc7e5876ec5fd89094208fed0899 +Signed-off-by: Roberto Bergantinos Corpas +Signed-off-by: Karel Zak +--- + libmount/src/tab.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/libmount/src/tab.c b/libmount/src/tab.c +index 74d60df3d..cd97a1cb5 100644 +--- a/libmount/src/tab.c ++++ b/libmount/src/tab.c +@@ -1644,13 +1644,14 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs) + if (root) { + const char *fstype = mnt_fs_get_fstype(fs); + +- if (fstype && (strcmp(fstype, "cifs") == 0 +- || strcmp(fstype, "smb3") == 0)) { ++ if (fstype && (strcmp(fstype, "cifs") == 0 || ++ strcmp(fstype, "smb3") == 0)) { + +- const char *unc_subdir = get_cifs_unc_subdir_path(src); +- const char *path_on_fs = mnt_fs_get_root(fs); ++ const char *sub = get_cifs_unc_subdir_path(src); ++ const char *r = mnt_fs_get_root(fs); + +- if (!unc_subdir || !path_on_fs || !streq_paths(unc_subdir, path_on_fs)) ++ if (!sub || !r || (!streq_paths(sub, r) && ++ !streq_paths("/", r))) + continue; + } else { + const char *r = mnt_fs_get_root(fs); +-- +2.25.4 + diff --git a/0042-Manual-pages-losetup.8-Fix-direct-io-defaults.patch b/0042-Manual-pages-losetup.8-Fix-direct-io-defaults.patch new file mode 100644 index 0000000..19dbf34 --- /dev/null +++ b/0042-Manual-pages-losetup.8-Fix-direct-io-defaults.patch @@ -0,0 +1,31 @@ +From 0717177be22588d4e419de280eccd0eeafb15016 Mon Sep 17 00:00:00 2001 +From: Rupesh Girase +Date: Thu, 18 Jun 2020 19:17:41 +0530 +Subject: [PATCH] Manual pages: losetup.8: Fix "--direct-io" defaults + +"--direct-io" option is "off" by default while configuring +loop device but it's mentioned "on" in man page. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1848919 +Upstream: http://github.com/karelzak/util-linux/commit/4bee67e2d1a78abc52e89c6eb71f0efc8a278ce9 +Signed-off-by: Rupesh Girase +--- + sys-utils/losetup.8 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sys-utils/losetup.8 b/sys-utils/losetup.8 +index cdb9ed052..c87c231b6 100644 +--- a/sys-utils/losetup.8 ++++ b/sys-utils/losetup.8 +@@ -130,7 +130,7 @@ Set up a read-only loop device. + .BR \-\-direct\-io [ =on | off ] + Enable or disable direct I/O for the backing file. The optional argument + can be either \fBon\fR or \fBoff\fR. If the argument is omitted, it defaults +-to \fBon\fR. ++to \fBoff\fR. + .TP + .BR \-v , " \-\-verbose" + Verbose mode. +-- +2.25.4 + diff --git a/0043-chrt-use-SCHED_FLAG_RESET_ON_FORK-for-sched_setattr.patch b/0043-chrt-use-SCHED_FLAG_RESET_ON_FORK-for-sched_setattr.patch new file mode 100644 index 0000000..53a6454 --- /dev/null +++ b/0043-chrt-use-SCHED_FLAG_RESET_ON_FORK-for-sched_setattr.patch @@ -0,0 +1,46 @@ +From f575b6e0857087f46d54f494d9a435af715ea19d Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Thu, 1 Oct 2020 10:40:27 +0200 +Subject: [PATCH 43/55] chrt: use SCHED_FLAG_RESET_ON_FORK for sched_setattr() + +Reviewed by many people, used for years (but probably nobody uses +SCHED_DEADLINE with reset-on-fork), but we all missed: + +- sched_setscheduler() uses SCHED_RESET_ON_FORK (0x40000000) +- sched_setattr() uses SCHED_FLAG_RESET_ON_FORK (0x01) + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1884194 +Signed-off-by: Karel Zak +--- + schedutils/chrt.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/schedutils/chrt.c b/schedutils/chrt.c +index b08c78ed8..15556bbad 100644 +--- a/schedutils/chrt.c ++++ b/schedutils/chrt.c +@@ -123,7 +123,7 @@ struct chrt_ctl { + uint64_t period; + + unsigned int all_tasks : 1, /* all threads of the PID */ +- reset_on_fork : 1, /* SCHED_RESET_ON_FORK */ ++ reset_on_fork : 1, /* SCHED_RESET_ON_FORK or SCHED_FLAG_RESET_ON_FORK */ + altered : 1, /* sched_set**() used */ + verbose : 1; /* verbose output */ + }; +@@ -376,9 +376,10 @@ static int set_sched_one(struct chrt_ctl *ctl, pid_t pid) + sa.sched_period = ctl->period; + sa.sched_deadline = ctl->deadline; + +-# ifdef SCHED_RESET_ON_FORK ++# ifdef SCHED_FLAG_RESET_ON_FORK ++ /* Don't use SCHED_RESET_ON_FORK for sched_setattr()! */ + if (ctl->reset_on_fork) +- sa.sched_flags |= SCHED_RESET_ON_FORK; ++ sa.sched_flags |= SCHED_FLAG_RESET_ON_FORK; + # endif + errno = 0; + return sched_setattr(pid, &sa, 0); +-- +2.29.2 + diff --git a/0044-chrt-don-t-restrict-reset-on-fork-add-more-info-to-m.patch b/0044-chrt-don-t-restrict-reset-on-fork-add-more-info-to-m.patch new file mode 100644 index 0000000..519b090 --- /dev/null +++ b/0044-chrt-don-t-restrict-reset-on-fork-add-more-info-to-m.patch @@ -0,0 +1,146 @@ +From c4caa5b973f9cdb4c43edea3c32cda62cdf15b3b Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Thu, 1 Oct 2020 11:20:01 +0200 +Subject: [PATCH 44/55] chrt: don't restrict --reset-on-fork, add more info to + man page + +The flag works (= kernel accepts it) for all scheduling policies +and sched_getattr() returns the flag for all policies. + +There is no reason for userspace to be more smart than kernel or hide +the flag when it prints sched_getattr()/sched_getscheduler() results. + + # chrt -v --reset-on-fork --batch 0 /bin/true + pid 1315019's new scheduling policy: SCHED_BATCH|SCHED_RESET_ON_FORK + + # chrt -v --reset-on-fork --fifo 1 /bin/true + pid 1315055's new scheduling policy: SCHED_FIFO|SCHED_RESET_ON_FORK + + # chrt -v --reset-on-fork --deadline --sched-period 10000 0 /bin/true + pid 1315182's new scheduling policy: SCHED_DEADLINE|SCHED_RESET_ON_FORK + + # chrt -v --reset-on-fork --idle 0 /bin/true + pid 1315247's new scheduling policy: SCHED_IDLE|SCHED_RESET_ON_FORK + + # chrt -v --reset-on-fork --rr 1 /bin/true + pid 1315275's new scheduling policy: SCHED_RR|SCHED_RESET_ON_FORK + + # chrt -v --reset-on-fork --other 0 /bin/true + pid 1315311's new scheduling policy: SCHED_OTHER|SCHED_RESET_ON_FORK + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1884194 +Signed-off-by: Karel Zak +--- + schedutils/chrt.1 | 32 ++++++++++++++++++++++++++++---- + schedutils/chrt.c | 18 +++++------------- + 2 files changed, 33 insertions(+), 17 deletions(-) + +diff --git a/schedutils/chrt.1 b/schedutils/chrt.1 +index 4b8b1e9da..a9adfb316 100644 +--- a/schedutils/chrt.1 ++++ b/schedutils/chrt.1 +@@ -92,13 +92,37 @@ Specifies period parameter for SCHED_DEADLINE policy (Linux-specific). + Specifies deadline parameter for SCHED_DEADLINE policy (Linux-specific). + .TP + \fB\-R\fR, \fB\-\-reset-on-fork\fR +-Add ++Use + .B SCHED_RESET_ON_FORK +-flag to the ++or ++.B SCHED_FLAG_RESET_ON_FORK ++flag. Linux-specific, supported since 2.6.31. ++ ++Each thread has a reset-on-fork scheduling flag. When this flag is set, children created by ++.BR fork (2) ++do not inherit privileged scheduling policies. After the reset-on-fork flag has been enabled, ++it can be reset only if the thread has the ++.BR CAP_SYS_NICE ++capability. This flag is disabled in child processes created by ++.BR fork (2). ++ ++More precisely, if the reset-on-fork flag is set, ++the following rules apply for subsequently created children: ++.RS ++.IP * 3 ++If the calling thread has a scheduling policy of + .B SCHED_FIFO + or +-.B SCHED_RR +-scheduling policy (Linux-specific, supported since 2.6.31). ++.BR SCHED_RR , ++the policy is reset to ++.BR SCHED_OTHER ++in child processes. ++.IP * ++If the calling process has a negative nice value, ++the nice value is reset to zero in child processes. ++.RE ++ ++ + + .SH OPTIONS + .TP +diff --git a/schedutils/chrt.c b/schedutils/chrt.c +index 15556bbad..2a6f1e151 100644 +--- a/schedutils/chrt.c ++++ b/schedutils/chrt.c +@@ -152,7 +152,7 @@ static void __attribute__((__noreturn__)) usage(void) + + fputs(USAGE_SEPARATOR, out); + fputs(_("Scheduling options:\n"), out); +- fputs(_(" -R, --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR\n"), out); ++ fputs(_(" -R, --reset-on-fork set reset-on-fork flag\n"), out); + fputs(_(" -T, --sched-runtime runtime parameter for DEADLINE\n"), out); + fputs(_(" -P, --sched-period period parameter for DEADLINE\n"), out); + fputs(_(" -D, --sched-deadline deadline parameter for DEADLINE\n"), out); +@@ -173,22 +173,19 @@ static void __attribute__((__noreturn__)) usage(void) + + static const char *get_policy_name(int policy) + { ++#ifdef SCHED_RESET_ON_FORK ++ policy &= ~SCHED_RESET_ON_FORK; ++#endif + switch (policy) { + case SCHED_OTHER: + return "SCHED_OTHER"; + case SCHED_FIFO: +-#ifdef SCHED_RESET_ON_FORK +- case SCHED_FIFO | SCHED_RESET_ON_FORK: +-#endif + return "SCHED_FIFO"; + #ifdef SCHED_IDLE + case SCHED_IDLE: + return "SCHED_IDLE"; + #endif + case SCHED_RR: +-#ifdef SCHED_RESET_ON_FORK +- case SCHED_RR | SCHED_RESET_ON_FORK: +-#endif + return "SCHED_RR"; + #ifdef SCHED_BATCH + case SCHED_BATCH: +@@ -257,7 +254,7 @@ fallback: + else + prio = sp.sched_priority; + # ifdef SCHED_RESET_ON_FORK +- if (policy == (SCHED_FIFO|SCHED_RESET_ON_FORK) || policy == (SCHED_BATCH|SCHED_RESET_ON_FORK)) ++ if (policy & SCHED_RESET_ON_FORK) + reset_on_fork = 1; + # endif + } +@@ -515,11 +512,6 @@ int main(int argc, char **argv) + errno = 0; + ctl->priority = strtos32_or_err(argv[optind], _("invalid priority argument")); + +-#ifdef SCHED_RESET_ON_FORK +- if (ctl->reset_on_fork && ctl->policy != SCHED_FIFO && ctl->policy != SCHED_RR) +- errx(EXIT_FAILURE, _("--reset-on-fork option is supported for " +- "SCHED_FIFO and SCHED_RR policies only")); +-#endif + #ifdef SCHED_DEADLINE + if ((ctl->runtime || ctl->deadline || ctl->period) && ctl->policy != SCHED_DEADLINE) + errx(EXIT_FAILURE, _("--sched-{runtime,deadline,period} options " +-- +2.29.2 + diff --git a/0045-mount.8-clarify-no-suid-behavior-on-file-capabilitie.patch b/0045-mount.8-clarify-no-suid-behavior-on-file-capabilitie.patch new file mode 100644 index 0000000..a65c8e6 --- /dev/null +++ b/0045-mount.8-clarify-no-suid-behavior-on-file-capabilitie.patch @@ -0,0 +1,41 @@ +From 8704fa57c3b93152df6c10fd6a35ebdd59e1a5b7 Mon Sep 17 00:00:00 2001 +From: Peter Wu +Date: Fri, 1 Feb 2019 15:40:53 +0100 +Subject: [PATCH 45/55] mount.8: clarify (no)suid behavior on file capabilities + +Clarify that the nosuid option also affects file capabilities and that +it only limits execution of programs. (setgid on directories still +inherit the group regardless of the nosuid option.) The new text is +taken from the mount(2) manual page from the man-pages project. + +Addresses: https://github.com/karelzak/util-linux/issues/482 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1855759 +Signed-off-by: Peter Wu +--- + sys-utils/mount.8 | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/sys-utils/mount.8 b/sys-utils/mount.8 +index 1cc792979..a4d7de2c0 100644 +--- a/sys-utils/mount.8 ++++ b/sys-utils/mount.8 +@@ -1107,12 +1107,12 @@ or + Do not use the lazytime feature. + .TP + .B suid +-Allow set-user-ID or set-group-ID bits to take +-effect. ++Honor set-user-ID and set-group-ID bits or file capabilities when ++executing programs from this filesystem. + .TP + .B nosuid +-Do not allow set-user-ID or set-group-ID bits to take +-effect. ++Do not honor set-user-ID and set-group-ID bits or file capabilities when ++executing programs from this filesystem. + .TP + .B silent + Turn on the silent flag. +-- +2.29.2 + diff --git a/0046-lsblk-Fall-back-to-ID_SERIAL.patch b/0046-lsblk-Fall-back-to-ID_SERIAL.patch new file mode 100644 index 0000000..603e628 --- /dev/null +++ b/0046-lsblk-Fall-back-to-ID_SERIAL.patch @@ -0,0 +1,59 @@ +From afe6545483a881ccde41dcaa6718c71c74b38d7b Mon Sep 17 00:00:00 2001 +From: Sven Wiltink +Date: Fri, 1 May 2020 16:35:40 +0200 +Subject: [PATCH 46/55] lsblk: Fall back to ID_SERIAL + +In some cases ID_SERIAL_SHORT isn't provided by libudev, but ID_SERIAL +is. An example of this are virtio devices. See the output of udevadm +info: +P: /devices/pci0000:00/0000:00:06.0/virtio2/block/vdb +N: vdb +S: disk/by-id/virtio-08491434ee711d3420e9 +S: disk/by-path/pci-0000:00:06.0 +S: disk/by-path/virtio-pci-0000:00:06.0 +E: DEVLINKS=/dev/disk/by-id/virtio-08491434ee711d3420e9 /dev/disk/by-path/pci-0000:00:06.0 /dev/disk/by-path/virtio-pci-0000:00:06.0 +E: DEVNAME=/dev/vdb +E: DEVPATH=/devices/pci0000:00/0000:00:06.0/virtio2/block/vdb +E: DEVTYPE=disk +E: ID_PATH=pci-0000:00:06.0 +E: ID_PATH_TAG=pci-0000_00_06_0 +E: ID_SERIAL=08491434ee711d3420e9 +E: MAJOR=252 +E: MINOR=16 +E: SUBSYSTEM=block +E: TAGS=:systemd: +E: USEC_INITIALIZED=1403804 + +[RHEL-8 backport: add ID_SERIAL and also ID_SCSI_SERIAL to be compatible with upstream] + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1861670 +Upstream: http://github.com/karelzak/util-linux/commit/e81d0f80068086147434fa947a4f723c00318772 +Upstream: http://github.com/karelzak/util-linux/commit/de6c2a4aec140e6086e278688d97f4655ced1a9a +Signed-off-by: Karel Zak +--- + misc-utils/lsblk.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c +index ae97f9f05..d0369d3e7 100644 +--- a/misc-utils/lsblk.c ++++ b/misc-utils/lsblk.c +@@ -567,8 +567,14 @@ static int get_udev_properties(struct blkdev_cxt *cxt) + if (data) + cxt->wwn = xstrdup(data); + +- if ((data = udev_device_get_property_value(dev, "ID_SERIAL_SHORT"))) ++ data = udev_device_get_property_value(dev, "ID_SCSI_SERIAL"); ++ if (!data) ++ data = udev_device_get_property_value(dev, "ID_SERIAL_SHORT"); ++ if (!data) ++ data = udev_device_get_property_value(dev, "ID_SERIAL"); ++ if (data) + cxt->serial = xstrdup(data); ++ + udev_device_unref(dev); + cxt->probed = 1; + DBG(DEV, ul_debugobj(cxt, "%s: found udev properties", cxt->name)); +-- +2.29.2 + diff --git a/0047-lscpu-avoid-segfault-on-PowerPC-systems-with-valid-h.patch b/0047-lscpu-avoid-segfault-on-PowerPC-systems-with-valid-h.patch new file mode 100644 index 0000000..21bca67 --- /dev/null +++ b/0047-lscpu-avoid-segfault-on-PowerPC-systems-with-valid-h.patch @@ -0,0 +1,32 @@ +From 4ac8e70822313b0c6b35ebf633c6e8fbca558998 Mon Sep 17 00:00:00 2001 +From: Thomas Abraham +Date: Thu, 24 Sep 2020 14:52:33 -0400 +Subject: [PATCH 47/55] lscpu: avoid segfault on PowerPC systems with valid + hardware configurations + +ntypes greater than 1 is valid in some hardware configurations, and an assert() +on the value isn't necessary or very future proof + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883783 +Upstream: http://github.com/karelzak/util-linux/commit/cbe3304bc43b3fceb06fb6e5dd822bb59abf1b84 +Signed-off-by: Karel Zak +--- + sys-utils/lscpu.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c +index 1aa7bff4d..748d545b6 100644 +--- a/sys-utils/lscpu.c ++++ b/sys-utils/lscpu.c +@@ -369,8 +369,6 @@ static void read_physical_info_powerpc(struct lscpu_desc *desc) + return; + + ntypes = strbe16toh(buf, 2); +- +- assert(ntypes <= 1); + if (!ntypes) + return; + +-- +2.29.2 + diff --git a/0048-libfdisk-count-gaps-to-possible-size-when-resize.patch b/0048-libfdisk-count-gaps-to-possible-size-when-resize.patch new file mode 100644 index 0000000..86f4e98 --- /dev/null +++ b/0048-libfdisk-count-gaps-to-possible-size-when-resize.patch @@ -0,0 +1,33 @@ +From b3c5c1f39db58b057bb581f1d3bebcbeedeee1cb Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 17 Sep 2018 11:58:50 +0200 +Subject: [PATCH 48/55] libfdisk: count gaps to possible size when resize + +The current code counts only partition sizes when it counts possible +space, but we have gaps between the partitions. It seems better to +count all based on offsets rather than sizes. + +Addresses: https://github.com/karelzak/util-linux/issues/693 +Upstream: http://github.com/karelzak/util-linux/commit/2f35c1ead621f42f32f7777232568cb03185b473 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1900498 +Signed-off-by: Karel Zak +--- + libfdisk/src/partition.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c +index a790dc9c9..ebcf6bf5c 100644 +--- a/libfdisk/src/partition.c ++++ b/libfdisk/src/partition.c +@@ -1113,7 +1113,7 @@ static int resize_get_last_possible( + break; + } else { + last = pa; +- *maxsz += pa->size; ++ *maxsz = pa->size - (start - pa->start); + DBG(TAB, ul_debugobj(tb, " new max=%ju (last updated)", (uintmax_t) *maxsz)); + } + } +-- +2.29.2 + diff --git a/0049-libmount-parser-fix-memory-leak-on-error-before-end-.patch b/0049-libmount-parser-fix-memory-leak-on-error-before-end-.patch new file mode 100644 index 0000000..9482386 --- /dev/null +++ b/0049-libmount-parser-fix-memory-leak-on-error-before-end-.patch @@ -0,0 +1,116 @@ +From 780f79420073e0c09cd41afea28ac217a6d4ef29 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 26 Jun 2020 12:59:32 +0200 +Subject: [PATCH 49/55] libmount: (parser) fix memory leak on error before + end-of-file + +Let's simplify the loop where we add FS to the table. The optimization +for recoverable errors is a fragile overkill. The new code always +allocates and unrefs FS for each loop. + +Addresses: https://github.com/karelzak/util-linux/pull/1068 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1900498 +Upstream: http://github.com/karelzak/util-linux/commit/fe0d12d4f82269096f8d0cffc51ca9590814c284 +Signed-off-by: Karel Zak +--- + libmount/src/fs.c | 2 +- + libmount/src/tab_parse.c | 49 ++++++++++++++++++++++------------------ + 2 files changed, 28 insertions(+), 23 deletions(-) + +diff --git a/libmount/src/fs.c b/libmount/src/fs.c +index def32253c..aae4961c3 100644 +--- a/libmount/src/fs.c ++++ b/libmount/src/fs.c +@@ -34,7 +34,7 @@ struct libmnt_fs *mnt_new_fs(void) + + fs->refcount = 1; + INIT_LIST_HEAD(&fs->ents); +- /*DBG(FS, ul_debugobj(fs, "alloc"));*/ ++ DBG(FS, ul_debugobj(fs, "alloc")); + return fs; + } + +diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c +index 10fc68279..719c1abca 100644 +--- a/libmount/src/tab_parse.c ++++ b/libmount/src/tab_parse.c +@@ -608,7 +608,6 @@ static int __table_parse_stream(struct libmnt_table *tb, FILE *f, const char *fi + int rc = -1; + int flags = 0; + pid_t tid = -1; +- struct libmnt_fs *fs = NULL; + struct libmnt_parser pa = { .line = 0 }; + + assert(tb); +@@ -628,19 +627,25 @@ static int __table_parse_stream(struct libmnt_table *tb, FILE *f, const char *fi + if (filename && strcmp(filename, _PATH_PROC_MOUNTS) == 0) + flags = MNT_FS_KERNEL; + +- while (!feof(f)) { +- if (!fs) { +- fs = mnt_new_fs(); +- if (!fs) +- goto err; ++ do { ++ struct libmnt_fs *fs; ++ ++ if (feof(f)) { ++ DBG(TAB, ul_debugobj(tb, "end-of-file")); ++ break; + } ++ fs = mnt_new_fs(); ++ if (!fs) ++ goto err; + ++ /* parse */ + rc = mnt_table_parse_next(&pa, tb, fs); + +- if (!rc && tb->fltrcb && tb->fltrcb(fs, tb->fltrcb_data)) +- rc = 1; /* filtered out by callback... */ ++ if (rc != 0 && tb->fltrcb && tb->fltrcb(fs, tb->fltrcb_data)) ++ rc = 1; /* error filtered out by callback... */ + +- if (!rc) { ++ /* add to the table */ ++ if (rc == 0) { + rc = mnt_table_add_fs(tb, fs); + fs->flags |= flags; + +@@ -651,21 +656,21 @@ static int __table_parse_stream(struct libmnt_table *tb, FILE *f, const char *fi + } + } + +- if (rc) { +- if (rc > 0) { +- mnt_reset_fs(fs); +- assert(fs->refcount == 1); +- continue; /* recoverable error, reuse fs*/ +- } ++ /* remove refernece (or deallocate on error) */ ++ mnt_unref_fs(fs); + +- mnt_unref_fs(fs); +- if (feof(f)) +- break; +- goto err; /* fatal error */ ++ /* recoverable error */ ++ if (rc > 0) { ++ DBG(TAB, ul_debugobj(tb, "recoverable error (continue)")); ++ continue; + } +- mnt_unref_fs(fs); +- fs = NULL; +- } ++ ++ /* fatal errors */ ++ if (rc < 0 && !feof(f)) { ++ DBG(TAB, ul_debugobj(tb, "fatal error")); ++ goto err; ++ } ++ } while (1); + + DBG(TAB, ul_debugobj(tb, "%s: stop parsing (%d entries)", + filename, mnt_table_get_nents(tb))); +-- +2.29.2 + diff --git a/0050-lscpu-update-ARM-identifiers-tables.patch b/0050-lscpu-update-ARM-identifiers-tables.patch new file mode 100644 index 0000000..bc3ae6c --- /dev/null +++ b/0050-lscpu-update-ARM-identifiers-tables.patch @@ -0,0 +1,104 @@ +From 6700a458ef1bcd8fe2c066411bc415bc43ccdb8a Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 15 Dec 2020 11:17:42 +0100 +Subject: [PATCH 50/55] lscpu: update ARM identifiers tables + +Use the latest upstream identifiers to add FUJITSU and HiSilicon +implementers and many new ARM CPUs. + +Upstream: http://github.com/karelzak/util-linux/commit/dd9b4cb32042def5b7767e26ebd294f7f52cd07f +Upstream: http://github.com/karelzak/util-linux/commit/a625b32e2c716723a28a49702a02c78274dd3bb6 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883056 +Signed-off-by: Karel Zak +--- + sys-utils/lscpu-arm.c | 27 ++++++++++++++++++++++++--- + 1 file changed, 24 insertions(+), 3 deletions(-) + +diff --git a/sys-utils/lscpu-arm.c b/sys-utils/lscpu-arm.c +index f3a746a62..2b178a72e 100644 +--- a/sys-utils/lscpu-arm.c ++++ b/sys-utils/lscpu-arm.c +@@ -49,7 +49,7 @@ static const struct id_part arm_part[] = { + { 0xc07, "Cortex-A7" }, + { 0xc08, "Cortex-A8" }, + { 0xc09, "Cortex-A9" }, +- { 0xc0d, "Cortex-A12" }, ++ { 0xc0d, "Cortex-A17" }, /* Originally A12 */ + { 0xc0f, "Cortex-A15" }, + { 0xc0e, "Cortex-A17" }, + { 0xc14, "Cortex-R4" }, +@@ -60,19 +60,28 @@ static const struct id_part arm_part[] = { + { 0xc21, "Cortex-M1" }, + { 0xc23, "Cortex-M3" }, + { 0xc24, "Cortex-M4" }, +- { 0xc20, "Cortex-M7" }, ++ { 0xc27, "Cortex-M7" }, + { 0xc60, "Cortex-M0+" }, + { 0xd01, "Cortex-A32" }, + { 0xd03, "Cortex-A53" }, + { 0xd04, "Cortex-A35" }, + { 0xd05, "Cortex-A55" }, ++ { 0xd06, "Cortex-A65" }, + { 0xd07, "Cortex-A57" }, + { 0xd08, "Cortex-A72" }, + { 0xd09, "Cortex-A73" }, + { 0xd0a, "Cortex-A75" }, ++ { 0xd0b, "Cortex-A76" }, ++ { 0xd0c, "Neoverse-N1" }, ++ { 0xd0d, "Cortex-A77" }, ++ { 0xd0e, "Cortex-A76AE" }, + { 0xd13, "Cortex-R52" }, + { 0xd20, "Cortex-M23" }, + { 0xd21, "Cortex-M33" }, ++ { 0xd41, "Cortex-A78" }, ++ { 0xd42, "Cortex-A78AE" }, ++ { 0xd4a, "Neoverse-E1" }, ++ { 0xd4b, "Cortex-A78C" }, + { -1, "unknown" }, + }; + +@@ -126,6 +135,7 @@ static const struct id_part samsung_part[] = { + static const struct id_part nvidia_part[] = { + { 0x000, "Denver" }, + { 0x003, "Denver 2" }, ++ { 0x004, "Carmel" }, + { -1, "unknown" }, + }; + +@@ -167,6 +177,16 @@ static const struct id_part intel_part[] = { + { -1, "unknown" }, + }; + ++static const struct id_part fujitsu_part[] = { ++ { 0x001, "A64FX" }, ++ { -1, "unknown" }, ++}; ++ ++static const struct id_part hisi_part[] = { ++ { 0xd01, "Kunpeng-920" }, /* aka tsv110 */ ++ { -1, "unknown" }, ++}; ++ + static const struct id_part unknown_part[] = { + { -1, "unknown" }, + }; +@@ -182,6 +202,8 @@ static const struct hw_impl hw_implementer[] = { + { 0x42, brcm_part, "Broadcom" }, + { 0x43, cavium_part, "Cavium" }, + { 0x44, dec_part, "DEC" }, ++ { 0x46, fujitsu_part, "FUJITSU" }, ++ { 0x48, hisi_part, "HiSilicon" }, + { 0x4e, nvidia_part, "Nvidia" }, + { 0x50, apm_part, "APM" }, + { 0x51, qcom_part, "Qualcomm" }, +@@ -191,7 +213,6 @@ static const struct hw_impl hw_implementer[] = { + { 0x69, intel_part, "Intel" }, + { -1, unknown_part, "unknown" }, + }; +- + void arm_cpu_decode(struct lscpu_desc *desc) + { + int j, impl, part; +-- +2.29.2 + diff --git a/0051-lscpu-use-cluster-on-aarch64-machine-which-doesn-t-h.patch b/0051-lscpu-use-cluster-on-aarch64-machine-which-doesn-t-h.patch new file mode 100644 index 0000000..1d27e96 --- /dev/null +++ b/0051-lscpu-use-cluster-on-aarch64-machine-which-doesn-t-h.patch @@ -0,0 +1,214 @@ +From 63d8d3e8d54326842677bc3d3a3e43a133846a71 Mon Sep 17 00:00:00 2001 +From: Masayoshi Mizuma +Date: Tue, 15 Dec 2020 12:07:38 +0100 +Subject: [PATCH 51/55] lscpu: use cluster on aarch64 machine which doesn't + have ACPI PPTT + +lscpu may show the wrong number of sockets if the machine is aarch64 and +doesn't have ACPI PPTT. + +That's because lscpu show the number of sockets by using a sysfs entry +(cpu/cpuX/topology/core_siblings). The sysfs entry is set by MPIDR_EL1 +register if the machine doesn't have ACPI PPTT. MPIDR_EL1 doesn't show +the physical socket information directly. It shows the affinity level. + +According to linux/arch/arm64/kernel/topology.c:store_cpu_topology(), +the top level of affinity is called as 'Cluster'. + +Use Cluster instead of Socket on the machine which doesn't have ACPI PPTT. + +Note, ARM SBBR v1.2 requires ACPI PPTT, so this patch is needed for the +machine which is based on SBBR v1.0 and v1.1. + +[kzak@redhat.com: - port to old code + - change semantic to be same as current upstream] + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883056 +Upstream: 73c0a766ffbe60e013b55cfd716d531b5a6ae22a +Upstream: https://marc.info/?l=util-linux-ng&m=159984070611464&w=2 +Signed-off-by: Masayoshi Mizuma +Signed-off-by: Karel Zak +--- + sys-utils/lscpu.1 | 3 +++ + sys-utils/lscpu.c | 65 ++++++++++++++++++++++++++++++++++++++++++----- + sys-utils/lscpu.h | 3 +++ + 3 files changed, 65 insertions(+), 6 deletions(-) + +diff --git a/sys-utils/lscpu.1 b/sys-utils/lscpu.1 +index b70f2e151..cf981d708 100644 +--- a/sys-utils/lscpu.1 ++++ b/sys-utils/lscpu.1 +@@ -47,6 +47,9 @@ The logical core number. A core can contain several CPUs. + .B SOCKET + The logical socket number. A socket can contain several cores. + .TP ++.B CLUSTER ++The logical cluster number. A cluster can contain several cores. ++.TP + .B BOOK + The logical book number. A book can contain several sockets. + .TP +diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c +index 748d545b6..a8b448fa0 100644 +--- a/sys-utils/lscpu.c ++++ b/sys-utils/lscpu.c +@@ -70,6 +70,7 @@ + #define _PATH_SYS_HYP_FEATURES "/sys/hypervisor/properties/features" + #define _PATH_SYS_CPU _PATH_SYS_SYSTEM "/cpu" + #define _PATH_SYS_NODE _PATH_SYS_SYSTEM "/node" ++#define _PATH_ACPI_PPTT "/sys/firmware/acpi/tables/PPTT" + #define _PATH_PROC_XEN "/proc/xen" + #define _PATH_PROC_XENCAP _PATH_PROC_XEN "/capabilities" + #define _PATH_PROC_CPUINFO "/proc/cpuinfo" +@@ -168,6 +169,7 @@ enum { + COL_CPU, + COL_CORE, + COL_SOCKET, ++ COL_CLUSTER, + COL_NODE, + COL_BOOK, + COL_DRAWER, +@@ -194,6 +196,7 @@ static struct lscpu_coldesc coldescs[] = + [COL_CPU] = { "CPU", N_("logical CPU number"), 1 }, + [COL_CORE] = { "CORE", N_("logical core number") }, + [COL_SOCKET] = { "SOCKET", N_("logical socket number") }, ++ [COL_CLUSTER] = { "CLUSTER", N_("logical cluster number") }, + [COL_NODE] = { "NODE", N_("logical NUMA node number") }, + [COL_BOOK] = { "BOOK", N_("logical book number") }, + [COL_DRAWER] = { "DRAWER", N_("logical drawer number") }, +@@ -383,6 +386,26 @@ static void read_physical_info_powerpc( + } + #endif + ++static int is_fallback_to_cluster(struct lscpu_desc *desc) ++{ ++ char *arch; ++ struct stat st; ++ struct utsname utsbuf; ++ ++ if (desc) ++ arch = desc->arch; ++ else { ++ if (uname(&utsbuf) == -1) ++ err(EXIT_FAILURE, _("error: uname failed")); ++ arch = utsbuf.machine; ++ } ++ ++ if (!(strcmp(arch, "aarch64")) && (stat(_PATH_ACPI_PPTT, &st) < 0)) ++ return 1; ++ else ++ return 0; ++} ++ + + static void + read_basicinfo(struct lscpu_desc *desc, struct lscpu_modifier *mod) +@@ -1344,6 +1367,10 @@ get_cell_data(struct lscpu_desc *desc, int idx, int col, + snprintf(buf, bufsz, "%zu", i); + } + break; ++ case COL_CLUSTER: ++ if (!desc->is_cluster) ++ break; ++ /* fallthrough */ + case COL_SOCKET: + if (mod->physical) { + if (desc->socketids[idx] == -1) +@@ -1799,12 +1826,18 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod) + if (fd) + fclose(fd); + } ++ ++ + if (desc->mtid) + threads_per_core = atoi(desc->mtid) + 1; + add_summary_n(tb, _("Thread(s) per core:"), + threads_per_core ?: desc->nthreads / desc->ncores); +- add_summary_n(tb, _("Core(s) per socket:"), +- cores_per_socket ?: desc->ncores / desc->nsockets); ++ if (desc->is_cluster) ++ add_summary_n(tb, _("Core(s) per cluster:"), ++ cores_per_socket ?: desc->ncores / desc->nsockets); ++ else ++ add_summary_n(tb, _("Core(s) per socket:"), ++ cores_per_socket ?: desc->ncores / desc->nsockets); + if (desc->nbooks) { + add_summary_n(tb, _("Socket(s) per book:"), + sockets_per_book ?: desc->nsockets / desc->nbooks); +@@ -1816,7 +1849,17 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod) + add_summary_n(tb, _("Book(s):"), books_per_drawer ?: desc->nbooks); + } + } else { +- add_summary_n(tb, _("Socket(s):"), sockets_per_book ?: desc->nsockets); ++ if (desc->is_cluster) { ++ if (desc->nr_socket_on_cluster > 0) ++ add_summary_n(tb, _("Socket(s):"), desc->nr_socket_on_cluster); ++ else ++ add_summary_s(tb, _("Socket(s):"), "-"); ++ ++ add_summary_n(tb, _("Cluster(s):"), ++ sockets_per_book ?: desc->nsockets); ++ } else ++ add_summary_n(tb, _("Socket(s):"), ++ sockets_per_book ?: desc->nsockets); + } + } + if (desc->nnodes) +@@ -2060,10 +2103,13 @@ int main(int argc, char *argv[]) + qsort(desc->ecaches, desc->necaches, + sizeof(struct cpu_cache), cachecmp); + ++ desc->is_cluster = is_fallback_to_cluster(desc); ++ + read_nodes(desc); + read_hypervisor(desc, mod); + arm_cpu_decode(desc); + ++ + switch(mod->mode) { + case OUTPUT_SUMMARY: + print_summary(desc, mod); +@@ -2072,7 +2118,10 @@ int main(int argc, char *argv[]) + if (!ncolumns) { + columns[ncolumns++] = COL_CPU; + columns[ncolumns++] = COL_CORE; +- columns[ncolumns++] = COL_SOCKET; ++ if (desc->is_cluster) ++ columns[ncolumns++] = COL_CLUSTER; ++ else ++ columns[ncolumns++] = COL_SOCKET; + columns[ncolumns++] = COL_NODE; + columns[ncolumns++] = COL_CACHE; + mod->compat = 1; +@@ -2089,8 +2138,12 @@ int main(int argc, char *argv[]) + columns[ncolumns++] = COL_DRAWER; + if (desc->bookmaps) + columns[ncolumns++] = COL_BOOK; +- if (desc->socketmaps) +- columns[ncolumns++] = COL_SOCKET; ++ if (desc->socketmaps) { ++ if (desc->is_cluster) ++ columns[ncolumns++] = COL_CLUSTER; ++ else ++ columns[ncolumns++] = COL_SOCKET; ++ } + if (desc->coremaps) + columns[ncolumns++] = COL_CORE; + if (desc->caches) +diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h +index 3d1885a3e..bffa9df60 100644 +--- a/sys-utils/lscpu.h ++++ b/sys-utils/lscpu.h +@@ -158,6 +158,9 @@ struct lscpu_desc { + int physsockets; /* Physical sockets (modules) */ + int physchips; /* Physical chips */ + int physcoresperchip; /* Physical cores per chip */ ++ ++ int is_cluster; ++ int nr_socket_on_cluster; + }; + + enum { +-- +2.29.2 + diff --git a/0052-lscpu-dmi-split-to-parse-dmi-table.patch b/0052-lscpu-dmi-split-to-parse-dmi-table.patch new file mode 100644 index 0000000..b77d264 --- /dev/null +++ b/0052-lscpu-dmi-split-to-parse-dmi-table.patch @@ -0,0 +1,115 @@ +From 60a1a900b22e6d714fbbde03322569ad4732b4ba Mon Sep 17 00:00:00 2001 +From: Masayoshi Mizuma +Date: Fri, 11 Sep 2020 09:53:26 -0400 +Subject: [PATCH 52/55] lscpu-dmi: split to parse dmi table + +Split out a function to parse dmi table. + +Signed-off-by: Masayoshi Mizuma +--- + sys-utils/lscpu-dmi.c | 60 ++++++++++++++++++++++++++++--------------- + 1 file changed, 40 insertions(+), 20 deletions(-) + +diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c +index 29bd2e4fc..9b57fe9e6 100644 +--- a/sys-utils/lscpu-dmi.c ++++ b/sys-utils/lscpu-dmi.c +@@ -42,6 +42,12 @@ struct dmi_header + uint8_t *data; + }; + ++struct dmi_info { ++ char *vendor; ++ char *product; ++ char *manufacturer; ++}; ++ + static int checksum(const uint8_t *buf, size_t len) + { + uint8_t sum = 0; +@@ -105,20 +111,13 @@ static char *dmi_string(const struct dmi_header *dm, uint8_t s) + return bp; + } + +-static int hypervisor_from_dmi_table(uint32_t base, uint16_t len, +- uint16_t num, const char *devmem) ++static int parse_dmi_table(uint16_t len, uint16_t num, ++ uint8_t *data, ++ struct dmi_info *di) + { +- uint8_t *buf; +- uint8_t *data; ++ uint8_t *buf = data; ++ int rc = -1; + int i = 0; +- char *vendor = NULL; +- char *product = NULL; +- char *manufacturer = NULL; +- int rc = HYPER_NONE; +- +- data = buf = get_mem_chunk(base, len, devmem); +- if (!buf) +- goto done; + + /* 4 is the length of an SMBIOS structure header */ + while (i < num && data + 4 <= buf + len) { +@@ -142,11 +141,11 @@ static int hypervisor_from_dmi_table(uint32_t base, uint16_t len, + next += 2; + switch (h.type) { + case 0: +- vendor = dmi_string(&h, data[0x04]); ++ di->vendor = dmi_string(&h, data[0x04]); + break; + case 1: +- manufacturer = dmi_string(&h, data[0x04]); +- product = dmi_string(&h, data[0x05]); ++ di->manufacturer = dmi_string(&h, data[0x04]); ++ di->product = dmi_string(&h, data[0x05]); + break; + default: + break; +@@ -155,15 +154,36 @@ static int hypervisor_from_dmi_table(uint32_t base, uint16_t len, + data = next; + i++; + } +- if (manufacturer && !strcmp(manufacturer, "innotek GmbH")) ++ rc = 0; ++done: ++ return rc; ++} ++ ++static int hypervisor_from_dmi_table(uint32_t base, uint16_t len, ++ uint16_t num, const char *devmem) ++{ ++ uint8_t *data; ++ int rc = HYPER_NONE; ++ struct dmi_info di; ++ ++ data = get_mem_chunk(base, len, devmem); ++ if (!data) ++ return rc; ++ ++ memset(&di, 0, sizeof(struct dmi_info)); ++ rc = parse_dmi_table(len, num, data, &di); ++ if (rc < 0) ++ goto done; ++ ++ if (di.manufacturer && !strcmp(di.manufacturer, "innotek GmbH")) + rc = HYPER_INNOTEK; +- else if (manufacturer && strstr(manufacturer, "HITACHI") && +- product && strstr(product, "LPAR")) ++ else if (di.manufacturer && strstr(di.manufacturer, "HITACHI") && ++ di.product && strstr(di.product, "LPAR")) + rc = HYPER_HITACHI; +- else if (vendor && !strcmp(vendor, "Parallels")) ++ else if (di.vendor && !strcmp(di.vendor, "Parallels")) + rc = HYPER_PARALLELS; + done: +- free(buf); ++ free(data); + return rc; + } + +-- +2.29.2 + diff --git a/0053-lscpu-add-helper-to-get-physical-sockets.patch b/0053-lscpu-add-helper-to-get-physical-sockets.patch new file mode 100644 index 0000000..8a384e0 --- /dev/null +++ b/0053-lscpu-add-helper-to-get-physical-sockets.patch @@ -0,0 +1,91 @@ +From 32c4fe66ae9107a7fae556be02c1401e5046071b Mon Sep 17 00:00:00 2001 +From: Masayoshi Mizuma +Date: Fri, 11 Sep 2020 09:53:27 -0400 +Subject: [PATCH 53/55] lscpu: add helper to get physical sockets + +Add a helper function, get_number_of_physical_sockets_from_dmi(), +to get physical sockets from DMI table in case of the sysfs for +cpu topology doesn't have the physical socket information. + +get_number_of_physical_sockets_from_dmi() parse the DMI table +and counts the number of SMBIOS Processor Information (Type04) +structure. + +Note, ARM SBBR v1.0 and newer requires SMBIOS Processor Information +(Type04). And ARM SBBR v1.2 requires ACPI PPTT which has physical socket +information. So the helper function is useful for the machine base on +SBBR v1.0 and v1.1. + +Signed-off-by: Masayoshi Mizuma +--- + sys-utils/lscpu-dmi.c | 30 ++++++++++++++++++++++++++++++ + sys-utils/lscpu.h | 1 + + 2 files changed, 31 insertions(+) + +diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c +index 9b57fe9e6..31127f48a 100644 +--- a/sys-utils/lscpu-dmi.c ++++ b/sys-utils/lscpu-dmi.c +@@ -46,6 +46,7 @@ struct dmi_info { + char *vendor; + char *product; + char *manufacturer; ++ int sockets; + }; + + static int checksum(const uint8_t *buf, size_t len) +@@ -147,6 +148,9 @@ static int parse_dmi_table(uint16_t len, uint16_t num, + di->manufacturer = dmi_string(&h, data[0x04]); + di->product = dmi_string(&h, data[0x05]); + break; ++ case 4: ++ di->sockets++; ++ break; + default: + break; + } +@@ -323,3 +327,29 @@ done: + free(buf); + return rc < 0 ? HYPER_NONE : rc; + } ++ ++int get_number_of_physical_sockets_from_dmi(void) ++{ ++ static char const sys_fw_dmi_tables[] = _PATH_SYS_DMI; ++ struct dmi_info di; ++ struct stat st; ++ uint8_t *data; ++ int rc = -1; ++ ++ if (stat(sys_fw_dmi_tables, &st)) ++ return rc; ++ ++ data = get_mem_chunk(0, st.st_size, sys_fw_dmi_tables); ++ if (!data) ++ return rc; ++ ++ memset(&di, 0, sizeof(struct dmi_info)); ++ rc = parse_dmi_table(st.st_size, st.st_size/4, data, &di); ++ ++ free(data); ++ ++ if ((rc < 0) || !di.sockets) ++ return rc; ++ else ++ return di.sockets; ++} +diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h +index bffa9df60..b190afd21 100644 +--- a/sys-utils/lscpu.h ++++ b/sys-utils/lscpu.h +@@ -186,6 +186,7 @@ struct lscpu_modifier { + }; + + extern int read_hypervisor_dmi(void); ++extern int get_number_of_physical_sockets_from_dmi(void); + extern void arm_cpu_decode(struct lscpu_desc *desc); + + #endif /* LSCPU_H */ +-- +2.29.2 + diff --git a/0054-lscpu-show-physical-socket-on-aarch64-without-ACPI-P.patch b/0054-lscpu-show-physical-socket-on-aarch64-without-ACPI-P.patch new file mode 100644 index 0000000..22ad472 --- /dev/null +++ b/0054-lscpu-show-physical-socket-on-aarch64-without-ACPI-P.patch @@ -0,0 +1,51 @@ +From ac6651b2bc599af707ccc96936bb028d31c1aea8 Mon Sep 17 00:00:00 2001 +From: Masayoshi Mizuma +Date: Fri, 11 Sep 2020 09:53:28 -0400 +Subject: [PATCH 54/56] lscpu: show physical socket on aarch64 without ACPI + PPTT + +Show the number of physical socket even if the sysfs doesn't have +the physical socket information. +Note, lscpu cannot show the number of socket info for unprivileged +users because it needs to access the DMI table. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883056 +Signed-off-by: Masayoshi Mizuma +Signed-off-by: Karel Zak +--- + sys-utils/lscpu.c | 6 ++++-- + sys-utils/lscpu.h | 1 - + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c +index a8b448fa0..dc6dc97c3 100644 +--- a/sys-utils/lscpu.c ++++ b/sys-utils/lscpu.c +@@ -1850,8 +1850,10 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod) + } + } else { + if (desc->is_cluster) { +- if (desc->nr_socket_on_cluster > 0) +- add_summary_n(tb, _("Socket(s):"), desc->nr_socket_on_cluster); ++ int sockets = get_number_of_physical_sockets_from_dmi(); ++ ++ if (sockets > 0) ++ add_summary_n(tb, _("Socket(s):"), sockets); + else + add_summary_s(tb, _("Socket(s):"), "-"); + +diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h +index b190afd21..1aef8202d 100644 +--- a/sys-utils/lscpu.h ++++ b/sys-utils/lscpu.h +@@ -160,7 +160,6 @@ struct lscpu_desc { + int physcoresperchip; /* Physical cores per chip */ + + int is_cluster; +- int nr_socket_on_cluster; + }; + + enum { +-- +2.29.2 + diff --git a/0055-lscpu-arm-read-vendor-and-model-from-BIOS.patch b/0055-lscpu-arm-read-vendor-and-model-from-BIOS.patch new file mode 100644 index 0000000..44ef972 --- /dev/null +++ b/0055-lscpu-arm-read-vendor-and-model-from-BIOS.patch @@ -0,0 +1,137 @@ +From 7089a63d03b35743de533686906c451b917d0909 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 16 Dec 2020 13:08:51 +0100 +Subject: [PATCH 55/56] lscpu: (arm) read vendor and model from BIOS + +This patch backports the current upstream code to read CPU vendor and +model name from BIOS. + +Upstream: http://github.com/karelzak/util-linux/commit/8014104bea78f6f82cb82e16329b562e60ecdc87 +Upstream: http://github.com/karelzak/util-linux/commit/367c85c472869b75eaf770d4be0b360e30710b95 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883056 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1882740 +Signed-off-by: Karel Zak +--- + sys-utils/lscpu-dmi.c | 44 +++++++++++++++++++++++++++++++++++++++++++ + sys-utils/lscpu.c | 7 +++++++ + sys-utils/lscpu.h | 3 +++ + 3 files changed, 54 insertions(+) + +diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c +index 31127f48a..3bdd7dcb2 100644 +--- a/sys-utils/lscpu-dmi.c ++++ b/sys-utils/lscpu-dmi.c +@@ -28,6 +28,7 @@ + #include + + #include "lscpu.h" ++#include "all-io.h" + + #define _PATH_SYS_DMI "/sys/firmware/dmi/tables/DMI" + +@@ -353,3 +354,46 @@ int get_number_of_physical_sockets_from_dmi(void) + else + return di.sockets; + } ++ ++ ++#define _PATH_SYS_DMI_TYPE4 "/sys/firmware/dmi/entries/4-0/raw" ++#define PROC_MFR_OFFSET 0x07 ++#define PROC_VERSION_OFFSET 0x10 ++ ++/* ++ * Use firmware to get human readable names ++ */ ++int arm_smbios_decode(struct lscpu_desc *desc) ++{ ++ uint8_t data[8192]; ++ char buf[128], *str; ++ struct dmi_header h; ++ int fd; ++ ssize_t rs; ++ ++ fd = open(_PATH_SYS_DMI_TYPE4, O_RDONLY); ++ if (fd < 0) ++ return fd; ++ ++ rs = read_all(fd, (char *) data, 8192); ++ close(fd); ++ ++ if (rs == -1) ++ return -1; ++ ++ to_dmi_header(&h, data); ++ ++ str = dmi_string(&h, data[PROC_MFR_OFFSET]); ++ if (str) { ++ xstrncpy(buf, str, 127); ++ desc->bios_vendor = xstrdup(buf); ++ } ++ ++ str = dmi_string(&h, data[PROC_VERSION_OFFSET]); ++ if (str) { ++ xstrncpy(buf, str, 127); ++ desc->bios_modelname = xstrdup(buf); ++ } ++ ++ return 0; ++} +diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c +index dc6dc97c3..70a797dd6 100644 +--- a/sys-utils/lscpu.c ++++ b/sys-utils/lscpu.c +@@ -1868,6 +1868,8 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod) + add_summary_n(tb, _("NUMA node(s):"), desc->nnodes); + if (desc->vendor) + add_summary_s(tb, _("Vendor ID:"), desc->vendor); ++ if (desc->bios_vendor) ++ add_summary_s(tb, _("BIOS Vendor ID:"), desc->bios_vendor); + if (desc->machinetype) + add_summary_s(tb, _("Machine type:"), desc->machinetype); + if (desc->family) +@@ -1876,6 +1878,8 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod) + add_summary_s(tb, _("Model:"), desc->revision ? desc->revision : desc->model); + if (desc->modelname || desc->cpu) + add_summary_s(tb, _("Model name:"), desc->cpu ? desc->cpu : desc->modelname); ++ if (desc->bios_modelname) ++ add_summary_s(tb, _("BIOS Model name:"), desc->bios_modelname); + if (desc->stepping) + add_summary_s(tb, _("Stepping:"), desc->stepping); + if (desc->mhz) +@@ -2109,6 +2113,9 @@ int main(int argc, char *argv[]) + + read_nodes(desc); + read_hypervisor(desc, mod); ++ ++ if (mod->system == SYSTEM_LIVE) ++ arm_smbios_decode(desc); + arm_cpu_decode(desc); + + +diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h +index 1aef8202d..802719eeb 100644 +--- a/sys-utils/lscpu.h ++++ b/sys-utils/lscpu.h +@@ -79,10 +79,12 @@ struct polarization_modes { + struct lscpu_desc { + char *arch; + char *vendor; ++ char *bios_vendor; /* aarch64 */ + char *machinetype; /* s390 */ + char *family; + char *model; + char *modelname; ++ char *bios_modelname; /* aarch64 */ + char *revision; /* alternative for model (ppc) */ + char *cpu; /* alternative for modelname (ppc, sparc) */ + char *virtflag; /* virtualization flag (vmx, svm) */ +@@ -187,5 +189,6 @@ struct lscpu_modifier { + extern int read_hypervisor_dmi(void); + extern int get_number_of_physical_sockets_from_dmi(void); + extern void arm_cpu_decode(struct lscpu_desc *desc); ++extern int arm_smbios_decode(struct lscpu_desc *desc); + + #endif /* LSCPU_H */ +-- +2.29.2 + diff --git a/0056-tests-update-sfdisk-resize.patch b/0056-tests-update-sfdisk-resize.patch new file mode 100644 index 0000000..ebf256d --- /dev/null +++ b/0056-tests-update-sfdisk-resize.patch @@ -0,0 +1,28 @@ +From 2193cfc5ee3f417e276c181fe39455646399153b Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 17 Sep 2018 16:22:14 +0200 +Subject: [PATCH 56/56] tests: update sfdisk resize + +Upstream: http://github.com/karelzak/util-linux/commit/a1b463d94afdae65ab5bfb192a58f1ceeb13679a +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1900498 +Signed-off-by: Karel Zak +--- + tests/expected/sfdisk/dos-resize-logical | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/expected/sfdisk/dos-resize-logical b/tests/expected/sfdisk/dos-resize-logical +index 9ceb9a327..a427ff010 100644 +--- a/tests/expected/sfdisk/dos-resize-logical ++++ b/tests/expected/sfdisk/dos-resize-logical +@@ -26,7 +26,7 @@ Device Boot Start End Sectors Size Id Type + 3 6144 8191 2048 1M 83 Linux + 4 8192 28671 20480 10M 5 Extended + 5 10240 12287 2048 1M 83 Linux +-6 14336 26623 12288 6M 83 Linux ++6 14336 28671 14336 7M 83 Linux + + The partition table has been altered. + Calling ioctl() to re-read partition table. +-- +2.29.2 + diff --git a/0057-mesg-use-only-stat-to-get-the-current-terminal-statu.patch b/0057-mesg-use-only-stat-to-get-the-current-terminal-statu.patch new file mode 100644 index 0000000..62ff51f --- /dev/null +++ b/0057-mesg-use-only-stat-to-get-the-current-terminal-statu.patch @@ -0,0 +1,52 @@ +From 7ad815523618c2a053d28061054a44ae9108ceb0 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 12 Apr 2021 09:39:59 +0200 +Subject: [PATCH 57/63] mesg: use only stat() to get the current terminal + status + +open()+stat() does not work for example after su(1) (from root to +non-root). It seems better to use only stat() to get the current +terminal status. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1906157 +Upstream: http://github.com/karelzak/util-linux/commit/c0246ce059503bbc078122a50d564ca36a66f348 +Signed-off-by: Karel Zak +--- + term-utils/mesg.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/term-utils/mesg.c b/term-utils/mesg.c +index 8714ad1aa..21a4a8581 100644 +--- a/term-utils/mesg.c ++++ b/term-utils/mesg.c +@@ -123,13 +123,10 @@ int main(int argc, char *argv[]) + + if ((tty = ttyname(STDERR_FILENO)) == NULL) + err(MESG_EXIT_FAILURE, _("ttyname failed")); +- if ((fd = open(tty, O_RDONLY)) < 0) +- err(MESG_EXIT_FAILURE, _("cannot open %s"), tty); +- if (fstat(fd, &sb)) +- err(MESG_EXIT_FAILURE, _("stat of %s failed"), tty); + + if (!*argv) { +- close(fd); ++ if (stat(tty, &sb)) ++ err(MESG_EXIT_FAILURE, _("stat of %s failed"), tty); + if (sb.st_mode & (S_IWGRP | S_IWOTH)) { + puts(_("is y")); + return IS_ALLOWED; +@@ -138,6 +135,11 @@ int main(int argc, char *argv[]) + return IS_NOT_ALLOWED; + } + ++ if ((fd = open(tty, O_RDONLY)) < 0) ++ err(MESG_EXIT_FAILURE, _("cannot open %s"), tty); ++ if (fstat(fd, &sb)) ++ err(MESG_EXIT_FAILURE, _("stat of %s failed"), tty); ++ + switch (rpmatch(argv[0])) { + case RPMATCH_YES: + #ifdef USE_TTY_GROUP +-- +2.31.1 + diff --git a/0058-findmnt-add-option-to-list-all-fs-independent-flags.patch b/0058-findmnt-add-option-to-list-all-fs-independent-flags.patch new file mode 100644 index 0000000..827ab0c --- /dev/null +++ b/0058-findmnt-add-option-to-list-all-fs-independent-flags.patch @@ -0,0 +1,212 @@ +From 2f04609de018013a36396e6a10b317607fb0b625 Mon Sep 17 00:00:00 2001 +From: Roberto Bergantinos Corpas +Date: Tue, 12 Jan 2021 11:58:53 +0100 +Subject: [PATCH 58/63] findmnt: add option to list all fs-independent flags + +It might be useful for security auditing purposes list all possible +mount flags/options including default set which are normally not listed. + +This patch adds "--vfs-all" option to list all fs-independent flags +on VFS-OPTIONS column, as well as libmount funcionality to accomplish +it. + +i.e.: + +$ findmnt -o VFS-OPTIONS +VFS-OPTIONS +rw,relatime +rw,nosuid,nodev,noexec,relatime +rw,nosuid,nodev,noexec,relatime +ro,nosuid,nodev,noexec +... + +$ findmnt --vfs-all -o VFS-OPTIONS +VFS-OPTIONS +rw,exec,suid,dev,async,loud,nomand,atime,noiversion,diratime,relatime,nostrictatime,nolazytime,symfollow +rw,noexec,nosuid,nodev,async,loud,nomand,atime,noiversion,diratime,relatime,nostrictatime,nolazytime,symfollow +rw,noexec,nosuid,nodev,async,loud,nomand,atime,noiversion,diratime,relatime,nostrictatime,nolazytime,symfollow +ro,noexec,nosuid,nodev,async,loud,nomand,atime,noiversion,diratime,norelatime,nostrictatime,nolazytime,symfollow +... + +[kzak@redhat.com: - cleanup coding style and comments] + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1917852 +Upstream: http://github.com/karelzak/util-linux/commit/ff21f476f85ac9855452f4aac43a231c3c1e2ebc +Signed-off-by: Roberto Bergantinos Corpas +Signed-off-by: Karel Zak +--- + libmount/docs/libmount-sections.txt | 1 + + libmount/src/fs.c | 32 +++++++++++++++++++++++++++++ + libmount/src/libmount.h.in | 1 + + libmount/src/libmount.sym | 4 ++++ + misc-utils/findmnt.8 | 6 ++++++ + misc-utils/findmnt.c | 15 +++++++++++--- + misc-utils/findmnt.h | 2 ++ + 7 files changed, 58 insertions(+), 3 deletions(-) + +diff --git a/libmount/docs/libmount-sections.txt b/libmount/docs/libmount-sections.txt +index dea724b2f..f296c0611 100644 +--- a/libmount/docs/libmount-sections.txt ++++ b/libmount/docs/libmount-sections.txt +@@ -224,6 +224,7 @@ mnt_fs_get_usedsize + mnt_fs_get_userdata + mnt_fs_get_user_options + mnt_fs_get_vfs_options ++mnt_fs_get_vfs_options_all + mnt_fs_is_kernel + mnt_fs_is_netfs + mnt_fs_is_pseudofs +diff --git a/libmount/src/fs.c b/libmount/src/fs.c +index aae4961c3..34c09d66b 100644 +--- a/libmount/src/fs.c ++++ b/libmount/src/fs.c +@@ -924,6 +924,38 @@ const char *mnt_fs_get_vfs_options(struct libmnt_fs *fs) + return fs ? fs->vfs_optstr : NULL; + } + ++/** ++ * mnt_fs_get_vfs_options_all: ++ * @fs: fstab/mtab entry pointer ++ * ++ * Returns: pointer to newlly allocated string (can be freed by free(3)) or ++ * NULL in case of error. The string contains all (including defaults) mount ++ * options. ++ */ ++char *mnt_fs_get_vfs_options_all(struct libmnt_fs *fs) ++{ ++ const struct libmnt_optmap *map = mnt_get_builtin_optmap(MNT_LINUX_MAP); ++ const struct libmnt_optmap *ent; ++ const char *opts = mnt_fs_get_options(fs); ++ char *result = NULL; ++ unsigned long flags = 0; ++ ++ if (!opts || mnt_optstr_get_flags(opts, &flags, map)) ++ return NULL; ++ ++ for (ent = map ; ent && ent->name ; ent++){ ++ if (ent->id & flags) { /* non-default value */ ++ if (!(ent->mask & MNT_INVERT)) ++ mnt_optstr_append_option(&result, ent->name, NULL); ++ else ++ continue; ++ } else if (ent->mask & MNT_INVERT) ++ mnt_optstr_append_option(&result, ent->name, NULL); ++ } ++ ++ return result; ++} ++ + /** + * mnt_fs_get_user_options: + * @fs: fstab/mtab entry pointer +diff --git a/libmount/src/libmount.h.in b/libmount/src/libmount.h.in +index c61514b59..1d9a053e0 100644 +--- a/libmount/src/libmount.h.in ++++ b/libmount/src/libmount.h.in +@@ -452,6 +452,7 @@ extern int mnt_fs_get_option(struct libmnt_fs *fs, const char *name, + extern const char *mnt_fs_get_fs_options(struct libmnt_fs *fs); + extern const char *mnt_fs_get_vfs_options(struct libmnt_fs *fs); + extern const char *mnt_fs_get_user_options(struct libmnt_fs *fs); ++extern char *mnt_fs_get_vfs_options_all(struct libmnt_fs *fs); + + extern const char *mnt_fs_get_attributes(struct libmnt_fs *fs); + extern int mnt_fs_set_attributes(struct libmnt_fs *fs, const char *optstr); +diff --git a/libmount/src/libmount.sym b/libmount/src/libmount.sym +index ca16cafa1..636c564eb 100644 +--- a/libmount/src/libmount.sym ++++ b/libmount/src/libmount.sym +@@ -322,3 +322,7 @@ MOUNT_2.30 { + mnt_context_enable_rwonly_mount; + mnt_context_get_excode; + } MOUNT_2.28; ++ ++MOUNT_2_37 { ++ mnt_fs_get_vfs_options_all; ++} MOUNT_2.30; +diff --git a/misc-utils/findmnt.8 b/misc-utils/findmnt.8 +index 58dd38625..41a37cb5f 100644 +--- a/misc-utils/findmnt.8 ++++ b/misc-utils/findmnt.8 +@@ -249,6 +249,12 @@ It's possible to specify source (device) or target (mountpoint) to filter mount + .TP + .BR "\-\-verbose" + Force findmnt to print more information (\fB\-\-verify\fP only for now). ++.TP ++.B \-\-vfs-all ++When used with ++.BR VFS-OPTIONS ++column, print all VFS (fs-independent) flags. This option is designed for auditing purposes to ++list also default VFS kernel mount options which are normally not listed. + .SH EXAMPLES + .IP "\fBfindmnt \-\-fstab \-t nfs\fP" + Prints all NFS filesystems defined in +diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c +index 184b6f7d7..a7b3af4f4 100644 +--- a/misc-utils/findmnt.c ++++ b/misc-utils/findmnt.c +@@ -542,7 +542,10 @@ static char *get_data(struct libmnt_fs *fs, int num) + str = xstrdup(mnt_fs_get_options(fs)); + break; + case COL_VFS_OPTIONS: +- str = xstrdup(mnt_fs_get_vfs_options(fs)); ++ if (flags & FL_VFS_ALL) ++ str = mnt_fs_get_vfs_options_all(fs); ++ else if (mnt_fs_get_vfs_options(fs)) ++ str = xstrdup(mnt_fs_get_vfs_options(fs)); + break; + case COL_FS_OPTIONS: + str = xstrdup(mnt_fs_get_fs_options(fs)); +@@ -1243,6 +1246,7 @@ static void __attribute__((__noreturn__)) usage(void) + fputc('\n', out); + fputs(_(" -x, --verify verify mount table content (default is fstab)\n"), out); + fputs(_(" --verbose print more details\n"), out); ++ fputs(_(" --vfs-all print all VFS options\n"), out); + + fputs(USAGE_SEPARATOR, out); + printf(USAGE_HELP_OPTIONS(24)); +@@ -1271,8 +1275,9 @@ int main(int argc, char *argv[]) + struct libscols_table *table = NULL; + + enum { +- FINDMNT_OPT_VERBOSE = CHAR_MAX + 1, +- FINDMNT_OPT_TREE ++ FINDMNT_OPT_VERBOSE = CHAR_MAX + 1, ++ FINDMNT_OPT_TREE, ++ FINDMNT_OPT_VFS_ALL + }; + + static const struct option longopts[] = { +@@ -1313,6 +1318,7 @@ int main(int argc, char *argv[]) + { "version", no_argument, NULL, 'V' }, + { "verbose", no_argument, NULL, FINDMNT_OPT_VERBOSE }, + { "tree", no_argument, NULL, FINDMNT_OPT_TREE }, ++ { "vfs-all", no_argument, NULL, FINDMNT_OPT_VFS_ALL }, + { NULL, 0, NULL, 0 } + }; + +@@ -1479,6 +1485,9 @@ int main(int argc, char *argv[]) + case FINDMNT_OPT_TREE: + force_tree = 1; + break; ++ case FINDMNT_OPT_VFS_ALL: ++ flags |= FL_VFS_ALL; ++ break; + default: + errtryhelp(EXIT_FAILURE); + } +diff --git a/misc-utils/findmnt.h b/misc-utils/findmnt.h +index fbaa38e82..9a277b68a 100644 +--- a/misc-utils/findmnt.h ++++ b/misc-utils/findmnt.h +@@ -19,6 +19,8 @@ enum { + FL_STRICTTARGET = (1 << 15), + FL_VERBOSE = (1 << 16), + ++ FL_VFS_ALL = (1 << 19), ++ + /* basic table settings */ + FL_ASCII = (1 << 20), + FL_RAW = (1 << 21), +-- +2.31.1 + diff --git a/0059-nologin-Prevent-error-from-su-c.patch b/0059-nologin-Prevent-error-from-su-c.patch new file mode 100644 index 0000000..9dd8b4a --- /dev/null +++ b/0059-nologin-Prevent-error-from-su-c.patch @@ -0,0 +1,83 @@ +From ae227f0eb3500b49fb78623f51ec9bd4366346ef Mon Sep 17 00:00:00 2001 +From: Stanislav Brabec +Date: Thu, 10 Oct 2019 01:08:25 +0200 +Subject: [PATCH 59/63] nologin: Prevent error from su -c + +"su -c" can pass "-c" to nologin. It causes ugly error: + +su -c "echo OK" - man +-nologin: invalid option -- 'c' +Try '-nologin --help' for more information. + +Accept -c to prevent this error. + +Upstream: http://github.com/karelzak/util-linux/commit/a174eefb41a2ce8b467bb7e1546953c8bd1223dd +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1922299 +Signed-off-by: Josef Cejka +Signed-off-by: Stanislav Brabec +--- + login-utils/nologin.8 | 11 +++++++++-- + login-utils/nologin.c | 9 +++++++-- + 2 files changed, 16 insertions(+), 4 deletions(-) + +diff --git a/login-utils/nologin.8 b/login-utils/nologin.8 +index ee5948443..9389a86c6 100644 +--- a/login-utils/nologin.8 ++++ b/login-utils/nologin.8 +@@ -18,9 +18,16 @@ The exit code returned by + is always 1. + .PP + .SH OPTIONS +-.IP "\fB\-h, \-\-help\fP" ++ ++ ++.TP ++.IP "\fB\-c\fR, \fB\-\-command\fR \fIcommand\fR" ++Ignored. For compatibility with ++.I su -c "command" - user ++that would cause error otherwise. ++.IP "\fB\-h\fR, \fB\-\-help\fR" + Display help text and exit. +-.IP "\fB-V, \-\-version" ++.IP "\fB-V\fR, \fB\-\-version\fR" + Display version information and exit. + .SH NOTES + .B nologin +diff --git a/login-utils/nologin.c b/login-utils/nologin.c +index b0b6a721c..293f568c1 100644 +--- a/login-utils/nologin.c ++++ b/login-utils/nologin.c +@@ -30,7 +30,8 @@ static void __attribute__((__noreturn__)) usage(void) + fputs(_("Politely refuse a login.\n"), out); + + fputs(USAGE_OPTIONS, out); +- printf(USAGE_HELP_OPTIONS(16)); ++ fputs(_(" -c, --command does nothing (for compatibility with su -c)\n"), out); ++ printf(USAGE_HELP_OPTIONS(26)); + + printf(USAGE_MAN_TAIL("nologin(8)")); + exit(EXIT_FAILURE); +@@ -41,6 +42,7 @@ int main(int argc, char *argv[]) + int c, fd = -1; + struct stat st; + static const struct option longopts[] = { ++ { "command", required_argument, NULL, 'c' }, + { "help", 0, NULL, 'h' }, + { "version", 0, NULL, 'V' }, + { NULL, 0, NULL, 0 } +@@ -50,8 +52,11 @@ int main(int argc, char *argv[]) + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + +- while ((c = getopt_long(argc, argv, "hV", longopts, NULL)) != -1) { ++ while ((c = getopt_long(argc, argv, "c:hV", longopts, NULL)) != -1) { + switch (c) { ++ case 'c': ++ /* Ignore the command, just don't print unknown option error. */ ++ break; + case 'h': + usage(); + break; +-- +2.31.1 + diff --git a/0060-nologin-silently-ignore-well-known-shell-command-lin.patch b/0060-nologin-silently-ignore-well-known-shell-command-lin.patch new file mode 100644 index 0000000..03983d6 --- /dev/null +++ b/0060-nologin-silently-ignore-well-known-shell-command-lin.patch @@ -0,0 +1,124 @@ +From bfa7d299f8a497a835bc250bd765094ee06b8a01 Mon Sep 17 00:00:00 2001 +From: Sami Kerola +Date: Sun, 17 Nov 2019 08:33:04 +0000 +Subject: [PATCH 60/63] nologin: silently ignore well known shell command-line + options + +nologin is typically used in /etc/passwd as a shell replacement. Hence it +is reasonable to ignore well known command-line options silently to avoid +unwanted ugly error messages. + +Addresses: https://github.com/karelzak/util-linux/issues/895 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1922299 +Upstream: http://github.com/karelzak/util-linux/commit/beb61b07c20ab902fec883a4bd087c45d2742dea +Requested-by: Lennart Poettering +Signed-off-by: Sami Kerola +--- + login-utils/nologin.8 | 32 ++++++++++++++++++++++++-------- + login-utils/nologin.c | 33 ++++++++++++++++++++++++++++----- + 2 files changed, 52 insertions(+), 13 deletions(-) + +diff --git a/login-utils/nologin.8 b/login-utils/nologin.8 +index 9389a86c6..d3882e2b1 100644 +--- a/login-utils/nologin.8 ++++ b/login-utils/nologin.8 +@@ -1,4 +1,4 @@ +-.TH NOLOGIN 8 "September 2013" "util-linux" "System Administration" ++.TH NOLOGIN 8 "November 2019" "util-linux" "System Administration" + .SH NAME + nologin \- politely refuse a login + .SH SYNOPSIS +@@ -18,13 +18,29 @@ The exit code returned by + is always 1. + .PP + .SH OPTIONS +- +- +-.TP +-.IP "\fB\-c\fR, \fB\-\-command\fR \fIcommand\fR" +-Ignored. For compatibility with +-.I su -c "command" - user +-that would cause error otherwise. ++\fB\-c\fR, \fB\-\-command\fR \fIcommand\fR ++.br ++\fB\-\-init-file\fR ++.br ++\fB\-i\fR \fB\-\-interactive\fR ++.br ++\fB\-\-init-file\fR \fIfile\fR ++.br ++\fB\-i\fR, \fB\-\-interactive\fR ++.br ++\fB\-l\fR, \fB\-\-login\fR ++.br ++\fB\-\-noprofile\fR ++.br ++\fB\-\-norc\fR ++.br ++\fB\-\-posix\fR ++.br ++\fB\-\-rcfile\fR \fIfile\fR ++.br ++\fB\-r\fR, \fB\-\-restricted\fR ++.IP ++These shell command-line options are ignored to avoid nologin error. + .IP "\fB\-h\fR, \fB\-\-help\fR" + Display help text and exit. + .IP "\fB-V\fR, \fB\-\-version\fR" +diff --git a/login-utils/nologin.c b/login-utils/nologin.c +index 293f568c1..567a9a2ca 100644 +--- a/login-utils/nologin.c ++++ b/login-utils/nologin.c +@@ -41,10 +41,25 @@ int main(int argc, char *argv[]) + { + int c, fd = -1; + struct stat st; ++ enum { ++ OPT_INIT_FILE = CHAR_MAX + 1, ++ OPT_NOPROFILE, ++ OPT_NORC, ++ OPT_POSIX, ++ OPT_RCFILE ++ }; + static const struct option longopts[] = { +- { "command", required_argument, NULL, 'c' }, +- { "help", 0, NULL, 'h' }, +- { "version", 0, NULL, 'V' }, ++ { "command", required_argument, NULL, 'c' }, ++ { "init-file", required_argument, NULL, OPT_INIT_FILE }, ++ { "interactive", no_argument, NULL, 'i' }, ++ { "login", no_argument, NULL, 'l' }, ++ { "noprofile", no_argument, NULL, OPT_NOPROFILE }, ++ { "norc", no_argument, NULL, OPT_NORC }, ++ { "posix", no_argument, NULL, OPT_POSIX }, ++ { "rcfile", required_argument, NULL, OPT_RCFILE }, ++ { "restricted", no_argument, NULL, 'r' }, ++ { "help", no_argument, NULL, 'h' }, ++ { "version", no_argument, NULL, 'V' }, + { NULL, 0, NULL, 0 } + }; + +@@ -52,10 +67,18 @@ int main(int argc, char *argv[]) + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + +- while ((c = getopt_long(argc, argv, "c:hV", longopts, NULL)) != -1) { ++ while ((c = getopt_long(argc, argv, "c:ilrhV", longopts, NULL)) != -1) { + switch (c) { + case 'c': +- /* Ignore the command, just don't print unknown option error. */ ++ case OPT_INIT_FILE: ++ case 'i': ++ case 'l': ++ case OPT_NOPROFILE: ++ case OPT_NORC: ++ case OPT_POSIX: ++ case OPT_RCFILE: ++ case 'r': ++ /* Ignore well known shell command-line options */ + break; + case 'h': + usage(); +-- +2.31.1 + diff --git a/0061-libsmartcols-introduce-default-sort-column.patch b/0061-libsmartcols-introduce-default-sort-column.patch new file mode 100644 index 0000000..861d5b6 --- /dev/null +++ b/0061-libsmartcols-introduce-default-sort-column.patch @@ -0,0 +1,213 @@ +From 543e87865c5b9b7cb08ce8d55da1ef414154d213 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 24 Mar 2021 12:43:17 +0100 +Subject: [PATCH 61/63] libsmartcols: introduce default sort column + +* add default sort column, set by scols_sort_table() + +* sort tree according to default sort column also in scols_sort_table_by_tree() + +The function scols_sort_table() does not sort tree branches if tree +is not enabled. The function scols_sort_table_by_tree() does not care +if tree is enabled and it always follows parent->child relations. For +scols_sort_table_by_tree() we need to follow order in branches if +previously scols_sort_table() has been called. + +For example lsblk calls + + scols_sort_table(tb, cl); + scols_sort_table_by_tree(tb); + +for list-like output (for example lsblk -P) and users assume the +same order as for tree (lsblk --tree). + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1940607 +Upstream: http://github.com/karelzak/util-linux/commit/529b51706ef06611a8165023f14e6593e06901de +Signed-off-by: Karel Zak +--- + libsmartcols/src/smartcolsP.h | 3 ++ + libsmartcols/src/table.c | 60 ++++++++++++++++++++++++---------- + libsmartcols/src/table_print.c | 6 ++-- + misc-utils/lsblk.c | 6 ++-- + 4 files changed, 52 insertions(+), 23 deletions(-) + +diff --git a/libsmartcols/src/smartcolsP.h b/libsmartcols/src/smartcolsP.h +index 510e7a980..8037fb9f5 100644 +--- a/libsmartcols/src/smartcolsP.h ++++ b/libsmartcols/src/smartcolsP.h +@@ -160,6 +160,9 @@ struct libscols_table { + + struct list_head tb_columns; + struct list_head tb_lines; ++ ++ struct libscols_column *dflt_sort_column; /* default sort column, set by scols_sort_table() */ ++ + struct libscols_symbols *symbols; + struct libscols_cell title; /* optional table title (for humans) */ + +diff --git a/libsmartcols/src/table.c b/libsmartcols/src/table.c +index 979a09a39..bbabc0817 100644 +--- a/libsmartcols/src/table.c ++++ b/libsmartcols/src/table.c +@@ -224,6 +224,8 @@ int scols_table_remove_column(struct libscols_table *tb, + + if (cl->flags & SCOLS_FL_TREE) + tb->ntreecols--; ++ if (tb->dflt_sort_column == cl) ++ tb->dflt_sort_column = NULL; + + DBG(TAB, ul_debugobj(tb, "remove column")); + list_del_init(&cl->cl_columns); +@@ -1362,41 +1364,63 @@ static int sort_line_children(struct libscols_line *ln, struct libscols_column * + return 0; + } + ++static int __scols_sort_tree(struct libscols_table *tb, struct libscols_column *cl) ++{ ++ struct libscols_line *ln; ++ struct libscols_iter itr; ++ ++ if (!tb || !cl || !cl->cmpfunc) ++ return -EINVAL; ++ ++ scols_reset_iter(&itr, SCOLS_ITER_FORWARD); ++ while (scols_table_next_line(tb, &itr, &ln) == 0) ++ sort_line_children(ln, cl); ++ return 0; ++} ++ + /** + * scols_sort_table: + * @tb: table +- * @cl: order by this column ++ * @cl: order by this column or NULL + * + * Orders the table by the column. See also scols_column_set_cmpfunc(). If the + * tree output is enabled then children in the tree are recursively sorted too. + * ++ * The column @cl is saved as the default sort column to the @tb and the next time ++ * is possible to call scols_sort_table(tb, NULL). The saved column is also used by ++ * scols_sort_table_by_tree(). ++ * + * Returns: 0, a negative value in case of an error. + */ + int scols_sort_table(struct libscols_table *tb, struct libscols_column *cl) + { +- if (!tb || !cl || !cl->cmpfunc) ++ if (!tb) ++ return -EINVAL; ++ if (!cl) ++ cl = tb->dflt_sort_column; ++ if (!cl || !cl->cmpfunc) + return -EINVAL; + +- DBG(TAB, ul_debugobj(tb, "sorting table")); ++ DBG(TAB, ul_debugobj(tb, "sorting table by %zu column", cl->seqnum)); + list_sort(&tb->tb_lines, cells_cmp_wrapper_lines, cl); + +- if (scols_table_is_tree(tb)) { +- struct libscols_line *ln; +- struct libscols_iter itr; ++ if (scols_table_is_tree(tb)) ++ __scols_sort_tree(tb, cl); + +- scols_reset_iter(&itr, SCOLS_ITER_FORWARD); +- while (scols_table_next_line(tb, &itr, &ln) == 0) +- sort_line_children(ln, cl); +- } ++ if (cl && cl != tb->dflt_sort_column) ++ tb->dflt_sort_column = cl; + + return 0; + } + ++/* ++ * Move all @ln's children after @ln in the table. ++ */ + static struct libscols_line *move_line_and_children(struct libscols_line *ln, struct libscols_line *pre) + { + if (pre) { + list_del_init(&ln->ln_lines); /* remove from old position */ +- list_add(&ln->ln_lines, &pre->ln_lines); /* add to the new place (behind @pre) */ ++ list_add(&ln->ln_lines, &pre->ln_lines); /* add to the new place (after @pre) */ + } + pre = ln; + +@@ -1418,7 +1442,10 @@ static struct libscols_line *move_line_and_children(struct libscols_line *ln, st + * @tb: table + * + * Reorders lines in the table by parent->child relation. Note that order of +- * the lines in the table is independent on the tree hierarchy. ++ * the lines in the table is independent on the tree hierarchy by default. ++ * ++ * The children of the lines are sorted according to the default sort column ++ * if scols_sort_table() has been previously called. + * + * Since: 2.30 + * +@@ -1434,13 +1461,12 @@ int scols_sort_table_by_tree(struct libscols_table *tb) + + DBG(TAB, ul_debugobj(tb, "sorting table by tree")); + +- scols_reset_iter(&itr, SCOLS_ITER_FORWARD); +- while (scols_table_next_line(tb, &itr, &ln) == 0) { +- if (ln->parent) +- continue; ++ if (tb->dflt_sort_column) ++ __scols_sort_tree(tb, tb->dflt_sort_column); + ++ scols_reset_iter(&itr, SCOLS_ITER_FORWARD); ++ while (scols_table_next_line(tb, &itr, &ln) == 0) + move_line_and_children(ln, NULL); +- } + + return 0; + } +diff --git a/libsmartcols/src/table_print.c b/libsmartcols/src/table_print.c +index 8ecfc30e2..337dbbd84 100644 +--- a/libsmartcols/src/table_print.c ++++ b/libsmartcols/src/table_print.c +@@ -585,11 +585,9 @@ static int cell_to_buffer(struct libscols_table *tb, + + ce = scols_line_get_cell(ln, cl->seqnum); + data = ce ? scols_cell_get_data(ce) : NULL; +- if (!data) +- return 0; + + if (!scols_column_is_tree(cl)) +- return buffer_set_data(buf, data); ++ return data ? buffer_set_data(buf, data) : 0; + + /* + * Tree stuff +@@ -605,7 +603,7 @@ static int cell_to_buffer(struct libscols_table *tb, + buffer_set_art_index(buf); + } + +- if (!rc) ++ if (!rc && data) + rc = buffer_append_data(buf, data); + return rc; + } +diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c +index d0369d3e7..cc7894ecf 100644 +--- a/misc-utils/lsblk.c ++++ b/misc-utils/lsblk.c +@@ -1894,10 +1894,12 @@ int main(int argc, char *argv[]) + * /sys is no more sorted */ + lsblk->sort_id = COL_MAJMIN; + +- /* For --inverse --list we still follow parent->child relation */ +- if (lsblk->inverse && !(lsblk->flags & LSBLK_TREE)) ++ /* For --{inverse,raw,pairs} --list we still follow parent->child relation */ ++ if (!(lsblk->flags & LSBLK_TREE) ++ && (lsblk->inverse || lsblk->flags & LSBLK_EXPORT || lsblk->flags & LSBLK_RAW)) + lsblk->force_tree_order = 1; + ++ + if (lsblk->sort_id >= 0 && column_id_to_number(lsblk->sort_id) < 0) { + /* the sort column is not between output columns -- add as hidden */ + add_column(lsblk->sort_id); +-- +2.31.1 + diff --git a/0062-libmount-accept-another-flags-on-MS_REMOUNT-MS_BIND.patch b/0062-libmount-accept-another-flags-on-MS_REMOUNT-MS_BIND.patch new file mode 100644 index 0000000..5a02957 --- /dev/null +++ b/0062-libmount-accept-another-flags-on-MS_REMOUNT-MS_BIND.patch @@ -0,0 +1,120 @@ +From 8681757ee08361d78e4c74da8abae9d6df8623e7 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 28 May 2018 15:46:28 +0200 +Subject: [PATCH 62/63] libmount: accept another flags on MS_REMOUNT|MS_BIND + +The current libmount MS_REMOUNT|MS_BIND support is restricted to +MS_RDONLY (read-only bind mount). This is too restrictive as Linux +kernel supports bind-remount for arbitrary VFS flags. + +After this update you can use + + # mount /dev/sdc1 /mnt/A + # mount --bind -onosuid,noexec /mnt/A /mnt/B + + # findmnt /dev/sdc1 -oTARGET,SOURCE,FS-OPTIONS,VFS-OPTIONS + TARGET SOURCE FS-OPTIONS VFS-OPTIONS + /mnt/A /dev/sdc1 rw,stripe=512,data=ordered rw,relatime + /mnt/B /dev/sdc1 rw,stripe=512,data=ordered rw,nosuid,noexec,relatime + +The "mount --bind" is composed from two syscalls of course (1st is +bind, 2nd is bind,remount,nosuid,noexec). + +Addresses: https://github.com/karelzak/util-linux/issues/637 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1919529 +Upstream: http://github.com/karelzak/util-linux/commit/e82b77e9696a6dada96a7f3ea3ec20a63e8e7b9e +Signed-off-by: Karel Zak +--- + libmount/src/context_mount.c | 22 ++++++++-------------- + libmount/src/mountP.h | 3 +++ + sys-utils/mount.8 | 5 +++-- + 3 files changed, 14 insertions(+), 16 deletions(-) + +diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c +index a6de36178..b88e60507 100644 +--- a/libmount/src/context_mount.c ++++ b/libmount/src/context_mount.c +@@ -107,22 +107,16 @@ static int init_propagation(struct libmnt_context *cxt) + } + + /* +- * add additional mount(2) syscall request to implement "ro,bind", the first regular +- * mount(2) is the "bind" operation, the second is "remount,ro,bind" call. +- * +- * Note that we don't remove "ro" from the first syscall (kernel silently +- * ignores this flags for bind operation) -- maybe one day kernel will support +- * read-only binds in one step and then all will be done by the first mount(2) and the +- * second remount will be noop... ++ * add additional mount(2) syscall request to implement "bind,", the first regular ++ * mount(2) is the "bind" operation, the second is "remount,bind," call. + */ +-static int init_robind(struct libmnt_context *cxt) ++static int init_bind_remount(struct libmnt_context *cxt) + { + struct libmnt_addmount *ad; + int rc; + + assert(cxt); + assert(cxt->mountflags & MS_BIND); +- assert(cxt->mountflags & MS_RDONLY); + assert(!(cxt->mountflags & MS_REMOUNT)); + + DBG(CXT, ul_debugobj(cxt, "mount: initialize additional ro,bind mount")); +@@ -131,9 +125,9 @@ static int init_robind(struct libmnt_context *cxt) + if (!ad) + return -ENOMEM; + +- ad->mountflags = MS_REMOUNT | MS_BIND | MS_RDONLY; +- if (cxt->mountflags & MS_REC) +- ad->mountflags |= MS_REC; ++ ad->mountflags = cxt->mountflags; ++ ad->mountflags |= (MS_REMOUNT | MS_BIND); ++ + rc = mnt_context_append_additional_mount(cxt, ad); + if (rc) + return rc; +@@ -254,9 +248,9 @@ static int fix_optstr(struct libmnt_context *cxt) + return rc; + } + if ((cxt->mountflags & MS_BIND) +- && (cxt->mountflags & MS_RDONLY) ++ && (cxt->mountflags & MNT_BIND_SETTABLE) + && !(cxt->mountflags & MS_REMOUNT)) { +- rc = init_robind(cxt); ++ rc = init_bind_remount(cxt); + if (rc) + return rc; + } +diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h +index 52a238ef3..64a507e61 100644 +--- a/libmount/src/mountP.h ++++ b/libmount/src/mountP.h +@@ -363,6 +363,9 @@ struct libmnt_context + /* default flags */ + #define MNT_FL_DEFAULT 0 + ++/* Flags usable with MS_BIND|MS_REMOUNT */ ++#define MNT_BIND_SETTABLE (MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_NOATIME|MS_NODIRATIME|MS_RELATIME|MS_RDONLY) ++ + /* lock.c */ + extern int mnt_lock_use_simplelock(struct libmnt_lock *ml, int enable); + +diff --git a/sys-utils/mount.8 b/sys-utils/mount.8 +index a4d7de2c0..291e65cb1 100644 +--- a/sys-utils/mount.8 ++++ b/sys-utils/mount.8 +@@ -410,8 +410,9 @@ will be writable, but the + will be read-only. + + It's also possible to change nosuid, nodev, noexec, noatime, nodiratime and +-relatime VFS entry flags by "remount,bind" operation. It's impossible to change +-mount options recursively (for example with \fB-o rbind,ro\fR). ++relatime VFS entry flags by "remount,bind" operation. The another (for example ++filesystem specific flags) are silently ignored. It's impossible to change mount ++options recursively (for example with \fB-o rbind,ro\fR). + + .BR mount (8) + since v2.31 ignores the \fBbind\fR flag from +-- +2.31.1 + diff --git a/0063-libmount-improve-MS_REC-usage.patch b/0063-libmount-improve-MS_REC-usage.patch new file mode 100644 index 0000000..467f70b --- /dev/null +++ b/0063-libmount-improve-MS_REC-usage.patch @@ -0,0 +1,135 @@ +From 9f7fe1b83fcc508dc3e05815d03dbbb752a1cfba Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 1 Jun 2018 12:16:19 +0200 +Subject: [PATCH 63/63] libmount: improve MS_REC usage + +libmount allows to split one library (mount(8)) call to multiple mount(2) +syscalls, for example + + --rbind --make-rslave + +in this case we have to be careful with MS_REC because the flag is +applied to multiple operations. + + # strace -e mount mount --rbind --make-rslave /mnt/A /mnt/B + +Old version: + + mount("/mnt/A", "/mnt/B", 0x13ecac0, MS_MGC_VAL|MS_BIND, NULL) = 0 + mount("none", "/mnt/B", NULL, MS_REC|MS_SLAVE, NULL) = 0 + +Fixed version: + + mount("/mnt/A", "/mnt/B", 0x1f22ac0, MS_MGC_VAL|MS_BIND|MS_REC, NULL) = 0 + mount("none", "/mnt/B", NULL, MS_REC|MS_SLAVE, NULL) = 0 + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1946921 +Upstream: http://github.com/karelzak/util-linux/commit/816773b475900909d42c2c8282a6ac50252cac22 +Signed-off-by: Karel Zak +--- + libmount/src/context.c | 5 +++++ + libmount/src/context_mount.c | 25 ++++++++++++++++++++++--- + libmount/src/optstr.c | 9 ++++++--- + 3 files changed, 33 insertions(+), 6 deletions(-) + +diff --git a/libmount/src/context.c b/libmount/src/context.c +index e7f1ee934..8e00b75a9 100644 +--- a/libmount/src/context.c ++++ b/libmount/src/context.c +@@ -1375,6 +1375,11 @@ struct libmnt_lock *mnt_context_get_lock(struct libmnt_context *cxt) + * + * both of these calls have the same effect. + * ++ * Be careful if you want to use MS_REC flag -- in this case the bit is applied ++ * to all bind/slave/etc. options. If you want to mix more propadation flags ++ * and/or bind, move operations than it's better to specify mount options by ++ * strings. ++ * + * Returns: 0 on success, negative number in case of error. + */ + int mnt_context_set_mflags(struct libmnt_context *cxt, unsigned long flags) +diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c +index b88e60507..a8e84127c 100644 +--- a/libmount/src/context_mount.c ++++ b/libmount/src/context_mount.c +@@ -73,6 +73,7 @@ static int init_propagation(struct libmnt_context *cxt) + char *opts = (char *) mnt_fs_get_vfs_options(cxt->fs); + size_t namesz; + struct libmnt_optmap const *maps[1]; ++ int rec_count = 0; + + if (!opts) + return 0; +@@ -86,9 +87,19 @@ static int init_propagation(struct libmnt_context *cxt) + struct libmnt_addmount *ad; + int rc; + +- if (!mnt_optmap_get_entry(maps, 1, name, namesz, &ent) +- || !ent +- || !(ent->id & MS_PROPAGATION)) ++ if (!mnt_optmap_get_entry(maps, 1, name, namesz, &ent) || !ent) ++ continue; ++ ++ DBG(CXT, ul_debugobj(cxt, " checking %s", ent->name)); ++ ++ /* Note that MS_REC may be used for more flags, so we have to keep ++ * track about number of recursive options to keep the MS_REC in the ++ * mountflags if necessary. ++ */ ++ if (ent->id & MS_REC) ++ rec_count++; ++ ++ if (!(ent->id & MS_PROPAGATION)) + continue; + + ad = mnt_new_addmount(); +@@ -96,13 +107,21 @@ static int init_propagation(struct libmnt_context *cxt) + return -ENOMEM; + + ad->mountflags = ent->id; ++ DBG(CXT, ul_debugobj(cxt, " adding extra mount(2) call for %s", ent->name)); + rc = mnt_context_append_additional_mount(cxt, ad); + if (rc) + return rc; + ++ DBG(CXT, ul_debugobj(cxt, " removing %s from primary mount(2) call", ent->name)); + cxt->mountflags &= ~ent->id; ++ ++ if (ent->id & MS_REC) ++ rec_count--; + } + ++ if (rec_count) ++ cxt->mountflags |= MS_REC; ++ + return 0; + } + +diff --git a/libmount/src/optstr.c b/libmount/src/optstr.c +index 8248f0dee..cc077ffd9 100644 +--- a/libmount/src/optstr.c ++++ b/libmount/src/optstr.c +@@ -800,14 +800,17 @@ int mnt_optstr_apply_flags(char **optstr, unsigned long flags, + if (rc) + goto err; + } +- if (!(ent->mask & MNT_INVERT)) ++ if (!(ent->mask & MNT_INVERT)) { + fl &= ~ent->id; ++ if (ent->id & MS_REC) ++ fl |= MS_REC; ++ } + } + } + } + +- /* add missing options */ +- if (fl) { ++ /* add missing options (but ignore fl if contains MS_REC only) */ ++ if (fl && fl != MS_REC) { + const struct libmnt_optmap *ent; + char *p; + +-- +2.31.1 + diff --git a/0064-script-be-sensitive-to-another-SIGCHLD-ssi_codes.patch b/0064-script-be-sensitive-to-another-SIGCHLD-ssi_codes.patch new file mode 100644 index 0000000..943384e --- /dev/null +++ b/0064-script-be-sensitive-to-another-SIGCHLD-ssi_codes.patch @@ -0,0 +1,49 @@ +From 84009d2236c73efe7dc4b74372734d5b3306670b Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 5 Sep 2018 11:51:22 +0200 +Subject: [PATCH 64/72] script: be sensitive to another SIGCHLD ssi_codes + +The current signalfd handler cares on CLD_EXITED only. It's pretty +insufficient as there is more situations (and codes) when child no +more running. + +Addresses: https://github.com/karelzak/util-linux/issues/686 +Upstream: http://github.com/util-linux/util-linux/commit/27afe5016842c22d256ea9f88b598d637ca0df84 +Signed-off-by: Karel Zak +--- + term-utils/script.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/term-utils/script.c b/term-utils/script.c +index d5ffa27f1..ff5f808de 100644 +--- a/term-utils/script.c ++++ b/term-utils/script.c +@@ -402,10 +402,15 @@ static void handle_signal(struct script_control *ctl, int fd) + + switch (info.ssi_signo) { + case SIGCHLD: +- DBG(SIGNAL, ul_debug(" get signal SIGCHLD")); +- if (info.ssi_code == CLD_EXITED) { ++ DBG(SIGNAL, ul_debug(" get signal SIGCHLD [ssi_code=%d, ssi_status=%d]", ++ info.ssi_code, info.ssi_status)); ++ if (info.ssi_code == CLD_EXITED ++ || info.ssi_code == CLD_KILLED ++ || info.ssi_code == CLD_DUMPED) { + wait_for_child(ctl, 0); + ctl->poll_timeout = 10; ++ ++ /* In case of ssi_code is CLD_TRAPPED, CLD_STOPPED, or CLD_CONTINUED */ + } else if (info.ssi_status == SIGSTOP && ctl->child) { + DBG(SIGNAL, ul_debug(" child stop by SIGSTOP -- stop parent too")); + kill(getpid(), SIGSTOP); +@@ -433,6 +438,7 @@ static void handle_signal(struct script_control *ctl, int fd) + default: + abort(); + } ++ DBG(SIGNAL, ul_debug("signal handle on FD %d done", fd)); + } + + static void do_io(struct script_control *ctl) +-- +2.31.1 + diff --git a/0065-libfdisk-fix-partition-calculation-for-BLKPG_-ioctls.patch b/0065-libfdisk-fix-partition-calculation-for-BLKPG_-ioctls.patch new file mode 100644 index 0000000..bcf806c --- /dev/null +++ b/0065-libfdisk-fix-partition-calculation-for-BLKPG_-ioctls.patch @@ -0,0 +1,60 @@ +From be29de8b5dfe15972455d25e15068dc31d4376ac Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Wed, 6 May 2020 13:32:46 +0200 +Subject: [PATCH 65/72] libfdisk: fix partition calculation for BLKPG_* ioctls + +The include/partx.h interface we use in util-linux uses 512-byte +sectors, but libfdisk uses real sector sizes. + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2016229 +Upstream: http://github.com/util-linux/util-linux/commit/6a4d53ce6466fc97c0ee13846cd1bf7bdd7bfef0 +Signed-off-by: Karel Zak +--- + libfdisk/src/context.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c +index 779a9a889..fe7eb9e7e 100644 +--- a/libfdisk/src/context.c ++++ b/libfdisk/src/context.c +@@ -813,6 +813,7 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org) + struct fdisk_partition **rem = NULL, **add = NULL, **upd = NULL; + int change, rc = 0, err = 0; + size_t nparts, i, nadds = 0, nupds = 0, nrems = 0; ++ unsigned int ssf; + + DBG(CXT, ul_debugobj(cxt, "rereading changes")); + +@@ -845,6 +846,9 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org) + goto done; + } + ++ /* sector size factor -- used to recount from real to 512-byte sectors */ ++ ssf = cxt->sector_size / 512; ++ + for (i = 0; i < nrems; i++) { + pa = rem[i]; + DBG(PART, ul_debugobj(pa, "#%zu calling BLKPG_DEL_PARTITION", pa->partno)); +@@ -856,7 +860,8 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org) + for (i = 0; i < nupds; i++) { + pa = upd[i]; + DBG(PART, ul_debugobj(pa, "#%zu calling BLKPG_RESIZE_PARTITION", pa->partno)); +- if (partx_resize_partition(cxt->dev_fd, pa->partno + 1, pa->start, pa->size) != 0) { ++ if (partx_resize_partition(cxt->dev_fd, pa->partno + 1, ++ pa->start * ssf, pa->size * ssf) != 0) { + fdisk_warn(cxt, _("Failed to update system information about partition %zu"), pa->partno + 1); + err++; + } +@@ -864,7 +869,8 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org) + for (i = 0; i < nadds; i++) { + pa = add[i]; + DBG(PART, ul_debugobj(pa, "#%zu calling BLKPG_ADD_PARTITION", pa->partno)); +- if (partx_add_partition(cxt->dev_fd, pa->partno + 1, pa->start, pa->size) != 0) { ++ if (partx_add_partition(cxt->dev_fd, pa->partno + 1, ++ pa->start * ssf, pa->size * ssf) != 0) { + fdisk_warn(cxt, _("Failed to add partition %zu to system"), pa->partno + 1); + err++; + } +-- +2.31.1 + diff --git a/0066-libfdisk-fix-fdisk_reread_changes-for-extended-parti.patch b/0066-libfdisk-fix-fdisk_reread_changes-for-extended-parti.patch new file mode 100644 index 0000000..da0b864 --- /dev/null +++ b/0066-libfdisk-fix-fdisk_reread_changes-for-extended-parti.patch @@ -0,0 +1,48 @@ +From aecaffc55dd763c34f61937b2047f0aaaeb4e6fc Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Thu, 6 Aug 2020 11:32:33 +0200 +Subject: [PATCH 66/74] libfdisk: fix fdisk_reread_changes() for extended + partitions + +Linux kernel assumes only 1KiB extended partition to avoid overlapping +with nested logical partitions. We need to follow this rule for +BLKPG_ADD_PARTITION. + +Addresses: https://github.com/karelzak/util-linux/issues/1112 +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2041498 +Upstream: http://github.com/util-linux/util-linux/commit/33f50706fd7c1c5e53f8f355f12b685c6935f5a4 +Signed-off-by: Karel Zak +--- + libfdisk/src/context.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c +index fe7eb9e7e..114101980 100644 +--- a/libfdisk/src/context.c ++++ b/libfdisk/src/context.c +@@ -867,10 +867,21 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org) + } + } + for (i = 0; i < nadds; i++) { ++ uint64_t sz; ++ + pa = add[i]; ++ sz = pa->size * ssf; ++ + DBG(PART, ul_debugobj(pa, "#%zu calling BLKPG_ADD_PARTITION", pa->partno)); ++ ++ if (fdisk_is_label(cxt, DOS) && fdisk_partition_is_container(pa)) ++ /* Let's follow the Linux kernel and reduce ++ * DOS extended partition to 1 or 2 sectors. ++ */ ++ sz = min(sz, (uint64_t) 2); ++ + if (partx_add_partition(cxt->dev_fd, pa->partno + 1, +- pa->start * ssf, pa->size * ssf) != 0) { ++ pa->start * ssf, sz) != 0) { + fdisk_warn(cxt, _("Failed to add partition %zu to system"), pa->partno + 1); + err++; + } +-- +2.31.1 + diff --git a/0067-logger-fix-size-use-for-stdin.patch b/0067-logger-fix-size-use-for-stdin.patch new file mode 100644 index 0000000..987a4f9 --- /dev/null +++ b/0067-logger-fix-size-use-for-stdin.patch @@ -0,0 +1,76 @@ +From 7cc5bcfcb2340266a6b42370c9c4c02d8a325d5f Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Thu, 21 Oct 2021 18:47:40 +0200 +Subject: [PATCH 67/74] logger: fix --size use for stdin +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The stdin version counts log header into the message size, but +for example when it reads message from argv[] it counts only message +itself. + + $ logger --stderr --size 3 "abcd" + <13>Oct 21 18:48:29 kzak: abc + + $ echo "abcd" | logger --stderr --size 3 + logger: cannot allocate 18446744073709551597 bytes: Cannot allocate memory + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2011602 +Upstream: http://github.com/util-linux/util-linux/commit/58e4ee082bca100034791a4a74481f263bb30a25 +Signed-off-by: Karel Zak +--- + misc-utils/logger.c | 16 ++++------------ + 1 file changed, 4 insertions(+), 12 deletions(-) + +diff --git a/misc-utils/logger.c b/misc-utils/logger.c +index ebdc56ec2..c20ef05f1 100644 +--- a/misc-utils/logger.c ++++ b/misc-utils/logger.c +@@ -957,11 +957,9 @@ static void logger_stdin(struct logger_ctl *ctl) + * update header timestamps and to reflect possible priority changes. + * The initial header is generated by logger_open(). + */ +- int has_header = 1; + int default_priority = ctl->pri; + int last_pri = default_priority; +- size_t max_usrmsg_size = ctl->max_message_size - strlen(ctl->hdr); +- char *const buf = xmalloc(max_usrmsg_size + 2 + 2); ++ char *buf = xmalloc(ctl->max_message_size + 2 + 2); + int pri; + int c; + size_t i; +@@ -988,27 +986,21 @@ static void logger_stdin(struct logger_ctl *ctl) + ctl->pri = default_priority; + + if (ctl->pri != last_pri) { +- has_header = 0; +- max_usrmsg_size = +- ctl->max_message_size - strlen(ctl->hdr); ++ generate_syslog_header(ctl); + last_pri = ctl->pri; + } + if (c != EOF && c != '\n') + c = getchar(); + } + +- while (c != EOF && c != '\n' && i < max_usrmsg_size) { ++ while (c != EOF && c != '\n' && i < ctl->max_message_size) { + buf[i++] = c; + c = getchar(); + } + buf[i] = '\0'; + +- if (i > 0 || !ctl->skip_empty_lines) { +- if (!has_header) +- generate_syslog_header(ctl); ++ if (i > 0 || !ctl->skip_empty_lines) + write_output(ctl, buf); +- has_header = 0; +- } + + if (c == '\n') /* discard line terminator */ + c = getchar(); +-- +2.31.1 + diff --git a/0068-fstrim-improve-timer-setting.patch b/0068-fstrim-improve-timer-setting.patch new file mode 100644 index 0000000..0c4e534 --- /dev/null +++ b/0068-fstrim-improve-timer-setting.patch @@ -0,0 +1,32 @@ +From ebb628f8b6e9564c036fce152f67512e5755dcfc Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Mon, 6 Dec 2021 13:20:37 +0100 +Subject: [PATCH 68/74] fstrim: improve timer setting + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1916151 +Signed-off-by: Karel Zak +--- + sys-utils/fstrim.timer | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/sys-utils/fstrim.timer b/sys-utils/fstrim.timer +index 3a3762d5c..54b3c18f5 100644 +--- a/sys-utils/fstrim.timer ++++ b/sys-utils/fstrim.timer +@@ -1,11 +1,13 @@ + [Unit] + Description=Discard unused blocks once a week + Documentation=man:fstrim ++ConditionVirtualization=!container + + [Timer] + OnCalendar=weekly + AccuracySec=1h + Persistent=true ++RandomizedDelaySec=6000 + + [Install] + WantedBy=timers.target +-- +2.31.1 + diff --git a/0069-setpriv-implement-option-to-set-parent-death-signal.patch b/0069-setpriv-implement-option-to-set-parent-death-signal.patch new file mode 100644 index 0000000..a4806c2 --- /dev/null +++ b/0069-setpriv-implement-option-to-set-parent-death-signal.patch @@ -0,0 +1,185 @@ +From 0b421290e05862e1abbb5a82654bd2de9829dd58 Mon Sep 17 00:00:00 2001 +From: Patrick Steinhardt +Date: Tue, 10 Apr 2018 12:08:21 +0100 +Subject: [PATCH 69/74] setpriv: implement option to set parent death signal + +When a process uses the syscall `prctl(PR_SET_PDEATHSIG, ...)`, it will +get notified with a process-defined signal as soon as its parent process +dies. This is for example being used by unshare(1)'s recently added +"--kill-child" option, causing the forked child to be killed as soon as +unshare itself dies. + +Unfortunately, some LSMs will cause the parent death signal to be reset +when a process changes credentials, with the most important ones being +SELinux and AppArmor. The following command will thus not work as +expected: + + unshare --fork --kill-child setpriv --reuid user + +As soon as setpriv changes UID, the parent death signal is cleared and +the child will never get signalled when unshare gets killed. + +Add a new option "--pdeathsig keep|clear|". Setting this flag +will cause us to either + +- restore the previously active parent death signal as soon as the + setpriv has applied all credential changes +- clear the parent death signal +- set the parent death signal to "" + +Furthermore, print out the currently set signal when dumping process +state. + +[kzak@redhat.com: - small changes in codding style] + +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1894192 +Signed-off-by: Patrick Steinhardt +Signed-off-by: Karel Zak +--- + sys-utils/setpriv.1 | 6 ++++++ + sys-utils/setpriv.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 55 insertions(+) + +diff --git a/sys-utils/setpriv.1 b/sys-utils/setpriv.1 +index b900f6e08..f989bf33c 100644 +--- a/sys-utils/setpriv.1 ++++ b/sys-utils/setpriv.1 +@@ -139,6 +139,12 @@ is cleared by + .BR execve (2) + and is therefore not allowed. + .TP ++.BR "\-\-pdeathsig keep" | clear | ++Keep, clear or set the parent death signal. Some LSMs, most notably SELinux and ++AppArmor, clear the signal when the process' credentials change. Using ++\fB--pdeathsig keep\fR will restore the parent death signal after changing ++credentials to remedy that situation. ++.TP + .BI \-\-selinux\-label " label" + Request a particular SELinux transition (using a transition on exec, not + dyntrans). This will fail and cause +diff --git a/sys-utils/setpriv.c b/sys-utils/setpriv.c +index 4147978cc..0d3a3b3c9 100644 +--- a/sys-utils/setpriv.c ++++ b/sys-utils/setpriv.c +@@ -38,6 +38,7 @@ + #include "strutils.h" + #include "xalloc.h" + #include "pathnames.h" ++#include "signames.h" + + #ifndef PR_SET_NO_NEW_PRIVS + # define PR_SET_NO_NEW_PRIVS 38 +@@ -102,6 +103,8 @@ struct privctx { + + /* securebits */ + int securebits; ++ /* parent death signal (<0 clear, 0 nothing, >0 signal) */ ++ int pdeathsig; + + /* LSMs */ + const char *selinux_label; +@@ -135,6 +138,8 @@ static void __attribute__((__noreturn__)) usage(void) + fputs(_(" --init-groups initialize supplementary groups\n"), out); + fputs(_(" --groups set supplementary groups\n"), out); + fputs(_(" --securebits set securebits\n"), out); ++ fputs(_(" --pdeathsig keep|clear|\n" ++ " set or clear parent death signal\n"), out); + fputs(_(" --selinux-label