Skip to content

Commit

Permalink
build: detect where struct mount_attr is declared
Browse files Browse the repository at this point in the history
Fixes: #4176
Signed-off-by: Christian Brauner (Microsoft) <christian.brauner@ubuntu.com>
  • Loading branch information
brauner authored and cyphar committed Oct 28, 2022
1 parent 5313e50 commit b7b2696
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 11 deletions.
30 changes: 28 additions & 2 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,6 @@ decl_headers = '''
foreach decl: [
'__aligned_u64',
'struct clone_args',
'struct mount_attr',
'struct open_how',
'struct rtnl_link_stats64',
]
Expand All @@ -613,7 +612,6 @@ foreach tuple: [
['struct seccomp_notif_sizes'],
['struct clone_args'],
['__aligned_u64'],
['struct mount_attr'],
['struct open_how'],
['struct rtnl_link_stats64'],
]
Expand All @@ -633,6 +631,34 @@ foreach tuple: [
endif
endforeach

## Types.
decl_headers = '''
#include <sys/mount.h>
'''

# 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 <linux/mount.h>
'''

# 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 <sys/syscall.h>
Expand Down
6 changes: 3 additions & 3 deletions src/lxc/conf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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,
};

Expand Down Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion src/lxc/conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down
6 changes: 3 additions & 3 deletions src/lxc/mount_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
12 changes: 10 additions & 2 deletions src/lxc/syscall_wrappers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit b7b2696

Please sign in to comment.