Merge patch series "nsfs: expose the stable inode numbers in a public header"

Christian Brauner <brauner@kernel.org> says:

Userspace heavily relies on the root inode numbers for namespaces to
identify the initial namespaces. That's already a hard dependency. So we
cannot change that anymore. Move the initial inode numbers to a public
header and align the only two namespaces that currently don't do that
with all the other namespaces.

* patches from https://lore.kernel.org/20250606-work-nsfs-v1-0-b8749c9a8844@kernel.org:
  mntns: use stable inode number for initial mount ns
  netns: use stable inode number for initial mount ns
  nsfs: move root inode number to uapi

Link: https://lore.kernel.org/20250606-work-nsfs-v1-0-b8749c9a8844@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Christian Brauner 2025-06-11 11:59:13 +02:00
commit cd267cdef5
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2
4 changed files with 31 additions and 7 deletions

View File

@ -6203,9 +6203,11 @@ static void __init init_mount_tree(void)
if (IS_ERR(mnt))
panic("Can't create rootfs");
ns = alloc_mnt_ns(&init_user_ns, false);
ns = alloc_mnt_ns(&init_user_ns, true);
if (IS_ERR(ns))
panic("Can't allocate initial namespace");
ns->seq = atomic64_inc_return(&mnt_ns_seq);
ns->ns.inum = PROC_MNT_INIT_INO;
m = real_mount(mnt);
ns->root = m;
ns->nr_mounts = 1;

View File

@ -6,6 +6,7 @@
#define _LINUX_PROC_NS_H
#include <linux/ns_common.h>
#include <uapi/linux/nsfs.h>
struct pid_namespace;
struct nsset;
@ -40,12 +41,14 @@ extern const struct proc_ns_operations timens_for_children_operations;
*/
enum {
PROC_ROOT_INO = 1,
PROC_IPC_INIT_INO = 0xEFFFFFFFU,
PROC_UTS_INIT_INO = 0xEFFFFFFEU,
PROC_USER_INIT_INO = 0xEFFFFFFDU,
PROC_PID_INIT_INO = 0xEFFFFFFCU,
PROC_CGROUP_INIT_INO = 0xEFFFFFFBU,
PROC_TIME_INIT_INO = 0xEFFFFFFAU,
PROC_IPC_INIT_INO = IPC_NS_INIT_INO,
PROC_UTS_INIT_INO = UTS_NS_INIT_INO,
PROC_USER_INIT_INO = USER_NS_INIT_INO,
PROC_PID_INIT_INO = PID_NS_INIT_INO,
PROC_CGROUP_INIT_INO = CGROUP_NS_INIT_INO,
PROC_TIME_INIT_INO = TIME_NS_INIT_INO,
PROC_NET_INIT_INO = NET_NS_INIT_INO,
PROC_MNT_INIT_INO = MNT_NS_INIT_INO,
};
#ifdef CONFIG_PROC_FS

View File

@ -42,4 +42,15 @@ struct mnt_ns_info {
/* Get previous namespace. */
#define NS_MNT_GET_PREV _IOR(NSIO, 12, struct mnt_ns_info)
enum init_ns_ino {
IPC_NS_INIT_INO = 0xEFFFFFFFU,
UTS_NS_INIT_INO = 0xEFFFFFFEU,
USER_NS_INIT_INO = 0xEFFFFFFDU,
PID_NS_INIT_INO = 0xEFFFFFFCU,
CGROUP_NS_INIT_INO = 0xEFFFFFFBU,
TIME_NS_INIT_INO = 0xEFFFFFFAU,
NET_NS_INIT_INO = 0xEFFFFFF9U,
MNT_NS_INIT_INO = 0xEFFFFFF8U,
};
#endif /* __LINUX_NSFS_H */

View File

@ -796,11 +796,19 @@ static __net_init int net_ns_net_init(struct net *net)
#ifdef CONFIG_NET_NS
net->ns.ops = &netns_operations;
#endif
if (net == &init_net) {
net->ns.inum = PROC_NET_INIT_INO;
return 0;
}
return ns_alloc_inum(&net->ns);
}
static __net_exit void net_ns_net_exit(struct net *net)
{
/*
* Initial network namespace doesn't exit so we don't need any
* special checks here.
*/
ns_free_inum(&net->ns);
}