On Fri, Apr 3, 2020 at 1:11 PM Lennart Poettering <mzxreary@xxxxxxxxxxx> wrote: > > On Fr, 03.04.20 09:44, Ian Kent (raven@xxxxxxxxxx) wrote: > > > > Currently the only way to find the mount id from a path is by parsing > > > /proc/self/fdinfo/$fd. It is trivial, however, to extend statx(2) to > > > return it directly from a path. Also the mount notification queue > > > that David implemented contains the mount ID of the changed mount. > > I would love to have the mount ID exposed via statx(). Here's a patch. Thanks, Miklos
From: Miklos Szeredi <mszeredi@xxxxxxxxxx> Subject: statx: add mount ID Systemd is hacking around to get it and it's trivial to add to statx, so... Signed-off-by: Miklos Szeredi <mszeredi@xxxxxxxxxx> --- fs/stat.c | 6 ++++++ include/linux/stat.h | 1 + include/uapi/linux/stat.h | 6 +++++- 3 files changed, 12 insertions(+), 1 deletion(-) --- a/fs/stat.c +++ b/fs/stat.c @@ -22,6 +22,7 @@ #include <asm/unistd.h> #include "internal.h" +#include "mount.h" /** * generic_fillattr - Fill in the basic attributes from the inode struct @@ -199,6 +200,10 @@ int vfs_statx(int dfd, const char __user goto out; error = vfs_getattr(&path, stat, request_mask, flags); + if (!error) { + stat->mnt_id = real_mount(path.mnt)->mnt_id; + stat->result_mask |= STATX_MNT_ID; + } path_put(&path); if (retry_estale(error, lookup_flags)) { lookup_flags |= LOOKUP_REVAL; @@ -563,6 +568,7 @@ cp_statx(const struct kstat *stat, struc tmp.stx_rdev_minor = MINOR(stat->rdev); tmp.stx_dev_major = MAJOR(stat->dev); tmp.stx_dev_minor = MINOR(stat->dev); + tmp.stx_mnt_id = stat->mnt_id; return copy_to_user(buffer, &tmp, sizeof(tmp)) ? -EFAULT : 0; } --- a/include/linux/stat.h +++ b/include/linux/stat.h @@ -47,6 +47,7 @@ struct kstat { struct timespec64 ctime; struct timespec64 btime; /* File creation time */ u64 blocks; + u64 mnt_id; }; #endif --- a/include/uapi/linux/stat.h +++ b/include/uapi/linux/stat.h @@ -123,7 +123,10 @@ struct statx { __u32 stx_dev_major; /* ID of device containing file [uncond] */ __u32 stx_dev_minor; /* 0x90 */ - __u64 __spare2[14]; /* Spare space for future expansion */ + __u64 stx_mnt_id; + __u64 __spare2; + /* 0xa0 */ + __u64 __spare3[12]; /* Spare space for future expansion */ /* 0x100 */ }; @@ -148,6 +151,7 @@ struct statx { #define STATX_BLOCKS 0x00000400U /* Want/got stx_blocks */ #define STATX_BASIC_STATS 0x000007ffU /* The stuff in the normal stat struct */ #define STATX_BTIME 0x00000800U /* Want/got stx_btime */ +#define STATX_MNT_ID 0x00001000U /* Got stx_mnt_id */ #define STATX_ALL 0x00000fffU /* All currently supported flags */ #define STATX__RESERVED 0x80000000U /* Reserved for future struct statx expansion */