Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nstree: switch to new structures

Switch the nstree management to the new combined structures.

Link: https://patch.msgid.link/20251110-work-namespace-nstree-fixes-v1-5-e8a9264e0fb9@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>

+136 -177
+1 -1
fs/namespace.c
··· 138 138 139 139 if (!node) 140 140 return NULL; 141 - ns = rb_entry(node, struct ns_common, ns_tree_node); 141 + ns = rb_entry(node, struct ns_common, ns_tree_node.ns_node); 142 142 return container_of(ns, struct mnt_namespace, ns); 143 143 } 144 144
+9 -18
include/linux/ns/ns_common_types.h
··· 3 3 #define _LINUX_NS_COMMON_TYPES_H 4 4 5 5 #include <linux/atomic.h> 6 + #include <linux/ns/nstree_types.h> 6 7 #include <linux/rbtree.h> 7 8 #include <linux/refcount.h> 8 9 #include <linux/types.h> ··· 99 98 * Initial namespaces: 100 99 * Boot-time namespaces (init_net, init_pid_ns, etc.) start with 101 100 * __ns_ref_active = 1 and remain active forever. 101 + * 102 + * @ns_type: type of namespace (e.g., CLONE_NEWNET) 103 + * @stashed: cached dentry to be used by the vfs 104 + * @ops: namespace operations 105 + * @inum: namespace inode number (quickly recycled for non-initial namespaces) 106 + * @__ns_ref: main reference count (do not use directly) 107 + * @ns_tree: namespace tree nodes and active reference count 102 108 */ 103 109 struct ns_common { 104 110 u32 ns_type; ··· 114 106 unsigned int inum; 115 107 refcount_t __ns_ref; /* do not use directly */ 116 108 union { 117 - struct { 118 - u64 ns_id; 119 - struct /* global namespace rbtree and list */ { 120 - struct rb_node ns_unified_tree_node; 121 - struct list_head ns_unified_list_node; 122 - }; 123 - struct /* per type rbtree and list */ { 124 - struct rb_node ns_tree_node; 125 - struct list_head ns_list_node; 126 - }; 127 - struct /* namespace ownership rbtree and list */ { 128 - struct rb_root ns_owner_tree; /* rbtree of namespaces owned by this namespace */ 129 - struct list_head ns_owner; /* list of namespaces owned by this namespace */ 130 - struct rb_node ns_owner_tree_node; /* node in the owner namespace's rbtree */ 131 - struct list_head ns_owner_entry; /* node in the owner namespace's ns_owned list */ 132 - }; 133 - atomic_t __ns_ref_active; /* do not use directly */ 134 - }; 109 + struct ns_tree; 135 110 struct rcu_head ns_rcu; 136 111 }; 137 112 };
+19
include/linux/ns/nstree_types.h
··· 33 33 struct list_head ns_list_entry; 34 34 }; 35 35 36 + /** 37 + * struct ns_tree - Namespace tree nodes and active reference count 38 + * @ns_id: Unique namespace identifier 39 + * @__ns_ref_active: Active reference count (do not use directly) 40 + * @ns_unified_node: Node in the global namespace tree 41 + * @ns_tree_node: Node in the per-type namespace tree 42 + * @ns_owner_node: Node in the owner namespace's tree of owned namespaces 43 + * @ns_owner_root: Root of the tree of namespaces owned by this namespace 44 + * (only used when this namespace is an owner) 45 + */ 46 + struct ns_tree { 47 + u64 ns_id; 48 + atomic_t __ns_ref_active; 49 + struct ns_tree_node ns_unified_node; 50 + struct ns_tree_node ns_tree_node; 51 + struct ns_tree_node ns_owner_node; 52 + struct ns_tree_root ns_owner_root; 53 + }; 54 + 36 55 #endif /* _LINUX_NSTREE_TYPES_H */
+13 -14
include/linux/ns_common.h
··· 26 26 return ns->ns_id <= NS_LAST_INIT_ID; 27 27 } 28 28 29 - 30 - #define NS_COMMON_INIT(nsname, refs) \ 31 - { \ 32 - .ns_type = ns_common_type(&nsname), \ 33 - .ns_id = ns_init_id(&nsname), \ 34 - .inum = ns_init_inum(&nsname), \ 35 - .ops = to_ns_operations(&nsname), \ 36 - .stashed = NULL, \ 37 - .__ns_ref = REFCOUNT_INIT(refs), \ 38 - .__ns_ref_active = ATOMIC_INIT(1), \ 39 - .ns_list_node = LIST_HEAD_INIT(nsname.ns.ns_list_node), \ 40 - .ns_owner_entry = LIST_HEAD_INIT(nsname.ns.ns_owner_entry), \ 41 - .ns_owner = LIST_HEAD_INIT(nsname.ns.ns_owner), \ 42 - .ns_unified_list_node = LIST_HEAD_INIT(nsname.ns.ns_unified_list_node), \ 29 + #define NS_COMMON_INIT(nsname, refs) \ 30 + { \ 31 + .ns_type = ns_common_type(&nsname), \ 32 + .ns_id = ns_init_id(&nsname), \ 33 + .inum = ns_init_inum(&nsname), \ 34 + .ops = to_ns_operations(&nsname), \ 35 + .stashed = NULL, \ 36 + .__ns_ref = REFCOUNT_INIT(refs), \ 37 + .__ns_ref_active = ATOMIC_INIT(1), \ 38 + .ns_unified_node.ns_list_entry = LIST_HEAD_INIT(nsname.ns.ns_unified_node.ns_list_entry), \ 39 + .ns_tree_node.ns_list_entry = LIST_HEAD_INIT(nsname.ns.ns_tree_node.ns_list_entry), \ 40 + .ns_owner_node.ns_list_entry = LIST_HEAD_INIT(nsname.ns.ns_owner_node.ns_list_entry), \ 41 + .ns_owner_root.ns_list_head = LIST_HEAD_INIT(nsname.ns.ns_owner_root.ns_list_head), \ 43 42 } 44 43 45 44 #define ns_common_init(__ns) \
+13 -13
include/linux/nstree.h
··· 13 13 14 14 struct ns_common; 15 15 16 - extern struct ns_tree cgroup_ns_tree; 17 - extern struct ns_tree ipc_ns_tree; 18 - extern struct ns_tree mnt_ns_tree; 19 - extern struct ns_tree net_ns_tree; 20 - extern struct ns_tree pid_ns_tree; 21 - extern struct ns_tree time_ns_tree; 22 - extern struct ns_tree user_ns_tree; 23 - extern struct ns_tree uts_ns_tree; 16 + extern struct ns_tree_root cgroup_ns_tree; 17 + extern struct ns_tree_root ipc_ns_tree; 18 + extern struct ns_tree_root mnt_ns_tree; 19 + extern struct ns_tree_root net_ns_tree; 20 + extern struct ns_tree_root pid_ns_tree; 21 + extern struct ns_tree_root time_ns_tree; 22 + extern struct ns_tree_root user_ns_tree; 23 + extern struct ns_tree_root uts_ns_tree; 24 24 25 25 void ns_tree_node_init(struct ns_tree_node *node); 26 26 void ns_tree_root_init(struct ns_tree_root *root); ··· 46 46 (((__ns) == ns_init_ns(__ns)) ? ns_init_id(__ns) : 0)) 47 47 48 48 u64 __ns_tree_gen_id(struct ns_common *ns, u64 id); 49 - void __ns_tree_add_raw(struct ns_common *ns, struct ns_tree *ns_tree); 50 - void __ns_tree_remove(struct ns_common *ns, struct ns_tree *ns_tree); 49 + void __ns_tree_add_raw(struct ns_common *ns, struct ns_tree_root *ns_tree); 50 + void __ns_tree_remove(struct ns_common *ns, struct ns_tree_root *ns_tree); 51 51 struct ns_common *ns_tree_lookup_rcu(u64 ns_id, int ns_type); 52 52 struct ns_common *__ns_tree_adjoined_rcu(struct ns_common *ns, 53 - struct ns_tree *ns_tree, 53 + struct ns_tree_root *ns_tree, 54 54 bool previous); 55 55 56 - static inline void __ns_tree_add(struct ns_common *ns, struct ns_tree *ns_tree, u64 id) 56 + static inline void __ns_tree_add(struct ns_common *ns, struct ns_tree_root *ns_tree, u64 id) 57 57 { 58 58 __ns_tree_gen_id(ns, id); 59 59 __ns_tree_add_raw(ns, ns_tree); ··· 91 91 #define ns_tree_adjoined_rcu(__ns, __previous) \ 92 92 __ns_tree_adjoined_rcu(to_ns_common(__ns), to_ns_tree(__ns), __previous) 93 93 94 - #define ns_tree_active(__ns) (!RB_EMPTY_NODE(&to_ns_common(__ns)->ns_tree_node)) 94 + #define ns_tree_active(__ns) (!RB_EMPTY_NODE(&to_ns_common(__ns)->ns_tree_node.ns_node)) 95 95 96 96 #endif /* _LINUX_NSTREE_H */
+5 -8
kernel/nscommon.c
··· 2 2 /* Copyright (c) 2025 Christian Brauner <brauner@kernel.org> */ 3 3 4 4 #include <linux/ns_common.h> 5 + #include <linux/nstree.h> 5 6 #include <linux/proc_ns.h> 6 7 #include <linux/user_namespace.h> 7 8 #include <linux/vfsdebug.h> ··· 62 61 ns->ops = ops; 63 62 ns->ns_id = 0; 64 63 ns->ns_type = ns_type; 65 - RB_CLEAR_NODE(&ns->ns_tree_node); 66 - RB_CLEAR_NODE(&ns->ns_unified_tree_node); 67 - RB_CLEAR_NODE(&ns->ns_owner_tree_node); 68 - INIT_LIST_HEAD(&ns->ns_list_node); 69 - INIT_LIST_HEAD(&ns->ns_unified_list_node); 70 - ns->ns_owner_tree = RB_ROOT; 71 - INIT_LIST_HEAD(&ns->ns_owner); 72 - INIT_LIST_HEAD(&ns->ns_owner_entry); 64 + ns_tree_node_init(&ns->ns_tree_node); 65 + ns_tree_node_init(&ns->ns_unified_node); 66 + ns_tree_node_init(&ns->ns_owner_node); 67 + ns_tree_root_init(&ns->ns_owner_root); 73 68 74 69 #ifdef CONFIG_DEBUG_VFS 75 70 ns_debug(ns, ops);
+76 -123
kernel/nstree.c
··· 9 9 #include <linux/user_namespace.h> 10 10 11 11 static __cacheline_aligned_in_smp DEFINE_SEQLOCK(ns_tree_lock); 12 - static struct rb_root ns_unified_tree = RB_ROOT; /* protected by ns_tree_lock */ 13 - static LIST_HEAD(ns_unified_list); /* protected by ns_tree_lock */ 14 12 15 - /** 16 - * struct ns_tree - Namespace tree 17 - * @ns_tree: Rbtree of namespaces of a particular type 18 - * @ns_list: Sequentially walkable list of all namespaces of this type 19 - * @type: type of namespaces in this tree 20 - */ 21 - struct ns_tree { 22 - struct rb_root ns_tree; 23 - struct list_head ns_list; 24 - int type; 13 + static struct ns_tree_root ns_unified_root = { /* protected by ns_tree_lock */ 14 + .ns_rb = RB_ROOT, 15 + .ns_list_head = LIST_HEAD_INIT(ns_unified_root.ns_list_head), 25 16 }; 26 17 27 - struct ns_tree mnt_ns_tree = { 28 - .ns_tree = RB_ROOT, 29 - .ns_list = LIST_HEAD_INIT(mnt_ns_tree.ns_list), 30 - .type = CLONE_NEWNS, 18 + struct ns_tree_root mnt_ns_tree = { 19 + .ns_rb = RB_ROOT, 20 + .ns_list_head = LIST_HEAD_INIT(mnt_ns_tree.ns_list_head), 31 21 }; 32 22 33 - struct ns_tree net_ns_tree = { 34 - .ns_tree = RB_ROOT, 35 - .ns_list = LIST_HEAD_INIT(net_ns_tree.ns_list), 36 - .type = CLONE_NEWNET, 23 + struct ns_tree_root net_ns_tree = { 24 + .ns_rb = RB_ROOT, 25 + .ns_list_head = LIST_HEAD_INIT(net_ns_tree.ns_list_head), 37 26 }; 38 27 EXPORT_SYMBOL_GPL(net_ns_tree); 39 28 40 - struct ns_tree uts_ns_tree = { 41 - .ns_tree = RB_ROOT, 42 - .ns_list = LIST_HEAD_INIT(uts_ns_tree.ns_list), 43 - .type = CLONE_NEWUTS, 29 + struct ns_tree_root uts_ns_tree = { 30 + .ns_rb = RB_ROOT, 31 + .ns_list_head = LIST_HEAD_INIT(uts_ns_tree.ns_list_head), 44 32 }; 45 33 46 - struct ns_tree user_ns_tree = { 47 - .ns_tree = RB_ROOT, 48 - .ns_list = LIST_HEAD_INIT(user_ns_tree.ns_list), 49 - .type = CLONE_NEWUSER, 34 + struct ns_tree_root user_ns_tree = { 35 + .ns_rb = RB_ROOT, 36 + .ns_list_head = LIST_HEAD_INIT(user_ns_tree.ns_list_head), 50 37 }; 51 38 52 - struct ns_tree ipc_ns_tree = { 53 - .ns_tree = RB_ROOT, 54 - .ns_list = LIST_HEAD_INIT(ipc_ns_tree.ns_list), 55 - .type = CLONE_NEWIPC, 39 + struct ns_tree_root ipc_ns_tree = { 40 + .ns_rb = RB_ROOT, 41 + .ns_list_head = LIST_HEAD_INIT(ipc_ns_tree.ns_list_head), 56 42 }; 57 43 58 - struct ns_tree pid_ns_tree = { 59 - .ns_tree = RB_ROOT, 60 - .ns_list = LIST_HEAD_INIT(pid_ns_tree.ns_list), 61 - .type = CLONE_NEWPID, 44 + struct ns_tree_root pid_ns_tree = { 45 + .ns_rb = RB_ROOT, 46 + .ns_list_head = LIST_HEAD_INIT(pid_ns_tree.ns_list_head), 62 47 }; 63 48 64 - struct ns_tree cgroup_ns_tree = { 65 - .ns_tree = RB_ROOT, 66 - .ns_list = LIST_HEAD_INIT(cgroup_ns_tree.ns_list), 67 - .type = CLONE_NEWCGROUP, 49 + struct ns_tree_root cgroup_ns_tree = { 50 + .ns_rb = RB_ROOT, 51 + .ns_list_head = LIST_HEAD_INIT(cgroup_ns_tree.ns_list_head), 68 52 }; 69 53 70 - struct ns_tree time_ns_tree = { 71 - .ns_tree = RB_ROOT, 72 - .ns_list = LIST_HEAD_INIT(time_ns_tree.ns_list), 73 - .type = CLONE_NEWTIME, 54 + struct ns_tree_root time_ns_tree = { 55 + .ns_rb = RB_ROOT, 56 + .ns_list_head = LIST_HEAD_INIT(time_ns_tree.ns_list_head), 74 57 }; 75 58 76 59 /** ··· 145 162 { 146 163 if (!node) 147 164 return NULL; 148 - return rb_entry(node, struct ns_common, ns_tree_node); 165 + return rb_entry(node, struct ns_common, ns_tree_node.ns_node); 149 166 } 150 167 151 168 static inline struct ns_common *node_to_ns_unified(const struct rb_node *node) 152 169 { 153 170 if (!node) 154 171 return NULL; 155 - return rb_entry(node, struct ns_common, ns_unified_tree_node); 172 + return rb_entry(node, struct ns_common, ns_unified_node.ns_node); 156 173 } 157 174 158 175 static inline struct ns_common *node_to_ns_owner(const struct rb_node *node) 159 176 { 160 177 if (!node) 161 178 return NULL; 162 - return rb_entry(node, struct ns_common, ns_owner_tree_node); 179 + return rb_entry(node, struct ns_common, ns_owner_node.ns_node); 163 180 } 164 181 165 182 static int ns_id_cmp(u64 id_a, u64 id_b) ··· 186 203 return ns_id_cmp(node_to_ns_owner(a)->ns_id, node_to_ns_owner(b)->ns_id); 187 204 } 188 205 189 - void __ns_tree_add_raw(struct ns_common *ns, struct ns_tree *ns_tree) 206 + void __ns_tree_add_raw(struct ns_common *ns, struct ns_tree_root *ns_tree) 190 207 { 191 - struct rb_node *node, *prev; 208 + struct rb_node *node; 192 209 const struct proc_ns_operations *ops = ns->ops; 193 210 194 211 VFS_WARN_ON_ONCE(!ns->ns_id); 195 - VFS_WARN_ON_ONCE(ns->ns_type != ns_tree->type); 196 212 197 213 write_seqlock(&ns_tree_lock); 198 214 199 - node = rb_find_add_rcu(&ns->ns_tree_node, &ns_tree->ns_tree, ns_cmp); 200 - /* 201 - * If there's no previous entry simply add it after the 202 - * head and if there is add it after the previous entry. 203 - */ 204 - prev = rb_prev(&ns->ns_tree_node); 205 - if (!prev) 206 - list_add_rcu(&ns->ns_list_node, &ns_tree->ns_list); 207 - else 208 - list_add_rcu(&ns->ns_list_node, &node_to_ns(prev)->ns_list_node); 215 + /* Add to per-type tree and list */ 216 + node = ns_tree_node_add(&ns->ns_tree_node, ns_tree, ns_cmp); 209 217 210 218 /* Add to unified tree and list */ 211 - rb_find_add_rcu(&ns->ns_unified_tree_node, &ns_unified_tree, ns_cmp_unified); 212 - prev = rb_prev(&ns->ns_unified_tree_node); 213 - if (!prev) 214 - list_add_rcu(&ns->ns_unified_list_node, &ns_unified_list); 215 - else 216 - list_add_rcu(&ns->ns_unified_list_node, &node_to_ns_unified(prev)->ns_unified_list_node); 219 + ns_tree_node_add(&ns->ns_unified_node, &ns_unified_root, ns_cmp_unified); 217 220 221 + /* Add to owner's tree if applicable */ 218 222 if (ops) { 219 223 struct user_namespace *user_ns; 220 224 ··· 211 241 struct ns_common *owner = &user_ns->ns; 212 242 VFS_WARN_ON_ONCE(owner->ns_type != CLONE_NEWUSER); 213 243 214 - /* Insert into owner's rbtree */ 215 - rb_find_add_rcu(&ns->ns_owner_tree_node, &owner->ns_owner_tree, ns_cmp_owner); 216 - 217 - /* Insert into owner's list in sorted order */ 218 - prev = rb_prev(&ns->ns_owner_tree_node); 219 - if (!prev) 220 - list_add_rcu(&ns->ns_owner_entry, &owner->ns_owner); 221 - else 222 - list_add_rcu(&ns->ns_owner_entry, &node_to_ns_owner(prev)->ns_owner_entry); 244 + /* Insert into owner's tree and list */ 245 + ns_tree_node_add(&ns->ns_owner_node, &owner->ns_owner_root, ns_cmp_owner); 223 246 } else { 224 247 /* Only the initial user namespace doesn't have an owner. */ 225 248 VFS_WARN_ON_ONCE(ns != to_ns_common(&init_user_ns)); ··· 223 260 VFS_WARN_ON_ONCE(node); 224 261 } 225 262 226 - void __ns_tree_remove(struct ns_common *ns, struct ns_tree *ns_tree) 263 + void __ns_tree_remove(struct ns_common *ns, struct ns_tree_root *ns_tree) 227 264 { 228 265 const struct proc_ns_operations *ops = ns->ops; 229 266 struct user_namespace *user_ns; 230 267 231 - VFS_WARN_ON_ONCE(RB_EMPTY_NODE(&ns->ns_tree_node)); 232 - VFS_WARN_ON_ONCE(list_empty(&ns->ns_list_node)); 233 - VFS_WARN_ON_ONCE(ns->ns_type != ns_tree->type); 268 + VFS_WARN_ON_ONCE(ns_tree_node_empty(&ns->ns_tree_node)); 269 + VFS_WARN_ON_ONCE(list_empty(&ns->ns_tree_node.ns_list_entry)); 234 270 235 271 write_seqlock(&ns_tree_lock); 236 - rb_erase(&ns->ns_tree_node, &ns_tree->ns_tree); 237 - RB_CLEAR_NODE(&ns->ns_tree_node); 238 272 239 - list_bidir_del_rcu(&ns->ns_list_node); 273 + /* Remove from per-type tree and list */ 274 + ns_tree_node_del(&ns->ns_tree_node, ns_tree); 240 275 241 - rb_erase(&ns->ns_unified_tree_node, &ns_unified_tree); 242 - RB_CLEAR_NODE(&ns->ns_unified_tree_node); 276 + /* Remove from unified tree and list */ 277 + ns_tree_node_del(&ns->ns_unified_node, &ns_unified_root); 243 278 244 - list_bidir_del_rcu(&ns->ns_unified_list_node); 245 - 246 - /* Remove from owner's rbtree if this namespace has an owner */ 279 + /* Remove from owner's tree if applicable */ 247 280 if (ops) { 248 281 user_ns = ops->owner(ns); 249 282 if (user_ns) { 250 283 struct ns_common *owner = &user_ns->ns; 251 - rb_erase(&ns->ns_owner_tree_node, &owner->ns_owner_tree); 252 - RB_CLEAR_NODE(&ns->ns_owner_tree_node); 284 + ns_tree_node_del(&ns->ns_owner_node, &owner->ns_owner_root); 253 285 } 254 - 255 - list_bidir_del_rcu(&ns->ns_owner_entry); 256 286 } 257 287 258 288 write_sequnlock(&ns_tree_lock); ··· 276 320 return 0; 277 321 } 278 322 279 - static struct ns_tree *ns_tree_from_type(int ns_type) 323 + static struct ns_tree_root *ns_tree_from_type(int ns_type) 280 324 { 281 325 switch (ns_type) { 282 326 case CLONE_NEWCGROUP: ··· 307 351 308 352 do { 309 353 seq = read_seqbegin(&ns_tree_lock); 310 - node = rb_find_rcu(&ns_id, &ns_unified_tree, ns_find_unified); 354 + node = rb_find_rcu(&ns_id, &ns_unified_root.ns_rb, ns_find_unified); 311 355 if (node) 312 356 break; 313 357 } while (read_seqretry(&ns_tree_lock, seq)); ··· 317 361 318 362 static struct ns_common *__ns_tree_lookup_rcu(u64 ns_id, int ns_type) 319 363 { 320 - struct ns_tree *ns_tree; 364 + struct ns_tree_root *ns_tree; 321 365 struct rb_node *node; 322 366 unsigned int seq; 323 367 ··· 327 371 328 372 do { 329 373 seq = read_seqbegin(&ns_tree_lock); 330 - node = rb_find_rcu(&ns_id, &ns_tree->ns_tree, ns_find); 374 + node = rb_find_rcu(&ns_id, &ns_tree->ns_rb, ns_find); 331 375 if (node) 332 376 break; 333 377 } while (read_seqretry(&ns_tree_lock, seq)); ··· 355 399 * there is no next/previous namespace, -ENOENT is returned. 356 400 */ 357 401 struct ns_common *__ns_tree_adjoined_rcu(struct ns_common *ns, 358 - struct ns_tree *ns_tree, bool previous) 402 + struct ns_tree_root *ns_tree, bool previous) 359 403 { 360 404 struct list_head *list; 361 405 362 406 RCU_LOCKDEP_WARN(!rcu_read_lock_held(), "suspicious ns_tree_adjoined_rcu() usage"); 363 407 364 408 if (previous) 365 - list = rcu_dereference(list_bidir_prev_rcu(&ns->ns_list_node)); 409 + list = rcu_dereference(list_bidir_prev_rcu(&ns->ns_tree_node.ns_list_entry)); 366 410 else 367 - list = rcu_dereference(list_next_rcu(&ns->ns_list_node)); 368 - if (list_is_head(list, &ns_tree->ns_list)) 411 + list = rcu_dereference(list_next_rcu(&ns->ns_tree_node.ns_list_entry)); 412 + if (list_is_head(list, &ns_tree->ns_list_head)) 369 413 return ERR_PTR(-ENOENT); 370 414 371 - VFS_WARN_ON_ONCE(list_entry_rcu(list, struct ns_common, ns_list_node)->ns_type != ns_tree->type); 372 - 373 - return list_entry_rcu(list, struct ns_common, ns_list_node); 415 + return list_entry_rcu(list, struct ns_common, ns_tree_node.ns_list_entry); 374 416 } 375 417 376 418 /** ··· 462 508 VFS_WARN_ON_ONCE(owner->ns_type != CLONE_NEWUSER); 463 509 464 510 read_seqlock_excl(&ns_tree_lock); 465 - node = owner->ns_owner_tree.rb_node; 511 + node = owner->ns_owner_root.ns_rb.rb_node; 466 512 467 513 while (node) { 468 514 struct ns_common *ns; ··· 592 638 } 593 639 594 640 ret = 0; 595 - head = &to_ns_common(kls->user_ns)->ns_owner; 641 + head = &to_ns_common(kls->user_ns)->ns_owner_root.ns_list_head; 596 642 kls->userns_capable = ns_capable_noaudit(kls->user_ns, CAP_SYS_ADMIN); 597 643 598 644 rcu_read_lock(); 599 645 600 646 if (!first_ns) 601 - first_ns = list_entry_rcu(head->next, typeof(*ns), ns_owner_entry); 602 - 603 - for (ns = first_ns; &ns->ns_owner_entry != head && nr_ns_ids; 604 - ns = list_entry_rcu(ns->ns_owner_entry.next, typeof(*ns), ns_owner_entry)) { 647 + first_ns = list_entry_rcu(head->next, typeof(*ns), ns_owner_node.ns_list_entry); 648 + for (ns = first_ns; &ns->ns_owner_node.ns_list_entry != head && nr_ns_ids; 649 + ns = list_entry_rcu(ns->ns_owner_node.ns_list_entry.next, typeof(*ns), ns_owner_node.ns_list_entry)) { 605 650 struct ns_common *valid; 606 651 607 652 valid = legitimize_ns(kls, ns); ··· 635 682 static struct ns_common *lookup_ns_id_at(u64 ns_id, int ns_type) 636 683 { 637 684 struct ns_common *ret = NULL; 638 - struct ns_tree *ns_tree = NULL; 685 + struct ns_tree_root *ns_tree = NULL; 639 686 struct rb_node *node; 640 687 641 688 if (ns_type) { ··· 646 693 647 694 read_seqlock_excl(&ns_tree_lock); 648 695 if (ns_tree) 649 - node = ns_tree->ns_tree.rb_node; 696 + node = ns_tree->ns_rb.rb_node; 650 697 else 651 - node = ns_unified_tree.rb_node; 698 + node = ns_unified_root.ns_rb.rb_node; 652 699 653 700 while (node) { 654 701 struct ns_common *ns; ··· 678 725 } 679 726 680 727 static inline struct ns_common *first_ns_common(const struct list_head *head, 681 - struct ns_tree *ns_tree) 728 + struct ns_tree_root *ns_tree) 682 729 { 683 730 if (ns_tree) 684 - return list_entry_rcu(head->next, struct ns_common, ns_list_node); 685 - return list_entry_rcu(head->next, struct ns_common, ns_unified_list_node); 731 + return list_entry_rcu(head->next, struct ns_common, ns_tree_node.ns_list_entry); 732 + return list_entry_rcu(head->next, struct ns_common, ns_unified_node.ns_list_entry); 686 733 } 687 734 688 735 static inline struct ns_common *next_ns_common(struct ns_common *ns, 689 - struct ns_tree *ns_tree) 736 + struct ns_tree_root *ns_tree) 690 737 { 691 738 if (ns_tree) 692 - return list_entry_rcu(ns->ns_list_node.next, struct ns_common, ns_list_node); 693 - return list_entry_rcu(ns->ns_unified_list_node.next, struct ns_common, ns_unified_list_node); 739 + return list_entry_rcu(ns->ns_tree_node.ns_list_entry.next, struct ns_common, ns_tree_node.ns_list_entry); 740 + return list_entry_rcu(ns->ns_unified_node.ns_list_entry.next, struct ns_common, ns_unified_node.ns_list_entry); 694 741 } 695 742 696 743 static inline bool ns_common_is_head(struct ns_common *ns, 697 744 const struct list_head *head, 698 - struct ns_tree *ns_tree) 745 + struct ns_tree_root *ns_tree) 699 746 { 700 747 if (ns_tree) 701 - return &ns->ns_list_node == head; 702 - return &ns->ns_unified_list_node == head; 748 + return &ns->ns_tree_node.ns_list_entry == head; 749 + return &ns->ns_unified_node.ns_list_entry == head; 703 750 } 704 751 705 752 static ssize_t do_listns(struct klistns *kls) ··· 707 754 u64 __user *ns_ids = kls->uns_ids; 708 755 size_t nr_ns_ids = kls->nr_ns_ids; 709 756 struct ns_common *ns, *first_ns = NULL, *prev = NULL; 710 - struct ns_tree *ns_tree = NULL; 757 + struct ns_tree_root *ns_tree = NULL; 711 758 const struct list_head *head; 712 759 u32 ns_type; 713 760 ssize_t ret; ··· 732 779 733 780 ret = 0; 734 781 if (ns_tree) 735 - head = &ns_tree->ns_list; 782 + head = &ns_tree->ns_list_head; 736 783 else 737 - head = &ns_unified_list; 784 + head = &ns_unified_root.ns_list_head; 738 785 739 786 rcu_read_lock(); 740 787