On Thu, 2025-01-30 at 00:19 +0100, Christian Brauner wrote: > This adds the STATMOUNT_MNT_UIDMAP and STATMOUNT_MNT_GIDMAP options. > It allows the retrieval of idmappings via statmount(). > > Currently it isn't possible to figure out what idmappings are applied to > an idmapped mount. This information is often crucial. Before statmount() > the only realistic options for an interface like this would have been to > add it to /proc/<pid>/fdinfo/<nr> or to expose it in > /proc/<pid>/mountinfo. Both solution would have been pretty ugly and > would've shown information that is of strong interest to some > application but not all. statmount() is perfect for this. > > The idmappings applied to an idmapped mount are shown relative to the > caller's user namespace. This is the most useful solution that doesn't > risk leaking information or confuse the caller. > > For example, an idmapped mount might have been created with the > following idmappings: > > mount --bind -o X-mount.idmap="0:10000:1000 2000:2000:1 3000:3000:1" /srv /opt > > Listing the idmappings through statmount() in the same context shows: > > mnt_id: 2147485088 > mnt_parent_id: 2147484816 > fs_type: btrfs > mnt_root: /srv > mnt_point: /opt > mnt_opts: ssd,discard=async,space_cache=v2,subvolid=5,subvol=/ > mnt_uidmap[0]: 0 10000 1000 > mnt_uidmap[1]: 2000 2000 1 > mnt_uidmap[2]: 3000 3000 1 > mnt_gidmap[0]: 0 10000 1000 > mnt_gidmap[1]: 2000 2000 1 > mnt_gidmap[2]: 3000 3000 1 > nit: any reason not to separate the fields with ':' like the mount option syntax? > But the idmappings might not always be resolvablein the caller's user > namespace. For example: > > unshare --user --map-root > > In this case statmount() will indicate the failure to resolve the idmappings > in the caller's user namespace by listing 4294967295 aka (uid_t) -1 as > the target of the mapping while still showing the source and range of > the mapping: > > mnt_id: 2147485087 > mnt_parent_id: 2147484016 > fs_type: btrfs > mnt_root: /srv > mnt_point: /opt > mnt_opts: ssd,discard=async,space_cache=v2,subvolid=5,subvol=/ > mnt_uidmap[0]: 0 4294967295 1000 > mnt_uidmap[1]: 2000 4294967295 1 > mnt_uidmap[2]: 3000 4294967295 1 > mnt_gidmap[0]: 0 4294967295 1000 > mnt_gidmap[1]: 2000 4294967295 1 > mnt_gidmap[2]: 3000 4294967295 1 >