From 8704ee74b59409d096c109393b35254ea31c8f74340b4b1c6cc487c3f611d3f3 Mon Sep 17 00:00:00 2001 From: Michael Chang Date: Thu, 5 Aug 2021 02:21:26 +0000 Subject: [PATCH] Accepting request 910108 from home:pevik:branches:Base:System - Replace grub2-use-stat-instead-of-udevadm-for-partition-lookup.patch and fix-grub2-use-stat-instead-of-udevadm-for-partition-lookup-with-new-glibc.patch with upstream backport: 0001-osdep-Introduce-include-grub-osdep-major.h-and-use-i.patch and 0002-osdep-linux-hostdisk-Use-stat-instead-of-udevadm-for.patch. OBS-URL: https://build.opensuse.org/request/show/910108 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=388 --- ...include-grub-osdep-major.h-and-use-i.patch | 158 ++++++++++++++++++ ...disk-Use-stat-instead-of-udevadm-for.patch | 98 +++++++++++ ...-for-partition-lookup-with-new-glibc.patch | 17 -- ...tead-of-udevadm-for-partition-lookup.patch | 32 ---- grub2.changes | 9 + grub2.spec | 4 +- 6 files changed, 267 insertions(+), 51 deletions(-) create mode 100644 0001-osdep-Introduce-include-grub-osdep-major.h-and-use-i.patch create mode 100644 0002-osdep-linux-hostdisk-Use-stat-instead-of-udevadm-for.patch delete mode 100644 fix-grub2-use-stat-instead-of-udevadm-for-partition-lookup-with-new-glibc.patch delete mode 100644 grub2-use-stat-instead-of-udevadm-for-partition-lookup.patch diff --git a/0001-osdep-Introduce-include-grub-osdep-major.h-and-use-i.patch b/0001-osdep-Introduce-include-grub-osdep-major.h-and-use-i.patch new file mode 100644 index 0000000..f40af92 --- /dev/null +++ b/0001-osdep-Introduce-include-grub-osdep-major.h-and-use-i.patch @@ -0,0 +1,158 @@ +From e94b4f23277f7572aacbbeae50b8927e03be148a Mon Sep 17 00:00:00 2001 +From: Petr Vorel +Date: Thu, 15 Jul 2021 17:35:27 +0200 +Subject: [PATCH 1/2] osdep: Introduce include/grub/osdep/major.h and use it + +... to factor out fix for glibc 2.25 introduced in 7a5b301e3 (build: Use +AC_HEADER_MAJOR to find device macros). + +Note: Once glibc 2.25 is old enough and this fix is not needed also +AC_HEADER_MAJOR in configure.ac should be removed. + +Signed-off-by: Petr Vorel +Reviewed-by: Daniel Kiper +[ upstream status: e94b4f232 ("osdep: Introduce include/grub/osdep/major.h and use it") ] +--- + configure.ac | 2 +- + grub-core/osdep/devmapper/getroot.c | 7 +----- + grub-core/osdep/devmapper/hostdisk.c | 7 +----- + grub-core/osdep/linux/getroot.c | 7 +----- + grub-core/osdep/unix/getroot.c | 7 +----- + include/grub/osdep/major.h | 33 ++++++++++++++++++++++++++++ + 6 files changed, 38 insertions(+), 25 deletions(-) + create mode 100644 include/grub/osdep/major.h + +diff --git a/configure.ac b/configure.ac +index b025e1e84..bee28dbeb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -424,7 +424,7 @@ AC_CHECK_HEADERS(sys/param.h sys/mount.h sys/mnttab.h limits.h) + + # glibc 2.25 still includes sys/sysmacros.h in sys/types.h but emits deprecation + # warning which causes compilation failure later with -Werror. So use -Werror here +-# as well to force proper sys/sysmacros.h detection. ++# as well to force proper sys/sysmacros.h detection. Used in include/grub/osdep/major.h. + SAVED_CFLAGS="$CFLAGS" + CFLAGS="$HOST_CFLAGS -Werror" + AC_HEADER_MAJOR +diff --git a/grub-core/osdep/devmapper/getroot.c b/grub-core/osdep/devmapper/getroot.c +index a13a39c96..9ba5c9865 100644 +--- a/grub-core/osdep/devmapper/getroot.c ++++ b/grub-core/osdep/devmapper/getroot.c +@@ -40,12 +40,7 @@ + #include + #endif + +-#if defined(MAJOR_IN_MKDEV) +-#include +-#elif defined(MAJOR_IN_SYSMACROS) +-#include +-#endif +- ++#include + #include + + #include +diff --git a/grub-core/osdep/devmapper/hostdisk.c b/grub-core/osdep/devmapper/hostdisk.c +index a8afc0c94..c8053728b 100644 +--- a/grub-core/osdep/devmapper/hostdisk.c ++++ b/grub-core/osdep/devmapper/hostdisk.c +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -24,12 +25,6 @@ + #include + #include + +-#if defined(MAJOR_IN_MKDEV) +-#include +-#elif defined(MAJOR_IN_SYSMACROS) +-#include +-#endif +- + #ifdef HAVE_DEVICE_MAPPER + # include + +diff --git a/grub-core/osdep/linux/getroot.c b/grub-core/osdep/linux/getroot.c +index 001b818fe..cd588588e 100644 +--- a/grub-core/osdep/linux/getroot.c ++++ b/grub-core/osdep/linux/getroot.c +@@ -35,12 +35,7 @@ + #include + #endif + +-#if defined(MAJOR_IN_MKDEV) +-#include +-#elif defined(MAJOR_IN_SYSMACROS) +-#include +-#endif +- ++#include + #include + #include /* ioctl */ + #include +diff --git a/grub-core/osdep/unix/getroot.c b/grub-core/osdep/unix/getroot.c +index 46d7116c6..74f69116d 100644 +--- a/grub-core/osdep/unix/getroot.c ++++ b/grub-core/osdep/unix/getroot.c +@@ -51,12 +51,7 @@ + #endif /* ! FLOPPY_MAJOR */ + #endif + +-#include +-#if defined(MAJOR_IN_MKDEV) +-#include +-#elif defined(MAJOR_IN_SYSMACROS) +-#include +-#endif ++#include + + #if defined(HAVE_LIBZFS) && defined(HAVE_LIBNVPAIR) + # include +diff --git a/include/grub/osdep/major.h b/include/grub/osdep/major.h +new file mode 100644 +index 000000000..84a9159af +--- /dev/null ++++ b/include/grub/osdep/major.h +@@ -0,0 +1,33 @@ ++/* ++ * GRUB -- GRand Unified Bootloader ++ * Copyright (C) 2021 Free Software Foundation, Inc. ++ * ++ * GRUB 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 3 of the License, or ++ * (at your option) any later version. ++ * ++ * GRUB 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. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with GRUB. If not, see . ++ * ++ * Fix for glibc 2.25 which is deprecating the namespace pollution of ++ * sys/types.h injecting major(), minor(), and makedev() into the ++ * compilation environment. ++ */ ++ ++#ifndef GRUB_OSDEP_MAJOR_H ++#define GRUB_OSDEP_MAJOR_H 1 ++ ++#include ++ ++#ifdef MAJOR_IN_MKDEV ++# include ++#elif defined (MAJOR_IN_SYSMACROS) ++# include ++#endif ++#endif /* GRUB_OSDEP_MAJOR_H */ +-- +2.32.0 + diff --git a/0002-osdep-linux-hostdisk-Use-stat-instead-of-udevadm-for.patch b/0002-osdep-linux-hostdisk-Use-stat-instead-of-udevadm-for.patch new file mode 100644 index 0000000..a5ec7f2 --- /dev/null +++ b/0002-osdep-linux-hostdisk-Use-stat-instead-of-udevadm-for.patch @@ -0,0 +1,98 @@ +From 1ea4e5ef09c06552402bf676ce262a661372f08d Mon Sep 17 00:00:00 2001 +From: Jeff Mahoney +Date: Thu, 15 Jul 2021 17:35:28 +0200 +Subject: [PATCH 2/2] osdep/linux/hostdisk: Use stat() instead of udevadm for + partition lookup + +The sysfs_partition_path() calls udevadm to resolve the sysfs path for +a block device. That can be accomplished by stating the device node +and using the major/minor to follow the symlinks in /sys/dev/block/. + +This cuts the execution time of grub-mkconfig to somewhere near 55% on +system without LVM (which uses libdevmapper instead sysfs_partition_path()). + +Remove udevadm call as it does not help us more than calling stat() directly. + +Signed-off-by: Jeff Mahoney +Signed-off-by: Petr Vorel +Reviewed-by: Daniel Kiper +[ upstream status: 1ea4e5ef0 ("osdep/linux/hostdisk: Use stat() instead of udevadm for partition lookup") +--- + grub-core/osdep/linux/hostdisk.c | 52 ++++---------------------------- + 1 file changed, 6 insertions(+), 46 deletions(-) + +diff --git a/grub-core/osdep/linux/hostdisk.c b/grub-core/osdep/linux/hostdisk.c +index da62f924e..d3326d095 100644 +--- a/grub-core/osdep/linux/hostdisk.c ++++ b/grub-core/osdep/linux/hostdisk.c +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -98,54 +99,13 @@ grub_util_get_fd_size_os (grub_util_fd_t fd, const char *name, unsigned *log_sec + static char * + sysfs_partition_path (const char *dev, const char *entry) + { +- const char *argv[7]; +- int fd; +- pid_t pid; +- FILE *udevadm; +- char *buf = NULL; +- size_t len = 0; +- char *path = NULL; +- +- argv[0] = "udevadm"; +- argv[1] = "info"; +- argv[2] = "--query"; +- argv[3] = "path"; +- argv[4] = "--name"; +- argv[5] = dev; +- argv[6] = NULL; +- +- pid = grub_util_exec_pipe (argv, &fd); +- +- if (!pid) +- return NULL; +- +- /* Parent. Read udevadm's output. */ +- udevadm = fdopen (fd, "r"); +- if (!udevadm) +- { +- grub_util_warn (_("Unable to open stream from %s: %s"), +- "udevadm", strerror (errno)); +- close (fd); +- goto out; +- } +- +- if (getline (&buf, &len, udevadm) > 0) +- { +- char *newline; +- +- newline = strchr (buf, '\n'); +- if (newline) +- *newline = '\0'; +- path = xasprintf ("/sys%s/%s", buf, entry); +- } ++ struct stat st; + +-out: +- if (udevadm) +- fclose (udevadm); +- waitpid (pid, NULL, 0); +- free (buf); ++ if (stat (dev, &st) == 0 && S_ISBLK (st.st_mode)) ++ return xasprintf ("/sys/dev/block/%u:%u/%s", ++ major (st.st_rdev), minor (st.st_rdev), entry); + +- return path; ++ return NULL; + } + + static int +-- +2.32.0 + diff --git a/fix-grub2-use-stat-instead-of-udevadm-for-partition-lookup-with-new-glibc.patch b/fix-grub2-use-stat-instead-of-udevadm-for-partition-lookup-with-new-glibc.patch deleted file mode 100644 index 55e4d43..0000000 --- a/fix-grub2-use-stat-instead-of-udevadm-for-partition-lookup-with-new-glibc.patch +++ /dev/null @@ -1,17 +0,0 @@ -Index: grub-2.02~rc1/grub-core/osdep/linux/hostdisk.c -=================================================================== ---- grub-2.02~rc1.orig/grub-core/osdep/linux/hostdisk.c -+++ grub-2.02~rc1/grub-core/osdep/linux/hostdisk.c -@@ -45,6 +45,12 @@ - #include - #include - -+#if defined(MAJOR_IN_MKDEV) -+#include -+#elif defined(MAJOR_IN_SYSMACROS) -+#include -+#endif -+ - # include /* ioctl */ - # include - # ifndef BLKFLSBUF diff --git a/grub2-use-stat-instead-of-udevadm-for-partition-lookup.patch b/grub2-use-stat-instead-of-udevadm-for-partition-lookup.patch deleted file mode 100644 index 5b226b6..0000000 --- a/grub2-use-stat-instead-of-udevadm-for-partition-lookup.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Jeff Mahoney -Subject: grub2: use stat instead of udevadm for partition lookup -References: bnc#883635 - -sysfs_partition_path calls udevadm to resolve the sysfs path for -a block device. That can be accomplished by stating the device node -and using the major/minor to follow the symlinks in /sys/dev/block/. - -This cuts the execution time of grub2-mkconfig from 10s to 2s on -my system. - -Signed-off-by: Jeff Mahoney ---- - grub-core/osdep/linux/hostdisk.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - ---- a/grub-core/osdep/linux/hostdisk.c -+++ b/grub-core/osdep/linux/hostdisk.c -@@ -105,6 +106,13 @@ sysfs_partition_path (const char *dev, c - char *buf = NULL; - size_t len = 0; - char *path = NULL; -+ struct stat st; -+ int ret; -+ -+ ret = stat(dev, &st); -+ if (ret == 0 && S_ISBLK(st.st_mode)) -+ return xasprintf ("/sys/dev/block/%u:%u/%s", -+ major (st.st_rdev), minor (st.st_rdev), entry); - - argv[0] = "udevadm"; - argv[1] = "info"; diff --git a/grub2.changes b/grub2.changes index 3b84671..f736b5f 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Thu Jul 22 16:43:20 UTC 2021 - Petr Vorel + +- Replace grub2-use-stat-instead-of-udevadm-for-partition-lookup.patch and + fix-grub2-use-stat-instead-of-udevadm-for-partition-lookup-with-new-glibc.patch + with upstream backport: + 0001-osdep-Introduce-include-grub-osdep-major.h-and-use-i.patch and + 0002-osdep-linux-hostdisk-Use-stat-instead-of-udevadm-for.patch. + ------------------------------------------------------------------- Mon Jun 28 10:14:26 UTC 2021 - Michael Chang diff --git a/grub2.spec b/grub2.spec index 11005f2..b7091ce 100644 --- a/grub2.spec +++ b/grub2.spec @@ -257,8 +257,8 @@ Patch212: grub2-install-remove-useless-check-PReP-partition-is-empty.patch Patch213: grub2-Fix-incorrect-netmask-on-ppc64.patch Patch215: grub2-ppc64-cas-new-scope.patch Patch218: grub2-ppc64-cas-fix-double-free.patch -Patch233: grub2-use-stat-instead-of-udevadm-for-partition-lookup.patch -Patch234: fix-grub2-use-stat-instead-of-udevadm-for-partition-lookup-with-new-glibc.patch +Patch233: 0001-osdep-Introduce-include-grub-osdep-major.h-and-use-i.patch +Patch234: 0002-osdep-linux-hostdisk-Use-stat-instead-of-udevadm-for.patch Patch236: grub2-efi_gop-avoid-low-resolution.patch # Support HTTP Boot IPv4 and IPv6 (fate#320129) Patch281: 0002-net-read-bracketed-ipv6-addrs-and-port-numbers.patch