aboutsummaryrefslogtreecommitdiffstats
path: root/libmount/src
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2025-08-11 13:07:38 +0200
committerKarel Zak <kzak@redhat.com>2025-08-12 10:30:30 +0200
commitcbf05f69587111d88d0dc3b16bb4f9fd934a0f62 (patch)
treef601371db7cbf650b47d53b23a66e7d84bbcfa09 /libmount/src
parentca2121e1bf0d1f28790eb33d66bf6b399fd426d0 (diff)
downloadutil-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.c26
-rw-r--r--libmount/src/hook_mount.c7
-rw-r--r--libmount/src/libmount.h.in3
-rw-r--r--libmount/src/libmount.sym2
-rw-r--r--libmount/src/mountP.h1
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 */