blob: 8888a05c398ef67ff22dfb3cd9683c234fc359e6 [file] [log] [blame]
Mauro Carvalho Chehabec4551f2020-04-27 23:17:18 +02001.. SPDX-License-Identifier: GPL-2.0
2
3=============
Serge E. Hallynb9d8b452010-05-04 21:45:38 -05004Sysfs tagging
Mauro Carvalho Chehabec4551f2020-04-27 23:17:18 +02005=============
Serge E. Hallynb9d8b452010-05-04 21:45:38 -05006
7(Taken almost verbatim from Eric Biederman's netns tagging patch
8commit msg)
9
10The problem. Network devices show up in sysfs and with the network
11namespace active multiple devices with the same name can show up in
12the same directory, ouch!
13
14To avoid that problem and allow existing applications in network
15namespaces to see the same interface that is currently presented in
16sysfs, sysfs now has tagging directory support.
17
18By using the network namespace pointers as tags to separate out the
19the sysfs directory entries we ensure that we don't have conflicts
20in the directories and applications only see a limited set of
21the network devices.
22
Ulf Magnusson9ba41322015-09-02 14:34:53 +020023Each sysfs directory entry may be tagged with a namespace via the
Mauro Carvalho Chehabec4551f2020-04-27 23:17:18 +020024``void *ns member`` of its ``kernfs_node``. If a directory entry is tagged,
25then ``kernfs_node->flags`` will have a flag between KOBJ_NS_TYPE_NONE
Ulf Magnusson9ba41322015-09-02 14:34:53 +020026and KOBJ_NS_TYPES, and ns will point to the namespace to which it
27belongs.
Serge E. Hallynb9d8b452010-05-04 21:45:38 -050028
Mauro Carvalho Chehabec4551f2020-04-27 23:17:18 +020029Each sysfs superblock's kernfs_super_info contains an array
30``void *ns[KOBJ_NS_TYPES]``. When a task in a tagging namespace
Serge E. Hallynb9d8b452010-05-04 21:45:38 -050031kobj_nstype first mounts sysfs, a new superblock is created. It
32will be differentiated from other sysfs mounts by having its
Mauro Carvalho Chehabec4551f2020-04-27 23:17:18 +020033``s_fs_info->ns[kobj_nstype]`` set to the new namespace. Note that
Serge E. Hallynb9d8b452010-05-04 21:45:38 -050034through bind mounting and mounts propagation, a task can easily view
35the contents of other namespaces' sysfs mounts. Therefore, when a
36namespace exits, it will call kobj_ns_exit() to invalidate any
Ulf Magnusson9ba41322015-09-02 14:34:53 +020037kernfs_node->ns pointers pointing to it.
Serge E. Hallynb9d8b452010-05-04 21:45:38 -050038
39Users of this interface:
Mauro Carvalho Chehabec4551f2020-04-27 23:17:18 +020040
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
Serge E. Hallynb9d8b452010-05-04 21:45:38 -050044 - current_ns() which returns current's namespace
45 - netlink_ns() which returns a socket's namespace
46 - initial_ns() which returns the initial namesapce
Mauro Carvalho Chehabec4551f2020-04-27 23:17:18 +020047
Serge E. Hallynb9d8b452010-05-04 21:45:38 -050048- call kobj_ns_exit() when an individual tag is no longer valid