]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs: export the mount ns id via statmount
authorJosef Bacik <josef@toxicpanda.com>
Mon, 24 Jun 2024 15:49:47 +0000 (11:49 -0400)
committerChristian Brauner <brauner@kernel.org>
Fri, 28 Jun 2024 07:53:30 +0000 (09:53 +0200)
In order to allow users to iterate through children mount namespaces via
listmount we need a way for them to know what the ns id for the mount.
Add a new field to statmount called mnt_ns_id which will carry the ns id
for the given mount entry.

Co-developed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Link: https://lore.kernel.org/r/6dabf437331fb7415d886f7c64b21cb2a50b1c66.1719243756.git.josef@toxicpanda.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/namespace.c
include/uapi/linux/mount.h

index eebe9d912a719a3f966007fc5094ea25a96b9456..ed2d9353e4be3f641ea4896a3e7b3dc2ff5d1e6a 100644 (file)
@@ -4974,6 +4974,14 @@ static int statmount_fs_type(struct kstatmount *s, struct seq_file *seq)
        return 0;
 }
 
+static void statmount_mnt_ns_id(struct kstatmount *s)
+{
+       struct mnt_namespace *ns = current->nsproxy->mnt_ns;
+
+       s->sm.mask |= STATMOUNT_MNT_NS_ID;
+       s->sm.mnt_ns_id = ns->seq;
+}
+
 static int statmount_string(struct kstatmount *s, u64 flag)
 {
        int ret;
@@ -5070,6 +5078,9 @@ static int do_statmount(struct kstatmount *s)
        if (!err && s->mask & STATMOUNT_MNT_POINT)
                err = statmount_string(s, STATMOUNT_MNT_POINT);
 
+       if (!err && s->mask & STATMOUNT_MNT_NS_ID)
+               statmount_mnt_ns_id(s);
+
        if (err)
                return err;
 
index 88d78de1519ff39a22fe495795ab9dbfcd485ad4..a07508aee518ba5955b98a4a9f3b7a5df20ca81c 100644 (file)
@@ -172,7 +172,8 @@ struct statmount {
        __u64 propagate_from;   /* Propagation from in current namespace */
        __u32 mnt_root;         /* [str] Root of mount relative to root of fs */
        __u32 mnt_point;        /* [str] Mountpoint relative to current root */
-       __u64 __spare2[50];
+       __u64 mnt_ns_id;        /* ID of the mount namespace */
+       __u64 __spare2[49];
        char str[];             /* Variable size part containing strings */
 };
 
@@ -202,6 +203,7 @@ struct mnt_id_req {
 #define STATMOUNT_MNT_ROOT             0x00000008U     /* Want/got mnt_root  */
 #define STATMOUNT_MNT_POINT            0x00000010U     /* Want/got mnt_point */
 #define STATMOUNT_FS_TYPE              0x00000020U     /* Want/got fs_type */
+#define STATMOUNT_MNT_NS_ID            0x00000040U     /* Want/got mnt_ns_id */
 
 /*
  * Special @mnt_id values that can be passed to listmount