From ea78a116b4a80139990dbecc812c602201da13580e8ad991f84032a09cb37c67 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Tue, 16 Aug 2022 07:55:01 +0000 Subject: [PATCH] Accepting request 996255 from home:Andreas_Schwab:Factory - glibcextract-compile-c-snippet.patch: glibcextract.py: Add compile_c_snippet - sys-mount-kernel-definition.patch: linux: Mimic kernel definition for BLOCK_SIZE - sys-mount-usage.patch: linux: Fix sys/mount.h usage with kernel headers OBS-URL: https://build.opensuse.org/request/show/996255 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=624 --- glibc.changes | 9 + glibc.spec | 16 +- glibcextract-compile-c-snippet.patch | 50 ++++ sys-mount-kernel-definition.patch | 30 +++ sys-mount-usage.patch | 336 +++++++++++++++++++++++++++ 5 files changed, 438 insertions(+), 3 deletions(-) create mode 100644 glibcextract-compile-c-snippet.patch create mode 100644 sys-mount-kernel-definition.patch create mode 100644 sys-mount-usage.patch diff --git a/glibc.changes b/glibc.changes index 9547e99..47626d7 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Mon Aug 15 09:21:34 UTC 2022 - Andreas Schwab + +- glibcextract-compile-c-snippet.patch: glibcextract.py: Add + compile_c_snippet +- sys-mount-kernel-definition.patch: linux: Mimic kernel definition for + BLOCK_SIZE +- sys-mount-usage.patch: linux: Fix sys/mount.h usage with kernel headers + ------------------------------------------------------------------- Tue Aug 2 07:41:38 UTC 2022 - Andreas Schwab diff --git a/glibc.spec b/glibc.spec index 6bfede0..9b70dd7 100644 --- a/glibc.spec +++ b/glibc.spec @@ -148,11 +148,9 @@ Release: 0 %endif URL: https://www.gnu.org/software/libc/libc.html BuildRoot: %{_tmppath}/%{name}-%{version}-build -%if !%{build_snapshot} Source: https://ftp.gnu.org/pub/gnu/glibc/glibc-%{version}.tar.xz +%if !%{build_snapshot} Source1: https://ftp.gnu.org/pub/gnu/glibc/glibc-%{version}.tar.xz.sig -%else -Source: glibc-%{version}.tar.xz %endif Source2: http://savannah.gnu.org/project/memberlist-gpgkeys.php?group=libc&download=1#/glibc.keyring Source4: manpages.tar.bz2 @@ -281,6 +279,12 @@ Patch306: glibc-fix-double-loopback.diff ### # Patches from upstream ### +# PATCH-FIX-OPENSUSE glibcextract.py: Add compile_c_snippet +Patch1000: glibcextract-compile-c-snippet.patch +# PATCH-FIX-OPENSUSE linux: Mimic kernel definition for BLOCK_SIZE +Patch1001: sys-mount-kernel-definition.patch +# PATCH-FIX-OPENSUSE linux: Fix sys/mount.h usage with kernel headers +Patch1002: sys-mount-usage.patch ### # Patches awaiting upstream approval @@ -504,6 +508,12 @@ library in a cross compilation setting. %patch304 -p1 %patch306 -p1 +%if !%{build_snapshot} +%patch1000 -p1 +%patch1001 -p1 +%patch1002 -p1 +%endif + %patch2000 -p1 %patch2001 -p1 diff --git a/glibcextract-compile-c-snippet.patch b/glibcextract-compile-c-snippet.patch new file mode 100644 index 0000000..1f43365 --- /dev/null +++ b/glibcextract-compile-c-snippet.patch @@ -0,0 +1,50 @@ +From 841afa116e32b3c7195475769c26bf46fd870d32 Mon Sep 17 00:00:00 2001 +From: Adhemerval Zanella +Date: Wed, 10 Aug 2022 16:24:06 -0300 +Subject: [PATCH] glibcextract.py: Add compile_c_snippet + +It might be used on tests to check if a snippet build with the provided +compiler and flags. + +Reviewed-by: Florian Weimer +--- + scripts/glibcextract.py | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/scripts/glibcextract.py b/scripts/glibcextract.py +index 43ab58ffe2..36d204c9b0 100644 +--- a/scripts/glibcextract.py ++++ b/scripts/glibcextract.py +@@ -17,6 +17,7 @@ + # License along with the GNU C Library; if not, see + # . + ++import collections + import os.path + import re + import subprocess +@@ -173,3 +174,21 @@ def compare_macro_consts(source_1, source_2, cc, macro_re, exclude_re=None, + if not allow_extra_2: + ret = 1 + return ret ++ ++CompileResult = collections.namedtuple("CompileResult", "returncode output") ++ ++def compile_c_snippet(snippet, cc, extra_cc_args=''): ++ """Compile and return whether the SNIPPET can be build with CC along ++ EXTRA_CC_ARGS compiler flags. Return a CompileResult with RETURNCODE ++ being 0 for success, or the failure value and the compiler output. ++ """ ++ with tempfile.TemporaryDirectory() as temp_dir: ++ c_file_name = os.path.join(temp_dir, 'test.c') ++ obj_file_name = os.path.join(temp_dir, 'test.o') ++ with open(c_file_name, 'w') as c_file: ++ c_file.write(snippet + '\n') ++ cmd = cc.split() + extra_cc_args.split() + ['-c', '-o', obj_file_name, ++ c_file_name] ++ r = subprocess.run(cmd, check=False, stdout=subprocess.PIPE, ++ stderr=subprocess.STDOUT) ++ return CompileResult(r.returncode, r.stdout) +-- +2.37.2 + diff --git a/sys-mount-kernel-definition.patch b/sys-mount-kernel-definition.patch new file mode 100644 index 0000000..5468c43 --- /dev/null +++ b/sys-mount-kernel-definition.patch @@ -0,0 +1,30 @@ +From c68b6044bc7945716431f1adc091b17c39b80a06 Mon Sep 17 00:00:00 2001 +From: Adhemerval Zanella +Date: Wed, 10 Aug 2022 14:24:45 -0300 +Subject: [PATCH] linux: Mimic kernel defition for BLOCK_SIZE + +To avoid possible warnings if the kernel header is included before +sys/mount.h. + +Reviewed-by: Florian Weimer +--- + sysdeps/unix/sysv/linux/sys/mount.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sysdeps/unix/sysv/linux/sys/mount.h b/sysdeps/unix/sysv/linux/sys/mount.h +index f965986ba8..df6b0dbb42 100644 +--- a/sysdeps/unix/sysv/linux/sys/mount.h ++++ b/sysdeps/unix/sysv/linux/sys/mount.h +@@ -27,8 +27,8 @@ + #include + #include + +-#define BLOCK_SIZE 1024 + #define BLOCK_SIZE_BITS 10 ++#define BLOCK_SIZE (1< +Date: Wed, 10 Aug 2022 14:24:47 -0300 +Subject: [PATCH] linux: Fix sys/mount.h usage with kernel headers + +Now that kernel exports linux/mount.h and includes it on linux/fs.h, +its definitions might clash with glibc exports sys/mount.h. To avoid +the need to rearrange the Linux header to be always after glibc one, +the glibc sys/mount.h is changed to: + + 1. Undefine the macros also used as enum constants. This covers prior + inclusion of (for instance MS_RDONLY). + + 2. Include based on the usual __has_include check + (needs to use __has_include ("linux/mount.h") to paper over GCC + bugs. + + 3. Define enum fsconfig_command only if FSOPEN_CLOEXEC is not defined. + (FSOPEN_CLOEXEC should be a very close proxy.) + + 4. Define struct mount_attr if MOUNT_ATTR_SIZE_VER0 is not defined. + (Added in the same commit on the Linux side.) + +This patch also adds some tests to check if including linux/fs.h and +linux/mount.h after and before sys/mount.h does work. + +Checked on x86_64-linux-gnu. + +Reviewed-by: Florian Weimer +--- + sysdeps/unix/sysv/linux/Makefile | 8 +++ + sysdeps/unix/sysv/linux/sys/mount.h | 71 +++++++++++++++++--- + sysdeps/unix/sysv/linux/tst-mount-compile.py | 66 ++++++++++++++++++ + 3 files changed, 137 insertions(+), 8 deletions(-) + create mode 100755 sysdeps/unix/sysv/linux/tst-mount-compile.py + +diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile +index 3f31c19e4a..60e4cb1521 100644 +--- a/sysdeps/unix/sysv/linux/Makefile ++++ b/sysdeps/unix/sysv/linux/Makefile +@@ -265,6 +265,14 @@ $(objpfx)tst-mount-consts.out: ../sysdeps/unix/sysv/linux/tst-mount-consts.py + < /dev/null > $@ 2>&1; $(evaluate-test) + $(objpfx)tst-mount-consts.out: $(sysdeps-linux-python-deps) + ++tests-special += $(objpfx)tst-mount-compile.out ++$(objpfx)tst-mount-compile.out: ../sysdeps/unix/sysv/linux/tst-mount-compile.py ++ $(sysdeps-linux-python) \ ++ ../sysdeps/unix/sysv/linux/tst-mount-compile.py \ ++ $(sysdeps-linux-python-cc) \ ++ < /dev/null > $@ 2>&1; $(evaluate-test) ++$(objpfx)tst-mount-compile.out: $(sysdeps-linux-python-deps) ++ + tst-rseq-disable-ENV = GLIBC_TUNABLES=glibc.pthread.rseq=0 + + endif # $(subdir) == misc +diff --git a/sysdeps/unix/sysv/linux/sys/mount.h b/sysdeps/unix/sysv/linux/sys/mount.h +index df6b0dbb42..2e3fd6a7fe 100644 +--- a/sysdeps/unix/sysv/linux/sys/mount.h ++++ b/sysdeps/unix/sysv/linux/sys/mount.h +@@ -27,6 +27,13 @@ + #include + #include + ++#ifdef __has_include ++# if __has_include ("linux/mount.h") ++# include "linux/mount.h" ++# endif ++#endif ++ ++ + #define BLOCK_SIZE_BITS 10 + #define BLOCK_SIZE (1<. ++ ++import argparse ++import sys ++ ++import glibcextract ++ ++ ++def main(): ++ """The main entry point.""" ++ parser = argparse.ArgumentParser( ++ description='Check if glibc provided sys/mount.h can be ' ++ ' used along related kernel headers.') ++ parser.add_argument('--cc', metavar='CC', ++ help='C compiler (including options) to use') ++ args = parser.parse_args() ++ ++ if glibcextract.compile_c_snippet( ++ '#include ', ++ args.cc).returncode != 0: ++ sys.exit (77) ++ ++ def check(testname, snippet): ++ # Add -Werror to catch macro redefinitions and _ISOMAC to avoid ++ # internal glibc definitions. ++ r = glibcextract.compile_c_snippet(snippet, args.cc, ++ '-Werror -D_ISOMAC') ++ if r.returncode != 0: ++ print('error: test {}:\n{}'.format(testname, r.output.decode())) ++ return r.returncode ++ ++ status = max( ++ check("sys/mount.h + linux/mount.h", ++ "#include \n" ++ "#include "), ++ check("sys/mount.h + linux/fs.h", ++ "#include \n" ++ "#include "), ++ check("linux/mount.h + sys/mount.h", ++ "#include \n" ++ "#include "), ++ check("linux/fs.h + sys/mount.h", ++ "#include \n" ++ "#include ")) ++ sys.exit(status) ++ ++if __name__ == '__main__': ++ main() +-- +2.37.2 +