# define MOVE_MOUNT_SET_GROUP 0x00000100 /* Set sharing group instead */
#endif
+#ifndef MOVE_MOUNT_BENEATH
+# define MOVE_MOUNT_BENEATH 0x00000200 /* Mount beneath top mount */
+#endif
+
#ifndef MOVE_MOUNT__MASK
-# define MOVE_MOUNT__MASK 0x00000077
+# define MOVE_MOUNT__MASK 0x00000377
#endif
#if !defined(HAVE_MOVE_MOUNT) && defined(SYS_move_mount)
mnt_context_disable_helpers
mnt_context_disable_mtab
mnt_context_disable_swapmatch
+mnt_context_enable_beneath
mnt_context_enable_exclusive
mnt_context_enable_fake
mnt_context_enable_force
mnt_context_helper_executed
mnt_context_helper_setopt
mnt_context_init_helper
+mnt_context_is_beneath
mnt_context_is_child
mnt_context_is_exclusive
mnt_context_is_fake
return cxt->flags & MNT_FL_EXCL ? 1 : 0;
}
+/**
+ * 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
void *data __attribute__((__unused__)))
{
struct libmnt_sysapi *api;
+ unsigned int flags;
const char *target;
int rc = 0;
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) {
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);
__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)
} 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;
#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 */