kernfs_link_sibling

来源:互联网 发布:iphone移动数据快速 编辑:程序博客网 时间:2024/06/15 05:32

文件/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中.


0 0
原创粉丝点击