kernfs_link_sibling
文件/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相关推荐
- 设备初始化缩水篇(一)
之前的都是直接复制,稍微翻译了一下,不过代码太乱,没有头绪,这里简化一下看看能否有一点头绪 int __init devices_init(void) { devices_kset = ...
- kernfs_addrm_start kernfs_add_one
linux内核版本3.14.3 文件/fs/kernfs/dir.c /** * kernfs_addrm_start - 为kernfs_node添加/删除准备 * @acxt: 指向要使用的k ...
最新文章
- 从信息传递的视角看因果关系
- jvm系列(六):Java服务GC参数调优案例
- Spring 面试问题
- netframework转core时文件响应流问题
- 何杰月c语言课程,北京西城区教育科研月:学科核心素养的教学探索
- 学习ccna,ccnp中如何提高英语问题
- 数据挖掘工具软件Weka学习教程
- Amazon Alexa 新里程碑: 50000 个功能、 20000 种设备、 3500 个品牌
- 小甲鱼 OllyDbg 教程系列 (五) : 破解 PC Surgeon 之 查找字符串
- 《大数据》2020年第3期目次摘要
- 运维真的被云革命掉了吗?
- latex 基本用法(五)
- 帖子如何实现显示浏览次数_我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程...
- c语言上机作业题及答案,2017计算机二级C语言上机测试题附答案
- 计算机的ps快捷键,ps快捷键常用表
- Android知识梳理:点击事件分发机制
- 程序员如何提高影响力
- 软件测试找游戏bug,游戏测试用例及游戏测试bug详解
- 【近五千字纯手撸】✨前后一个月面试30家中大型高级、资深java工程师终获500强公司offer心得以及经过
- HP打印机无线网共享打印方法(型号P1007)
热门文章
- 2022-2028年中国重油行业市场研究及前瞻分析报告
- c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
- Go 学习笔记(40)— Go 标准库之 log
- (康托展开解释)+ NYOJ 139 我排第几个
- 2017-04-09,周日整理
- scapy windows install
- 可以发张图片做链接用吗
- WebApi2官网学习记录---异常处理
- ThinkPHP基础概念
- 用tcpdump查看端口包