[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH for 7.1] linux-user: fix compat with glibc >= 2.36 sys/mount.
From: |
Richard W.M. Jones |
Subject: |
Re: [PATCH for 7.1] linux-user: fix compat with glibc >= 2.36 sys/mount.h |
Date: |
Tue, 2 Aug 2022 19:29:29 +0100 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Tue, Aug 02, 2022 at 12:41:34PM -0400, Daniel P. Berrangé wrote:
> The latest glibc 2.36 has extended sys/mount.h so that it
> defines the FSCONFIG_* enum constants. These are historically
> defined in linux/mount.h, and thus if you include both headers
> the compiler complains:
>
> In file included from /usr/include/linux/fs.h:19,
> from ../linux-user/syscall.c:98:
> /usr/include/linux/mount.h:95:6: error: redeclaration of 'enum
> fsconfig_command'
> 95 | enum fsconfig_command {
> | ^~~~~~~~~~~~~~~~
> In file included from ../linux-user/syscall.c:31:
> /usr/include/sys/mount.h:189:6: note: originally defined here
> 189 | enum fsconfig_command
> | ^~~~~~~~~~~~~~~~
> /usr/include/linux/mount.h:96:9: error: redeclaration of enumerator
> 'FSCONFIG_SET_FLAG'
> 96 | FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying
> no value */
> | ^~~~~~~~~~~~~~~~~
> /usr/include/sys/mount.h:191:3: note: previous definition of
> 'FSCONFIG_SET_FLAG' with type 'enum fsconfig_command'
> 191 | FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no
> value */
> | ^~~~~~~~~~~~~~~~~
> ...snip...
>
> QEMU doesn't include linux/mount.h, but it does use
> linux/fs.h and thus gets linux/mount.h indirectly.
>
> glibc acknowledges this problem but does not appear to
> be intending to fix it in the forseeable future, simply
> documenting it as a known incompatibility with no
> workaround:
>
>
> https://sourceware.org/glibc/wiki/Release/2.36#Usage_of_.3Clinux.2Fmount.h.3E_and_.3Csys.2Fmount.h.3E
> https://sourceware.org/glibc/wiki/Synchronizing_Headers
>
> To address this requires either removing use of sys/mount.h
> or linux/fs.h, despite QEMU needing declarations from
> both.
>
> This patch removes linux/fs.h, meaning we have to define
> various FS_IOC constants that are now unavailable.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
> linux-user/syscall.c | 18 ++++++++++++++++++
> meson.build | 2 ++
> 2 files changed, 20 insertions(+)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index b27a6552aa..52d178afe7 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -95,7 +95,25 @@
> #include <linux/soundcard.h>
> #include <linux/kd.h>
> #include <linux/mtio.h>
> +
> +#ifdef HAVE_SYS_MOUNT_FSCONFIG
> +/*
> + * glibc >= 2.36 linux/mount.h conflicts with sys/mount.h,
> + * which in turn prevents use of linux/fs.h. So we have to
> + * define the constants ourselves for now.
> + */
> +#define FS_IOC_GETFLAGS _IOR('f', 1, long)
> +#define FS_IOC_SETFLAGS _IOW('f', 2, long)
> +#define FS_IOC_GETVERSION _IOR('v', 1, long)
> +#define FS_IOC_SETVERSION _IOW('v', 2, long)
> +#define FS_IOC_FIEMAP _IOWR('f', 11, struct fiemap)
> +#define FS_IOC32_GETFLAGS _IOR('f', 1, int)
> +#define FS_IOC32_SETFLAGS _IOW('f', 2, int)
> +#define FS_IOC32_GETVERSION _IOR('v', 1, int)
> +#define FS_IOC32_SETVERSION _IOW('v', 2, int)
> +#else
> #include <linux/fs.h>
> +#endif
> #include <linux/fd.h>
> #if defined(CONFIG_FIEMAP)
> #include <linux/fiemap.h>
> diff --git a/meson.build b/meson.build
> index 294e9a8f32..30a380752c 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -1963,6 +1963,8 @@ config_host_data.set('HAVE_OPTRESET',
> cc.has_header_symbol('getopt.h', 'optreset'))
> config_host_data.set('HAVE_IPPROTO_MPTCP',
> cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
> +config_host_data.set('HAVE_SYS_MOUNT_FSCONFIG',
> + cc.has_header_symbol('sys/mount.h',
> 'FSCONFIG_SET_FLAG'))
>
> # has_member
> config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
Dan, which Fedora glibc package shows this problem? I have
glibc-2.35.9000-31.fc37.x86_64 and qemu compiled fine. (Also nbdkit
which includes linux/fs.h)
I see various other build failures in Koji, but not this one as far as
I can tell:
https://koji.fedoraproject.org/koji/packageinfo?packageID=3685
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
nbdkit - Flexible, fast NBD server with plugins
https://gitlab.com/nbdkit/nbdkit