Commit | Line | Data |
---|---|---|
ec4551f4 MCC |
1 | .. SPDX-License-Identifier: GPL-2.0 |
2 | ||
3 | ============= | |
b9d8b45e | 4 | Sysfs tagging |
ec4551f4 | 5 | ============= |
b9d8b45e SH |
6 | |
7 | (Taken almost verbatim from Eric Biederman's netns tagging patch | |
8 | commit msg) | |
9 | ||
10 | The problem. Network devices show up in sysfs and with the network | |
11 | namespace active multiple devices with the same name can show up in | |
12 | the same directory, ouch! | |
13 | ||
14 | To avoid that problem and allow existing applications in network | |
15 | namespaces to see the same interface that is currently presented in | |
16 | sysfs, sysfs now has tagging directory support. | |
17 | ||
f4fd0ba8 | 18 | By using the network namespace pointers as tags to separate out |
b9d8b45e SH |
19 | the sysfs directory entries we ensure that we don't have conflicts |
20 | in the directories and applications only see a limited set of | |
21 | the network devices. | |
22 | ||
9ba41327 | 23 | Each sysfs directory entry may be tagged with a namespace via the |
ec4551f4 MCC |
24 | ``void *ns member`` of its ``kernfs_node``. If a directory entry is tagged, |
25 | then ``kernfs_node->flags`` will have a flag between KOBJ_NS_TYPE_NONE | |
9ba41327 UM |
26 | and KOBJ_NS_TYPES, and ns will point to the namespace to which it |
27 | belongs. | |
b9d8b45e | 28 | |
ec4551f4 MCC |
29 | Each sysfs superblock's kernfs_super_info contains an array |
30 | ``void *ns[KOBJ_NS_TYPES]``. When a task in a tagging namespace | |
b9d8b45e SH |
31 | kobj_nstype first mounts sysfs, a new superblock is created. It |
32 | will be differentiated from other sysfs mounts by having its | |
ec4551f4 | 33 | ``s_fs_info->ns[kobj_nstype]`` set to the new namespace. Note that |
b9d8b45e SH |
34 | through bind mounting and mounts propagation, a task can easily view |
35 | the contents of other namespaces' sysfs mounts. Therefore, when a | |
36 | namespace exits, it will call kobj_ns_exit() to invalidate any | |
9ba41327 | 37 | kernfs_node->ns pointers pointing to it. |
b9d8b45e SH |
38 | |
39 | Users of this interface: | |
ec4551f4 MCC |
40 | |
41 | - define a type in the ``kobj_ns_type`` enumeration. | |
42 | - call kobj_ns_type_register() with its ``kobj_ns_type_operations`` which has | |
43 | ||
b9d8b45e SH |
44 | - current_ns() which returns current's namespace |
45 | - netlink_ns() which returns a socket's namespace | |
a266ef69 | 46 | - initial_ns() which returns the initial namespace |
ec4551f4 | 47 | |
b9d8b45e | 48 | - call kobj_ns_exit() when an individual tag is no longer valid |