Back to home page

OSCL-LXR

 
 

    


0001 .. SPDX-License-Identifier: GPL-2.0
0002 
0003 =============
0004 Sysfs tagging
0005 =============
0006 
0007 (Taken almost verbatim from Eric Biederman's netns tagging patch
0008 commit msg)
0009 
0010 The problem.  Network devices show up in sysfs and with the network
0011 namespace active multiple devices with the same name can show up in
0012 the same directory, ouch!
0013 
0014 To avoid that problem and allow existing applications in network
0015 namespaces to see the same interface that is currently presented in
0016 sysfs, sysfs now has tagging directory support.
0017 
0018 By using the network namespace pointers as tags to separate out
0019 the sysfs directory entries we ensure that we don't have conflicts
0020 in the directories and applications only see a limited set of
0021 the network devices.
0022 
0023 Each sysfs directory entry may be tagged with a namespace via the
0024 ``void *ns member`` of its ``kernfs_node``.  If a directory entry is tagged,
0025 then ``kernfs_node->flags`` will have a flag between KOBJ_NS_TYPE_NONE
0026 and KOBJ_NS_TYPES, and ns will point to the namespace to which it
0027 belongs.
0028 
0029 Each sysfs superblock's kernfs_super_info contains an array
0030 ``void *ns[KOBJ_NS_TYPES]``.  When a task in a tagging namespace
0031 kobj_nstype first mounts sysfs, a new superblock is created.  It
0032 will be differentiated from other sysfs mounts by having its
0033 ``s_fs_info->ns[kobj_nstype]`` set to the new namespace.  Note that
0034 through bind mounting and mounts propagation, a task can easily view
0035 the contents of other namespaces' sysfs mounts.  Therefore, when a
0036 namespace exits, it will call kobj_ns_exit() to invalidate any
0037 kernfs_node->ns pointers pointing to it.
0038 
0039 Users of this interface:
0040 
0041 - define a type in the ``kobj_ns_type`` enumeration.
0042 - call kobj_ns_type_register() with its ``kobj_ns_type_operations`` which has
0043 
0044   - current_ns() which returns current's namespace
0045   - netlink_ns() which returns a socket's namespace
0046   - initial_ns() which returns the initial namesapce
0047 
0048 - call kobj_ns_exit() when an individual tag is no longer valid