]>
git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/mount_utils.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
11 #include <sys/types.h>
15 #include "memory_utils.h"
16 #include "mount_utils.h"
17 #include "syscall_numbers.h"
18 #include "syscall_wrappers.h"
20 lxc_log_define(mount_utils
, lxc
);
22 int mnt_attributes_new(unsigned int old_flags
, unsigned int *new_flags
)
24 unsigned int flags
= 0;
26 if (old_flags
& MS_RDONLY
) {
27 flags
|= MOUNT_ATTR_RDONLY
;
28 old_flags
&= ~MS_RDONLY
;
31 if (old_flags
& MS_NOSUID
) {
32 flags
|= MOUNT_ATTR_NOSUID
;
33 old_flags
&= ~MS_NOSUID
;
36 if (old_flags
& MS_NODEV
) {
37 flags
|= MOUNT_ATTR_NODEV
;
38 old_flags
&= ~MS_NODEV
;
41 if (old_flags
& MS_NOEXEC
) {
42 flags
|= MOUNT_ATTR_NOEXEC
;
43 old_flags
&= ~MS_NOEXEC
;
46 if (old_flags
& MS_RELATIME
) {
47 flags
|= MOUNT_ATTR_RELATIME
;
48 old_flags
&= ~MS_RELATIME
;
51 if (old_flags
& MS_NOATIME
) {
52 flags
|= MOUNT_ATTR_NOATIME
;
53 old_flags
&= ~MS_NOATIME
;
56 if (old_flags
& MS_STRICTATIME
) {
57 flags
|= MOUNT_ATTR_STRICTATIME
;
58 old_flags
&= ~MS_STRICTATIME
;
61 if (old_flags
& MS_NODIRATIME
) {
62 flags
|= MOUNT_ATTR_NODIRATIME
;
63 old_flags
&= ~MS_NODIRATIME
;
70 int mnt_attributes_old(unsigned int new_flags
, unsigned int *old_flags
)
72 unsigned int flags
= 0;
74 if (new_flags
& MOUNT_ATTR_RDONLY
) {
76 new_flags
&= ~MOUNT_ATTR_RDONLY
;
79 if (new_flags
& MOUNT_ATTR_NOSUID
) {
81 new_flags
&= ~MOUNT_ATTR_NOSUID
;
84 if (new_flags
& MS_NODEV
) {
85 flags
|= MOUNT_ATTR_NODEV
;
86 new_flags
&= ~MS_NODEV
;
89 if (new_flags
& MOUNT_ATTR_NOEXEC
) {
91 new_flags
&= ~MOUNT_ATTR_NOEXEC
;
94 if (new_flags
& MS_RELATIME
) {
96 new_flags
&= ~MOUNT_ATTR_RELATIME
;
99 if (new_flags
& MS_NOATIME
) {
101 new_flags
&= ~MOUNT_ATTR_NOATIME
;
104 if (new_flags
& MS_STRICTATIME
) {
105 flags
|= MS_STRICTATIME
;
106 new_flags
&= ~MOUNT_ATTR_STRICTATIME
;
109 if (new_flags
& MS_NODIRATIME
) {
110 flags
|= MS_NODIRATIME
;
111 new_flags
&= ~MOUNT_ATTR_NODIRATIME
;
118 int mount_filesystem(const char *fs_name
, const char *path
, unsigned int attr_flags
)
120 __do_close
int fsfd
= -EBADF
;
121 unsigned int old_flags
= 0;
123 fsfd
= fsopen(fs_name
, FSOPEN_CLOEXEC
);
125 __do_close
int mfd
= -EBADF
;
127 if (fsconfig(fsfd
, FSCONFIG_CMD_CREATE
, NULL
, NULL
, 0))
130 mfd
= fsmount(fsfd
, FSMOUNT_CLOEXEC
, attr_flags
);
134 return move_mount(mfd
, "", AT_FDCWD
, path
, MOVE_MOUNT_F_EMPTY_PATH
);
137 TRACE("Falling back to old mount api");
138 mnt_attributes_old(attr_flags
, &old_flags
);
139 return mount("none", path
, fs_name
, old_flags
, NULL
);