diff options
| author | Karel Zak <kzak@redhat.com> | 2025-08-11 13:07:38 +0200 |
|---|---|---|
| committer | Karel Zak <kzak@redhat.com> | 2025-08-12 10:30:30 +0200 |
| commit | cbf05f69587111d88d0dc3b16bb4f9fd934a0f62 (patch) | |
| tree | f601371db7cbf650b47d53b23a66e7d84bbcfa09 /libmount/src | |
| parent | ca2121e1bf0d1f28790eb33d66bf6b399fd426d0 (diff) | |
| download | util-linux-cbf05f69587111d88d0dc3b16bb4f9fd934a0f62.tar.gz | |
libmount: add MOVE_MOUNT_BENEATH support
Fixes: https://github.com/util-linux/util-linux/issues/2604
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount/src')
| -rw-r--r-- | libmount/src/context.c | 26 | ||||
| -rw-r--r-- | libmount/src/hook_mount.c | 7 | ||||
| -rw-r--r-- | libmount/src/libmount.h.in | 3 | ||||
| -rw-r--r-- | libmount/src/libmount.sym | 2 | ||||
| -rw-r--r-- | libmount/src/mountP.h | 1 |
5 files changed, 38 insertions, 1 deletions
diff --git a/libmount/src/context.c b/libmount/src/context.c index 122d2dbf23..66b5c2d8f1 100644 --- a/libmount/src/context.c +++ b/libmount/src/context.c @@ -618,6 +618,32 @@ int mnt_context_is_exclusive(struct libmnt_context *cxt) } /** + * mnt_context_enable_beneath + * @cxt: mount context + * @enable: TRUE or FALSE + * + * Enable/disable underlying mount (move). The filesystem is attached beneath the current + * top-level mount of the mountpoint. See mount_move( MOVE_MOUNT_BENEATH ). + * + * Returns: 0 on success, negative number in case of error. + */ +int mnt_context_enable_beneath(struct libmnt_context *cxt, int enable) +{ + return set_flag(cxt, MNT_FL_BENEATH, enable); +} + +/** + * mnt_context_is_beneath: + * @cxt: mount context + * + * Returns: 1 if beneath mount is enabled or 0 + */ +int mnt_context_is_beneath(struct libmnt_context *cxt) +{ + return cxt->flags & MNT_FL_BENEATH ? 1 : 0; +} + +/** * mnt_context_enable_fork: * @cxt: mount context * @enable: TRUE or FALSE diff --git a/libmount/src/hook_mount.c b/libmount/src/hook_mount.c index e1c67990ea..77cf51ad3d 100644 --- a/libmount/src/hook_mount.c +++ b/libmount/src/hook_mount.c @@ -517,6 +517,7 @@ static int hook_attach_target(struct libmnt_context *cxt, void *data __attribute__((__unused__))) { struct libmnt_sysapi *api; + unsigned int flags; const char *target; int rc = 0; @@ -542,7 +543,11 @@ static int hook_attach_target(struct libmnt_context *cxt, umount2(target, MNT_DETACH); } - rc = move_mount(api->fd_tree, "", AT_FDCWD, target, MOVE_MOUNT_F_EMPTY_PATH); + flags = MOVE_MOUNT_F_EMPTY_PATH; + if (mnt_context_is_beneath(cxt)) + flags |= MOVE_MOUNT_BENEATH; + + rc = move_mount(api->fd_tree, "", AT_FDCWD, target, flags); hookset_set_syscall_status(cxt, "move_mount", rc == 0); if (rc == 0) { diff --git a/libmount/src/libmount.h.in b/libmount/src/libmount.h.in index fbb6c8ff69..04b7b30749 100644 --- a/libmount/src/libmount.h.in +++ b/libmount/src/libmount.h.in @@ -818,6 +818,7 @@ extern int mnt_context_set_optsmode(struct libmnt_context *cxt, int mode); extern int mnt_context_disable_canonicalize(struct libmnt_context *cxt, int disable); extern int mnt_context_enable_onlyonce(struct libmnt_context *cxt, int enable); extern int mnt_context_enable_exclusive(struct libmnt_context *cxt, int enable); +extern int mnt_context_enable_beneath(struct libmnt_context *cxt, int enable); extern int mnt_context_enable_lazy(struct libmnt_context *cxt, int enable); extern int mnt_context_enable_rdonly_umount(struct libmnt_context *cxt, int enable); extern int mnt_context_enable_rwonly_mount(struct libmnt_context *cxt, int enable); @@ -837,6 +838,8 @@ extern int mnt_context_is_onlyonce(struct libmnt_context *cxt) __ul_attribute__((nonnull)); extern int mnt_context_is_exclusive(struct libmnt_context *cxt) __ul_attribute__((nonnull)); +extern int mnt_context_is_beneath(struct libmnt_context *cxt) + __ul_attribute__((nonnull)); extern int mnt_context_is_lazy(struct libmnt_context *cxt) __ul_attribute__((nonnull)); extern int mnt_context_is_rdonly_umount(struct libmnt_context *cxt) diff --git a/libmount/src/libmount.sym b/libmount/src/libmount.sym index 0b0e3bffec..42fefc1508 100644 --- a/libmount/src/libmount.sym +++ b/libmount/src/libmount.sym @@ -410,7 +410,9 @@ MOUNT_2_41 { } MOUNT_2_40; MOUNT_2_42 { + mnt_context_enable_beneath; mnt_context_enable_exclusive; + mnt_context_is_beneath; mnt_context_is_exclusive; mnt_monitor_enable_mountinfo; mnt_monitor_enable_fanotify; diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h index 8dc31acad9..fb01041f6b 100644 --- a/libmount/src/mountP.h +++ b/libmount/src/mountP.h @@ -537,6 +537,7 @@ struct libmnt_context #define MNT_FL_RWONLY_MOUNT (1 << 14) /* explicit mount -w; never try read-only */ #define MNT_FL_ONLYONCE (1 << 15) #define MNT_FL_EXCL (1 << 16) +#define MNT_FL_BENEATH (1 << 17) #define MNT_FL_MOUNTDATA (1 << 20) #define MNT_FL_TAB_APPLIED (1 << 21) /* fstab merged to cxt->fs */ |
