From: Christian Brauner Date: Wed, 17 Mar 2021 09:54:19 +0000 (+0100) Subject: mount_utils: add support for mount_setattr() syscall X-Git-Tag: lxc-5.0.0~197^2~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=031e0285faa150d1e2f80ab3315a1095d26e7992;p=thirdparty%2Flxc.git mount_utils: add support for mount_setattr() syscall Signed-off-by: Christian Brauner --- diff --git a/configure.ac b/configure.ac index 64d10eb3d..361a9cf83 100644 --- a/configure.ac +++ b/configure.ac @@ -652,8 +652,9 @@ AC_CHECK_HEADER([ifaddrs.h], AC_HEADER_MAJOR # 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]) +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]) AC_CHECK_TYPES([__aligned_u64], [], [], [[#include ]]) +AC_CHECK_TYPES([struct mount_attr], [], [], [[#include ]]) AC_CHECK_TYPES([struct open_how], [], [], [[#include ]]) AC_CHECK_TYPES([struct clone_args], [], [], [[#include ]]) AC_CHECK_MEMBERS([struct clone_args.set_tid],[],[],[[#include ]]) diff --git a/src/lxc/mount_utils.h b/src/lxc/mount_utils.h index d38581d9b..5053ebfea 100644 --- a/src/lxc/mount_utils.h +++ b/src/lxc/mount_utils.h @@ -152,6 +152,10 @@ #define MOUNT_ATTR_NODIRATIME 0x00000080 /* Do not update directory access times */ #endif +#ifndef MOUNT_ATTR_IDMAP +#define MOUNT_ATTR_IDMAP 0x00100000 +#endif + __hidden extern int mnt_attributes_new(unsigned int old_flags, unsigned int *new_flags); __hidden extern int mnt_attributes_old(unsigned int new_flags, unsigned int *old_flags); diff --git a/src/lxc/syscall_numbers.h b/src/lxc/syscall_numbers.h index 0bc5efe3d..063316de3 100644 --- a/src/lxc/syscall_numbers.h +++ b/src/lxc/syscall_numbers.h @@ -680,4 +680,24 @@ #endif #endif +#ifndef __NR_mount_setattr + #if defined __alpha__ + #define __NR_mount_setattr 552 + #elif defined _MIPS_SIM + #if _MIPS_SIM == _MIPS_SIM_ABI32 /* o32 */ + #define __NR_mount_setattr (442 + 4000) + #endif + #if _MIPS_SIM == _MIPS_SIM_NABI32 /* n32 */ + #define __NR_mount_setattr (442 + 6000) + #endif + #if _MIPS_SIM == _MIPS_SIM_ABI64 /* n64 */ + #define __NR_mount_setattr (442 + 5000) + #endif + #elif defined __ia64__ + #define __NR_mount_setattr (442 + 1024) + #else + #define __NR_mount_setattr 442 + #endif +#endif + #endif /* __LXC_SYSCALL_NUMBERS_H */ diff --git a/src/lxc/syscall_wrappers.h b/src/lxc/syscall_wrappers.h index c1a861e2f..718821147 100644 --- a/src/lxc/syscall_wrappers.h +++ b/src/lxc/syscall_wrappers.h @@ -208,6 +208,24 @@ static inline int fsmount_lxc(int fs_fd, unsigned int flags, unsigned int attr_f extern int fsmount(int fs_fd, unsigned int flags, unsigned int attr_flags); #endif +/* + * mount_setattr() + */ +struct lxc_mount_attr { + __u64 attr_set; + __u64 attr_clr; + __u64 propagation; + __u64 userns_fd; +}; + +#ifndef HAVE_MOUNT_SETATTR +static inline int mount_setattr(int dfd, const char *path, unsigned int flags, + struct lxc_mount_attr *attr, size_t size) +{ + return syscall(__NR_mount_setattr, dfd, path, flags, attr, size); +} +#endif + /* * Arguments for how openat2(2) should open the target path. If only @flags and * @mode are non-zero, then openat2(2) operates very similarly to openat(2).