--- /dev/null
+From c1115e1503bf955c97f4cf3b925a6a9f619764c3 Mon Sep 17 00:00:00 2001
+From: Christian Brauner <brauner@kernel.org>
+Date: Tue, 9 Aug 2022 16:14:25 +0200
+Subject: [PATCH] build: detect where struct mount_attr is declared
+
+Fixes: #4176
+Signed-off-by: Christian Brauner (Microsoft) <christian.brauner@ubuntu.com>
+[Retrieved from:
+https://github.com/lxc/lxc/commit/c1115e1503bf955c97f4cf3b925a6a9f619764c3]
+Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+---
+ 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(-)
+
+diff --git a/src/lxc/conf.c b/src/lxc/conf.c
+index ffbe74c2f6..4193cd07f5 100644
+--- a/src/lxc/conf.c
++++ b/src/lxc/conf.c
+@@ -2885,7 +2885,7 @@ static int __lxc_idmapped_mounts_child(struct lxc_handler *handler, FILE *f)
+ 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(struct lxc_handler *handler, FILE *f)
+
+ /* 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 lxc_handler *handler)
+
+ 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;
+
+diff --git a/src/lxc/conf.h b/src/lxc/conf.h
+index 7dc2f15b60..772479f9e1 100644
+--- 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;
+ };
+
+diff --git a/src/lxc/mount_utils.c b/src/lxc/mount_utils.c
+index bba75f933c..88dd73ee36 100644
+--- 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 char *path, int userns_fd,
+ {
+ __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 char *path_from, __u64 o_flags_from,
+ __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,
+diff --git a/src/lxc/syscall_wrappers.h b/src/lxc/syscall_wrappers.h
+index a5e98b565c..c8a7d0c7b7 100644
+--- 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 <sys/mount.h>
++#elif HAVE_UAPI_STRUCT_MOUNT_ATTR
++#include <linux/mount.h>
++#endif
++
+ #ifdef HAVE_LINUX_MEMFD_H
+ #include <linux/memfd.h>
+ #endif
+@@ -210,16 +216,18 @@ extern int fsmount(int fs_fd, unsigned int flags, unsigned int attr_flags);
+ /*
+ * 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);
+ }
+--- a/configure.ac 2022-11-21 22:26:58.649999866 +0100
++++ b/configure.ac 2022-11-21 23:13:32.826666552 +0100
+@@ -701,7 +701,8 @@
+ # Check for some syscalls functions
+ AC_CHECK_FUNCS([setns pivot_root sethostname unshare rand_r confstr faccessat gettid memfd_create move_mount open_tree execveat clone3 fsopen fspick fsconfig fsmount openat2 close_range statvfs mount_setattr sigdescr_np])
+ AC_CHECK_TYPES([__aligned_u64], [], [], [[#include <linux/types.h>]])
+-AC_CHECK_TYPES([struct mount_attr], [], [], [[#include <linux/mount.h>]])
++AC_CHECK_TYPES([struct mount_attr], [], [], [[#include <sys/mount.h>]])
++AC_CHECK_TYPES([struct mount_attr], AC_DEFINE(HAVE_UAPI_STRUCT_MOUNT_ATTR,1,[mount_attr from <linux/mount.h>]), [], [[#include <linux/mount.h>]])
+ AC_CHECK_TYPES([struct open_how], [], [], [[#include <linux/openat2.h>]])
+ AC_CHECK_TYPES([struct clone_args], [], [], [[#include <linux/sched.h>]])
+ AC_CHECK_MEMBERS([struct clone_args.set_tid],[],[],[[#include <linux/sched.h>]])