Sysfs 标签

(几乎逐字摘自 Eric Biederman 的 netns 标签补丁提交消息)

问题。网络设备出现在 sysfs 中,并且在网络命名空间处于活动状态时,多个具有相同名称的设备可能会出现在同一目录中,糟糕!

为了避免这个问题,并允许网络命名空间中现有的应用程序看到当前在 sysfs 中呈现的相同接口,sysfs 现在具有标签目录支持。

通过使用网络命名空间指针作为标签来分隔 sysfs 目录条目,我们确保目录中没有冲突,并且应用程序只能看到有限的一组网络设备。

每个 sysfs 目录条目都可以通过其 kernfs_nodevoid *ns 成员 用命名空间标记。如果目录条目被标记,则 kernfs_node->flags 将具有 KOBJ_NS_TYPE_NONE 和 KOBJ_NS_TYPES 之间的标志,并且 ns 将指向它所属的命名空间。

每个 sysfs 超级块的 kernfs_super_info 包含一个数组 void *ns[KOBJ_NS_TYPES]。当标记命名空间 kobj_nstype 中的任务首次挂载 sysfs 时,会创建一个新的超级块。它将通过将其 s_fs_info->ns[kobj_nstype] 设置为新命名空间来与其他 sysfs 挂载区分开来。请注意,通过绑定挂载和挂载传播,任务可以轻松查看其他命名空间的 sysfs 挂载的内容。因此,当命名空间退出时,它将调用 kobj_ns_exit() 来使任何指向它的 kernfs_node->ns 指针无效。

此接口的用户

  • kobj_ns_type 枚举中定义一个类型。

  • 使用其 kobj_ns_type_operations 调用 kobj_ns_type_register(),它具有

    • current_ns(),它返回当前的命名空间

    • netlink_ns(),它返回套接字的命名空间

    • initial_ns(),它返回初始命名空间

  • 当单个标签不再有效时,调用 kobj_ns_exit()