diff --git a/utils/lxc/patches/001-build-detect-where-struct-mount_attr-is-declared.patch b/utils/lxc/patches/001-build-detect-where-struct-mount_attr-is-declared.patch new file mode 100644 index 0000000000..89b52fc227 --- /dev/null +++ b/utils/lxc/patches/001-build-detect-where-struct-mount_attr-is-declared.patch @@ -0,0 +1,173 @@ +From c1115e1503bf955c97f4cf3b925a6a9f619764c3 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Tue, 9 Aug 2022 16:14:25 +0200 +Subject: build: detect where struct mount_attr is declared + +Fixes: #4176 +Signed-off-by: Christian Brauner (Microsoft) +--- + meson.build | 30 ++++++++++++++++++++++++++++-- + src/lxc/conf.c | 6 +++--- + src/lxc/conf.h | 2 +- + src/lxc/mount_utils.c | 6 +++--- + src/lxc/syscall_wrappers.h | 12 ++++++++++-- + 5 files changed, 45 insertions(+), 11 deletions(-) + +--- a/meson.build ++++ b/meson.build +@@ -589,7 +589,6 @@ decl_headers = ''' + foreach decl: [ + '__aligned_u64', + 'struct clone_args', +- 'struct mount_attr', + 'struct open_how', + 'struct rtnl_link_stats64', + ] +@@ -609,7 +608,6 @@ foreach tuple: [ + ['struct seccomp_notif_sizes'], + ['struct clone_args'], + ['__aligned_u64'], +- ['struct mount_attr'], + ['struct open_how'], + ['struct rtnl_link_stats64'], + ] +@@ -629,6 +627,34 @@ foreach tuple: [ + endif + endforeach + ++## Types. ++decl_headers = ''' ++#include ++''' ++ ++# We get -1 if the size cannot be determined ++if cc.sizeof('struct mount_attr', prefix: decl_headers, args: '-D_GNU_SOURCE') > 0 ++ srcconf.set10('HAVE_' + 'struct mount_attr'.underscorify().to_upper(), true) ++ found_types += 'struct mount_attr (sys/mount.h)' ++else ++ srcconf.set10('HAVE_' + 'struct mount_attr'.underscorify().to_upper(), false) ++ missing_types += 'struct mount_attr (sys/mount.h)' ++endif ++ ++## Types. ++decl_headers = ''' ++#include ++''' ++ ++# We get -1 if the size cannot be determined ++if cc.sizeof('struct mount_attr', prefix: decl_headers, args: '-D_GNU_SOURCE') > 0 ++ srcconf.set10('HAVE_UAPI_' + 'struct mount_attr'.underscorify().to_upper(), true) ++ found_types += 'struct mount_attr (linux/mount.h)' ++else ++ srcconf.set10('HAVE_UAPI_' + 'struct mount_attr'.underscorify().to_upper(), false) ++ missing_types += 'struct mount_attr (linux/mount.h)' ++endif ++ + ## Headers. + foreach ident: [ + ['bpf', '''#include +--- a/src/lxc/conf.c ++++ b/src/lxc/conf.c +@@ -2885,7 +2885,7 @@ static int __lxc_idmapped_mounts_child(s + struct lxc_mount_options opts = {}; + int dfd_from; + const char *source_relative, *target_relative; +- struct lxc_mount_attr attr = {}; ++ struct mount_attr attr = {}; + + ret = parse_lxc_mount_attrs(&opts, mntent.mnt_opts); + if (ret < 0) +@@ -3005,7 +3005,7 @@ static int __lxc_idmapped_mounts_child(s + + /* Set propagation mount options. */ + if (opts.attr.propagation) { +- attr = (struct lxc_mount_attr) { ++ attr = (struct mount_attr) { + .propagation = opts.attr.propagation, + }; + +@@ -4109,7 +4109,7 @@ int lxc_idmapped_mounts_parent(struct lx + + for (;;) { + __do_close int fd_from = -EBADF, fd_userns = -EBADF; +- struct lxc_mount_attr attr = {}; ++ struct mount_attr attr = {}; + struct lxc_mount_options opts = {}; + ssize_t ret; + +--- a/src/lxc/conf.h ++++ b/src/lxc/conf.h +@@ -223,7 +223,7 @@ struct lxc_mount_options { + unsigned long mnt_flags; + unsigned long prop_flags; + char *data; +- struct lxc_mount_attr attr; ++ struct mount_attr attr; + char *raw_options; + }; + +--- a/src/lxc/mount_utils.c ++++ b/src/lxc/mount_utils.c +@@ -31,7 +31,7 @@ lxc_log_define(mount_utils, lxc); + * setting in @attr_set, but must also specify MOUNT_ATTR__ATIME in the + * @attr_clr field. + */ +-static inline void set_atime(struct lxc_mount_attr *attr) ++static inline void set_atime(struct mount_attr *attr) + { + switch (attr->attr_set & MOUNT_ATTR__ATIME) { + case MOUNT_ATTR_RELATIME: +@@ -272,7 +272,7 @@ int create_detached_idmapped_mount(const + { + __do_close int fd_tree_from = -EBADF; + unsigned int open_tree_flags = OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC; +- struct lxc_mount_attr attr = { ++ struct mount_attr attr = { + .attr_set = MOUNT_ATTR_IDMAP | attr_set, + .attr_clr = attr_clr, + .userns_fd = userns_fd, +@@ -335,7 +335,7 @@ int __fd_bind_mount(int dfd_from, const + __u64 attr_clr, __u64 propagation, int userns_fd, + bool recursive) + { +- struct lxc_mount_attr attr = { ++ struct mount_attr attr = { + .attr_set = attr_set, + .attr_clr = attr_clr, + .propagation = propagation, +--- a/src/lxc/syscall_wrappers.h ++++ b/src/lxc/syscall_wrappers.h +@@ -18,6 +18,12 @@ + #include "macro.h" + #include "syscall_numbers.h" + ++#if HAVE_STRUCT_MOUNT_ATTR ++#include ++#elif HAVE_UAPI_STRUCT_MOUNT_ATTR ++#include ++#endif ++ + #ifdef HAVE_LINUX_MEMFD_H + #include + #endif +@@ -210,16 +216,18 @@ extern int fsmount(int fs_fd, unsigned i + /* + * mount_setattr() + */ +-struct lxc_mount_attr { ++#if !HAVE_STRUCT_MOUNT_ATTR && !HAVE_UAPI_STRUCT_MOUNT_ATTR ++struct mount_attr { + __u64 attr_set; + __u64 attr_clr; + __u64 propagation; + __u64 userns_fd; + }; ++#endif + + #if !HAVE_MOUNT_SETATTR + static inline int mount_setattr(int dfd, const char *path, unsigned int flags, +- struct lxc_mount_attr *attr, size_t size) ++ struct mount_attr *attr, size_t size) + { + return syscall(__NR_mount_setattr, dfd, path, flags, attr, size); + } diff --git a/utils/lxc/patches/002-build-detect-sys-pidfd.h-availability.patch b/utils/lxc/patches/002-build-detect-sys-pidfd.h-availability.patch new file mode 100644 index 0000000000..677c08fc2e --- /dev/null +++ b/utils/lxc/patches/002-build-detect-sys-pidfd.h-availability.patch @@ -0,0 +1,47 @@ +From ef1e0607b82e27350c2d677d649c6a0a9693fd40 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Tue, 9 Aug 2022 16:27:40 +0200 +Subject: build: detect sys/pidfd.h availability + +Fixes: #4176 +Signed-off-by: Christian Brauner (Microsoft) +--- + meson.build | 1 + + src/lxc/process_utils.h | 6 ++++++ + 2 files changed, 7 insertions(+) + +--- a/meson.build ++++ b/meson.build +@@ -734,6 +734,7 @@ foreach tuple: [ + ['sys/resource.h'], + ['sys/memfd.h'], + ['sys/personality.h'], ++ ['sys/pidfd.h'], + ['sys/signalfd.h'], + ['sys/timerfd.h'], + ['pty.h'], +--- a/src/lxc/process_utils.h ++++ b/src/lxc/process_utils.h +@@ -15,6 +15,10 @@ + #include + #include + ++#if HAVE_SYS_PIDFD_H ++#include ++#endif ++ + #include "compiler.h" + #include "syscall_numbers.h" + +@@ -136,9 +140,11 @@ + #endif + + /* waitid */ ++#if !HAVE_SYS_PIDFD_H + #ifndef P_PIDFD + #define P_PIDFD 3 + #endif ++#endif + + #ifndef CLONE_ARGS_SIZE_VER0 + #define CLONE_ARGS_SIZE_VER0 64 /* sizeof first published struct */ diff --git a/utils/lxc/patches/003-build-check-for-FS_CONFIG_-header-symbol-in-sys-moun.patch b/utils/lxc/patches/003-build-check-for-FS_CONFIG_-header-symbol-in-sys-moun.patch new file mode 100644 index 0000000000..20d4069492 --- /dev/null +++ b/utils/lxc/patches/003-build-check-for-FS_CONFIG_-header-symbol-in-sys-moun.patch @@ -0,0 +1,143 @@ +From cbabe8abf11e7e7fb49c123bae31efdd9bc8f1e8 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Tue, 9 Aug 2022 17:19:40 +0200 +Subject: build: check for FS_CONFIG_* header symbol in sys/mount.h + +Fixes: #4176 +Signed-off-by: Christian Brauner (Microsoft) +--- + meson.build | 59 +++++++++++++++++++++++++++++++++++++++++-- + src/lxc/mount_utils.h | 16 ++++++++++++ + 2 files changed, 73 insertions(+), 2 deletions(-) + +--- a/meson.build ++++ b/meson.build +@@ -638,8 +638,7 @@ if cc.sizeof('struct mount_attr', prefix + found_types += 'struct mount_attr (sys/mount.h)' + else + srcconf.set10('HAVE_' + 'struct mount_attr'.underscorify().to_upper(), false) +- missing_types += 'struct mount_attr (sys/mount.h)' +-endif ++ missing_types += 'struct mount_attr (sys/mount.h)' endif + + ## Types. + decl_headers = ''' +@@ -655,6 +654,62 @@ else + missing_types += 'struct mount_attr (linux/mount.h)' + endif + ++if cc.has_header_symbol('sys/mount.h', 'FSCONFIG_SET_FLAG') ++ srcconf.set10('HAVE_' + 'FSCONFIG_SET_FLAG'.underscorify().to_upper(), true) ++ found_types += 'FSCONFIG_SET_FLAG' ++else ++ srcconf.set10('HAVE_' + 'FSCONFIG_SET_FLAG'.underscorify().to_upper(), false) ++ missing_types += 'FSCONFIG_SET_FLAG' ++endif ++ ++if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_STRING') ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_STRING'.underscorify().to_upper(), true) ++ found_types += 'FS_CONFIG_SET_STRING' ++else ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_STRING'.underscorify().to_upper(), false) ++ missing_types += 'FS_CONFIG_SET_STRING' ++endif ++ ++if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_BINARY') ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_BINARY'.underscorify().to_upper(), true) ++ found_types += 'FS_CONFIG_SET_BINARY' ++else ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_BINARY'.underscorify().to_upper(), false) ++ missing_types += 'FS_CONFIG_SET_BINARY' ++endif ++ ++if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_PATH_EMPTY') ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_PATH_EMPTY'.underscorify().to_upper(), true) ++ found_types += 'FS_CONFIG_SET_PATH_EMPTY' ++else ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_PATH_EMPTY'.underscorify().to_upper(), false) ++ missing_types += 'FS_CONFIG_SET_PATH_EMPTY' ++endif ++ ++if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_PATH_FD') ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_PATH_FD'.underscorify().to_upper(), true) ++ found_types += 'FS_CONFIG_SET_PATH_FD' ++else ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_PATH_FD'.underscorify().to_upper(), false) ++ missing_types += 'FS_CONFIG_SET_PATH_FD' ++endif ++ ++if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_CMD_CREATE') ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_CMD_CREATE'.underscorify().to_upper(), true) ++ found_types += 'FS_CONFIG_SET_CMD_CREATE' ++else ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_CMD_CREATE'.underscorify().to_upper(), false) ++ missing_types += 'FS_CONFIG_SET_CMD_CREATE' ++endif ++ ++if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_CMD_RECONFIGURE') ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_CMD_RECONFIGURE'.underscorify().to_upper(), true) ++ found_types += 'FS_CONFIG_SET_CMD_RECONFIGURE' ++else ++ srcconf.set10('HAVE_' + 'FS_CONFIG_SET_CMD_RECONFIGURE'.underscorify().to_upper(), false) ++ missing_types += 'FS_CONFIG_SET_CMD_RECONFIGURE' ++endif ++ + ## Headers. + foreach ident: [ + ['bpf', '''#include +--- a/src/lxc/mount_utils.h ++++ b/src/lxc/mount_utils.h +@@ -82,37 +82,53 @@ struct lxc_rootfs; + #endif + + /* fsconfig() commands */ ++#if !HAVE_FSCONFIG_SET_FLAG + #ifndef FSCONFIG_SET_FLAG + #define FSCONFIG_SET_FLAG 0 /* Set parameter, supplying no value */ + #endif ++#endif + ++#if !HAVE_FSCONFIG_SET_STRING + #ifndef FSCONFIG_SET_STRING + #define FSCONFIG_SET_STRING 1 /* Set parameter, supplying a string value */ + #endif ++#endif + ++#if !HAVE_FSCONFIG_SET_BINARY + #ifndef FSCONFIG_SET_BINARY + #define FSCONFIG_SET_BINARY 2 /* Set parameter, supplying a binary blob value */ + #endif ++#endif + ++#if !HAVE_FSCONFIG_SET_PATH + #ifndef FSCONFIG_SET_PATH + #define FSCONFIG_SET_PATH 3 /* Set parameter, supplying an object by path */ + #endif ++#endif + ++#if !HAVE_FSCONFIG_SET_PATH_EMPTY + #ifndef FSCONFIG_SET_PATH_EMPTY + #define FSCONFIG_SET_PATH_EMPTY 4 /* Set parameter, supplying an object by (empty) path */ + #endif ++#endif + ++#if !HAVE_FSCONFIG_SET_FD + #ifndef FSCONFIG_SET_FD + #define FSCONFIG_SET_FD 5 /* Set parameter, supplying an object by fd */ + #endif ++#endif + ++#if !HAVE_FSCONFIG_CMD_CREATE + #ifndef FSCONFIG_CMD_CREATE + #define FSCONFIG_CMD_CREATE 6 /* Invoke superblock creation */ + #endif ++#endif + ++#if !FSCONFIG_CMD_RECONFIGURE + #ifndef FSCONFIG_CMD_RECONFIGURE + #define FSCONFIG_CMD_RECONFIGURE 7 /* Invoke superblock reconfiguration */ + #endif ++#endif + + /* fsmount() flags */ + #ifndef FSMOUNT_CLOEXEC diff --git a/utils/lxc/patches/011-tree-wide-wipe-direct-or-indirect-linux-mount.h-incl.patch b/utils/lxc/patches/011-tree-wide-wipe-direct-or-indirect-linux-mount.h-incl.patch new file mode 100644 index 0000000000..eb190018b9 --- /dev/null +++ b/utils/lxc/patches/011-tree-wide-wipe-direct-or-indirect-linux-mount.h-incl.patch @@ -0,0 +1,197 @@ +From 4771699fd97b1e9ee7dc4f7cfe01c8ddd698f682 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Wed, 10 Aug 2022 11:42:52 +0200 +Subject: tree-wide: wipe direct or indirect linux/mount.h inclusion + +It is incompatible with sys/mount.h and causes massive headaches. + +Signed-off-by: Christian Brauner (Microsoft) +--- + meson.build | 44 +++++++++++++------------------------- + src/lxc/macro.h | 13 +++++++++++ + src/lxc/mount_utils.h | 2 +- + src/lxc/syscall_wrappers.h | 9 ++------ + src/lxc/utils.c | 2 -- + 5 files changed, 31 insertions(+), 39 deletions(-) + +--- a/meson.build ++++ b/meson.build +@@ -627,7 +627,6 @@ foreach tuple: [ + endif + endforeach + +-## Types. + decl_headers = ''' + #include + ''' +@@ -640,74 +639,61 @@ else + srcconf.set10('HAVE_' + 'struct mount_attr'.underscorify().to_upper(), false) + missing_types += 'struct mount_attr (sys/mount.h)' endif + +-## Types. +-decl_headers = ''' +-#include +-''' +- +-# We get -1 if the size cannot be determined +-if cc.sizeof('struct mount_attr', prefix: decl_headers, args: '-D_GNU_SOURCE') > 0 +- srcconf.set10('HAVE_UAPI_' + 'struct mount_attr'.underscorify().to_upper(), true) +- found_types += 'struct mount_attr (linux/mount.h)' +-else +- srcconf.set10('HAVE_UAPI_' + 'struct mount_attr'.underscorify().to_upper(), false) +- missing_types += 'struct mount_attr (linux/mount.h)' +-endif +- ++## Check if sys/mount.h defines the fsconfig commands + if cc.has_header_symbol('sys/mount.h', 'FSCONFIG_SET_FLAG') + srcconf.set10('HAVE_' + 'FSCONFIG_SET_FLAG'.underscorify().to_upper(), true) +- found_types += 'FSCONFIG_SET_FLAG' ++ found_types += 'FSCONFIG_SET_FLAG (sys/mount.h)' + else + srcconf.set10('HAVE_' + 'FSCONFIG_SET_FLAG'.underscorify().to_upper(), false) +- missing_types += 'FSCONFIG_SET_FLAG' ++ missing_types += 'FSCONFIG_SET_FLAG (sys/mount.h)' + endif + + if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_STRING') + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_STRING'.underscorify().to_upper(), true) +- found_types += 'FS_CONFIG_SET_STRING' ++ found_types += 'FS_CONFIG_SET_STRING (sys/mount.h)' + else + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_STRING'.underscorify().to_upper(), false) +- missing_types += 'FS_CONFIG_SET_STRING' ++ missing_types += 'FS_CONFIG_SET_STRING (sys/mount.h)' + endif + + if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_BINARY') + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_BINARY'.underscorify().to_upper(), true) +- found_types += 'FS_CONFIG_SET_BINARY' ++ found_types += 'FS_CONFIG_SET_BINARY (sys/mount.h)' + else + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_BINARY'.underscorify().to_upper(), false) +- missing_types += 'FS_CONFIG_SET_BINARY' ++ missing_types += 'FS_CONFIG_SET_BINARY (sys/mount.h)' + endif + + if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_PATH_EMPTY') + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_PATH_EMPTY'.underscorify().to_upper(), true) +- found_types += 'FS_CONFIG_SET_PATH_EMPTY' ++ found_types += 'FS_CONFIG_SET_PATH_EMPTY (sys/mount.h)' + else + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_PATH_EMPTY'.underscorify().to_upper(), false) +- missing_types += 'FS_CONFIG_SET_PATH_EMPTY' ++ missing_types += 'FS_CONFIG_SET_PATH_EMPTY (sys/mount.h)' + endif + + if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_PATH_FD') + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_PATH_FD'.underscorify().to_upper(), true) +- found_types += 'FS_CONFIG_SET_PATH_FD' ++ found_types += 'FS_CONFIG_SET_PATH_FD (sys/mount.h)' + else + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_PATH_FD'.underscorify().to_upper(), false) +- missing_types += 'FS_CONFIG_SET_PATH_FD' ++ missing_types += 'FS_CONFIG_SET_PATH_FD (sys/mount.h)' + endif + + if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_CMD_CREATE') + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_CMD_CREATE'.underscorify().to_upper(), true) +- found_types += 'FS_CONFIG_SET_CMD_CREATE' ++ found_types += 'FS_CONFIG_SET_CMD_CREAT (sys/mount.h)' + else + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_CMD_CREATE'.underscorify().to_upper(), false) +- missing_types += 'FS_CONFIG_SET_CMD_CREATE' ++ missing_types += 'FS_CONFIG_SET_CMD_CREATE (sys/mount.h)' + endif + + if cc.has_header_symbol('sys/mount.h', 'FS_CONFIG_SET_CMD_RECONFIGURE') + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_CMD_RECONFIGURE'.underscorify().to_upper(), true) +- found_types += 'FS_CONFIG_SET_CMD_RECONFIGURE' ++ found_types += 'FS_CONFIG_SET_CMD_RECONFIGURE (sys/mount.h)' + else + srcconf.set10('HAVE_' + 'FS_CONFIG_SET_CMD_RECONFIGURE'.underscorify().to_upper(), false) +- missing_types += 'FS_CONFIG_SET_CMD_RECONFIGURE' ++ missing_types += 'FS_CONFIG_SET_CMD_RECONFIGURE (sys/mount.h)' + endif + + ## Headers. +--- a/src/lxc/macro.h ++++ b/src/lxc/macro.h +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -812,4 +813,16 @@ static inline bool is_set(__u32 bit, __u + + #define BIT(nr) (1UL << (nr)) + ++#ifndef FS_IOC_GETFLAGS ++#define FS_IOC_GETFLAGS _IOR('f', 1, long) ++#endif ++ ++#ifndef FS_IOC_SETFLAGS ++#define FS_IOC_SETFLAGS _IOW('f', 2, long) ++#endif ++ ++#ifndef FS_IMMUTABLE_FL ++#define FS_IMMUTABLE_FL 0x00000010 /* Immutable file */ ++#endif ++ + #endif /* __LXC_MACRO_H */ +--- a/src/lxc/mount_utils.h ++++ b/src/lxc/mount_utils.h +@@ -124,7 +124,7 @@ struct lxc_rootfs; + #endif + #endif + +-#if !FSCONFIG_CMD_RECONFIGURE ++#if !HAVE_FSCONFIG_CMD_RECONFIGURE + #ifndef FSCONFIG_CMD_RECONFIGURE + #define FSCONFIG_CMD_RECONFIGURE 7 /* Invoke superblock reconfiguration */ + #endif +--- a/src/lxc/syscall_wrappers.h ++++ b/src/lxc/syscall_wrappers.h +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -18,12 +19,6 @@ + #include "macro.h" + #include "syscall_numbers.h" + +-#if HAVE_STRUCT_MOUNT_ATTR +-#include +-#elif HAVE_UAPI_STRUCT_MOUNT_ATTR +-#include +-#endif +- + #ifdef HAVE_LINUX_MEMFD_H + #include + #endif +@@ -216,7 +211,7 @@ extern int fsmount(int fs_fd, unsigned i + /* + * mount_setattr() + */ +-#if !HAVE_STRUCT_MOUNT_ATTR && !HAVE_UAPI_STRUCT_MOUNT_ATTR ++#if !HAVE_STRUCT_MOUNT_ATTR + struct mount_attr { + __u64 attr_set; + __u64 attr_clr; +--- a/src/lxc/utils.c ++++ b/src/lxc/utils.c +@@ -19,8 +19,6 @@ + #include + #include + #include +-/* Needs to be after sys/mount.h header */ +-#include + #include + #include + #include diff --git a/utils/lxc/patches/012-tree-wide-use-struct-clone_args-directly.patch b/utils/lxc/patches/012-tree-wide-use-struct-clone_args-directly.patch new file mode 100644 index 0000000000..7ab536e9b7 --- /dev/null +++ b/utils/lxc/patches/012-tree-wide-use-struct-clone_args-directly.patch @@ -0,0 +1,99 @@ +From 63468abd3287ebd5cc4ed9205334217031049fb4 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Wed, 10 Aug 2022 12:03:54 +0200 +Subject: tree-wide: use struct clone_args directly + +Signed-off-by: Christian Brauner (Microsoft) +--- + meson.build | 1 - + src/lxc/process_utils.c | 2 +- + src/lxc/process_utils.h | 7 ++++--- + src/lxc/start.c | 2 +- + src/lxc/start.h | 1 - + src/tests/reboot.c | 2 -- + 6 files changed, 6 insertions(+), 9 deletions(-) + +--- a/meson.build ++++ b/meson.build +@@ -582,7 +582,6 @@ decl_headers = ''' + #include + #include + #include +-#include + #include + ''' + +--- a/src/lxc/process_utils.c ++++ b/src/lxc/process_utils.c +@@ -90,7 +90,7 @@ __returns_twice pid_t lxc_raw_legacy_clo + __returns_twice pid_t lxc_raw_clone(unsigned long flags, int *pidfd) + { + pid_t pid; +- struct lxc_clone_args args = { ++ struct clone_args args = { + .flags = flags, + .pidfd = ptr_to_u64(pidfd), + }; +--- a/src/lxc/process_utils.h ++++ b/src/lxc/process_utils.h +@@ -5,7 +5,6 @@ + + #include "config.h" + +-#include + #include + #include + #include +@@ -165,7 +164,8 @@ + #define u64_to_ptr(x) ((void *)(uintptr_t)x) + #endif + +-struct lxc_clone_args { ++#if !HAVE_STRUCT_CLONE_ARGS ++struct clone_args { + __aligned_u64 flags; + __aligned_u64 pidfd; + __aligned_u64 child_tid; +@@ -178,8 +178,9 @@ struct lxc_clone_args { + __aligned_u64 set_tid_size; + __aligned_u64 cgroup; + }; ++#endif + +-__returns_twice static inline pid_t lxc_clone3(struct lxc_clone_args *args, size_t size) ++__returns_twice static inline pid_t lxc_clone3(struct clone_args *args, size_t size) + { + return syscall(__NR_clone3, args, size); + } +--- a/src/lxc/start.c ++++ b/src/lxc/start.c +@@ -1673,7 +1673,7 @@ static int lxc_spawn(struct lxc_handler + } else { + int cgroup_fd = -EBADF; + +- struct lxc_clone_args clone_args = { ++ struct clone_args clone_args = { + .flags = handler->clone_flags, + .pidfd = ptr_to_u64(&handler->pidfd), + .exit_signal = SIGCHLD, +--- a/src/lxc/start.h ++++ b/src/lxc/start.h +@@ -5,7 +5,6 @@ + + #include "config.h" + +-#include + #include + #include + #include +--- a/src/tests/reboot.c ++++ b/src/tests/reboot.c +@@ -32,8 +32,6 @@ + + #include "namespace.h" + +-#include +-#include + #include + + int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...); diff --git a/utils/lxc/patches/013-tree-wide-use-struct-open_how-directly.patch b/utils/lxc/patches/013-tree-wide-use-struct-open_how-directly.patch new file mode 100644 index 0000000000..cbcd081400 --- /dev/null +++ b/utils/lxc/patches/013-tree-wide-use-struct-open_how-directly.patch @@ -0,0 +1,112 @@ +From 133aa416ca2a5996090ec0e697e253646364d274 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Wed, 10 Aug 2022 12:18:49 +0200 +Subject: tree-wide: use struct open_how directly + +Signed-off-by: Christian Brauner (Microsoft) +--- + meson.build | 2 -- + src/lxc/file_utils.c | 2 +- + src/lxc/mount_utils.c | 8 ++++---- + src/lxc/syscall_wrappers.h | 6 ++++-- + src/lxc/utils.c | 2 +- + 5 files changed, 10 insertions(+), 10 deletions(-) + +--- a/meson.build ++++ b/meson.build +@@ -579,9 +579,7 @@ decl_headers = ''' + #include + #include + #include +-#include + #include +-#include + #include + ''' + +--- a/src/lxc/file_utils.c ++++ b/src/lxc/file_utils.c +@@ -652,7 +652,7 @@ int open_at(int dfd, const char *path, u + unsigned int resolve_flags, mode_t mode) + { + __do_close int fd = -EBADF; +- struct lxc_open_how how = { ++ struct open_how how = { + .flags = o_flags, + .mode = mode, + .resolve = resolve_flags, +--- a/src/lxc/mount_utils.c ++++ b/src/lxc/mount_utils.c +@@ -186,7 +186,7 @@ int fs_prepare(const char *fs_name, + int fd_from; + + if (!is_empty_string(path_from)) { +- struct lxc_open_how how = { ++ struct open_how how = { + .flags = o_flags_from, + .resolve = resolve_flags_from, + }; +@@ -237,7 +237,7 @@ int fs_attach(int fd_fs, + int fd_to, ret; + + if (!is_empty_string(path_to)) { +- struct lxc_open_how how = { ++ struct open_how how = { + .flags = o_flags_to, + .resolve = resolve_flags_to, + }; +@@ -308,7 +308,7 @@ int move_detached_mount(int dfd_from, in + int fd_to, ret; + + if (!is_empty_string(path_to)) { +- struct lxc_open_how how = { ++ struct open_how how = { + .flags = o_flags_to, + .resolve = resolve_flags_to, + }; +@@ -348,7 +348,7 @@ int __fd_bind_mount(int dfd_from, const + set_atime(&attr); + + if (!is_empty_string(path_from)) { +- struct lxc_open_how how = { ++ struct open_how how = { + .flags = o_flags_from, + .resolve = resolve_flags_from, + }; +--- a/src/lxc/syscall_wrappers.h ++++ b/src/lxc/syscall_wrappers.h +@@ -240,11 +240,13 @@ static inline int mount_setattr(int dfd, + * @mode: O_CREAT/O_TMPFILE file mode. + * @resolve: RESOLVE_* flags. + */ +-struct lxc_open_how { ++#if !HAVE_STRUCT_OPEN_HOW ++struct open_how { + __u64 flags; + __u64 mode; + __u64 resolve; + }; ++#endif + + /* how->resolve flags for openat2(2). */ + #ifndef RESOLVE_NO_XDEV +@@ -296,7 +298,7 @@ struct lxc_open_how { + #define PROTECT_OPEN_RW (O_CLOEXEC | O_NOCTTY | O_RDWR | O_NOFOLLOW) + + #if !HAVE_OPENAT2 +-static inline int openat2(int dfd, const char *filename, struct lxc_open_how *how, size_t size) ++static inline int openat2(int dfd, const char *filename, struct open_how *how, size_t size) + { + return syscall(__NR_openat2, dfd, filename, how, size); + } +--- a/src/lxc/utils.c ++++ b/src/lxc/utils.c +@@ -1095,7 +1095,7 @@ int __safe_mount_beneath_at(int beneath_ + unsigned int flags, const void *data) + { + __do_close int source_fd = -EBADF, target_fd = -EBADF; +- struct lxc_open_how how = { ++ struct open_how how = { + .flags = PROTECT_OPATH_DIRECTORY, + .resolve = PROTECT_LOOKUP_BENEATH_WITH_MAGICLINKS, + };