文件/fs/kernfs/dir.c

/**
 * kernfs_link_sibling - 链接kernfs_node到sibling rbtree(兄弟红黑树)上
 * @kn: kernfs_node of interest
 *
 * Link @kn into its sibling rbtree which starts from
 * @kn->parent->dir.children.
 *
 * Locking:
 * mutex_lock(kernfs_mutex)
 *
 * RETURNS:
 * 成功返回0,失败返回 -EEXIST
 */
static int kernfs_link_sibling(struct kernfs_node *kn)
{
        struct rb_node **node = &kn->parent->dir.children.rb_node;
        struct rb_node *parent = NULL;

if (kernfs_type(kn) == KERNFS_DIR)
                kn->parent->dir.subdirs++;

while (*node) {
                struct kernfs_node *pos;
                int result;

pos = rb_to_kn(*node);
                parent = *node;
                result = kernfs_sd_compare(kn, pos);
                if (result < 0)
                        node = &pos->rb.rb_left;
                else if (result > 0)
                        node = &pos->rb.rb_right;
                else
                        return -EEXIST;
        }
        /* add new node and rebalance the tree */
        rb_link_node(&kn->rb, parent, node);
        rb_insert_color(&kn->rb, &kn->parent->dir.children);
        return 0;
}

#define rb_to_kn(X) rb_entry((X), struct kernfs_node, rb)

文件/include/linux/rbtree.h

#define rb_entry(ptr, type, member) container_of(ptr, type, member)

莫名其妙就跑到红黑树的源码里面去了,好吧,下次再也不能说我不知道红黑树是个什么东西了,具体实现还是放到以后研究,总之从感性上来看,红黑树是一个高性能的二叉树

文件/fs/kernfs/dir.c

static int kernfs_sd_compare(const struct kernfs_node *left,
    const struct kernfs_node *right)
{
        return kernfs_name_compare(left->hash, left->name, left->ns, right);
}

static int kernfs_name_compare(unsigned int hash, const char *name,
      const void *ns, const struct kernfs_node *kn)
{
        if (hash != kn->hash)
                return hash - kn->hash;
        if (ns != kn->ns)
                return ns - kn->ns;
        return strcmp(name, kn->name);
}

关于红黑树的实现,可以参考http://kerneltravel.net/jiaoliu/kern-rbtree.html

这里才总算是把该kobject加入到了sysfs中.

kernfs_link_sibling相关推荐

  1. 设备初始化缩水篇(一)

    之前的都是直接复制,稍微翻译了一下,不过代码太乱,没有头绪,这里简化一下看看能否有一点头绪 int __init devices_init(void) {         devices_kset = ...

  2. kernfs_addrm_start kernfs_add_one

    linux内核版本3.14.3 文件/fs/kernfs/dir.c /**  * kernfs_addrm_start - 为kernfs_node添加/删除准备  * @acxt: 指向要使用的k ...

最新文章

  1. 从信息传递的视角看因果关系
  2. jvm系列(六):Java服务GC参数调优案例
  3. Spring 面试问题
  4. netframework转core时文件响应流问题
  5. 何杰月c语言课程,北京西城区教育科研月:学科核心素养的教学探索
  6. 学习ccna,ccnp中如何提高英语问题
  7. 数据挖掘工具软件Weka学习教程
  8. Amazon Alexa 新里程碑: 50000 个功能、 20000 种设备、 3500 个品牌
  9. 小甲鱼 OllyDbg 教程系列 (五) : 破解 PC Surgeon 之 查找字符串
  10. 《大数据》2020年第3期目次摘要
  11. 运维真的被云革命掉了吗?
  12. latex 基本用法(五)
  13. 帖子如何实现显示浏览次数_我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程...
  14. c语言上机作业题及答案,2017计算机二级C语言上机测试题附答案
  15. 计算机的ps快捷键,ps快捷键常用表
  16. Android知识梳理:点击事件分发机制
  17. 程序员如何提高影响力
  18. 软件测试找游戏bug,游戏测试用例及游戏测试bug详解
  19. 【近五千字纯手撸】✨前后一个月面试30家中大型高级、资深java工程师终获500强公司offer心得以及经过
  20. HP打印机无线网共享打印方法(型号P1007)

热门文章

  1. 2022-2028年中国重油行业市场研究及前瞻分析报告
  2. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
  3. Go 学习笔记(40)— Go 标准库之 log
  4. (康托展开解释)+ NYOJ 139 我排第几个
  5. 2017-04-09,周日整理
  6. scapy windows install
  7. 可以发张图片做链接用吗
  8. WebApi2官网学习记录---异常处理
  9. ThinkPHP基础概念
  10. 用tcpdump查看端口包