/*
 * populate_dir - populate directory with attributes.创建属性文件来填充目录
 * @kobj: object we're working on.我们正在处理的object
 *
 * 大部分的子系统有一套默认属性,并与其一起注册。在object注册的时候,
 * 循环子系统的默认属性并为子系统创建属性文件是极好的。
 */
static int populate_dir(struct kobject *kobj)
{
        struct kobj_type *t = get_ktype(kobj);
        struct attribute *attr;
        int error = 0;
        int i;

if (t && t->default_attrs) {
                for (i = 0; (attr = t->default_attrs[i]) != NULL; i++) {
                        error = sysfs_create_file(kobj, attr);
                        if (error)
                                break;
                }
        }
        return error;

}

文件/linux/sysfs.h

static inline int __must_check sysfs_create_file(struct kobject *kobj,
const struct attribute *attr)
{
return sysfs_create_file_ns(kobj, attr, NULL);
}

文件/fs/sysfs/file.c

/**
 * sysfs_create_file_ns - 根据ns为object创建一个属性文件
 * @kobj: object we're creating for
 * @attr: 属性描述符
 * @ns: 新文件属于的命名空间
 */
int sysfs_create_file_ns(struct kobject *kobj, const struct attribute *attr,
const void *ns)
{
        BUG_ON(!kobj || !kobj->sd || !attr);

return sysfs_add_file_mode_ns(kobj->sd, attr, false, attr->mode, ns);
}

文件/fs/sysfs/file.c  要不还是别深究了吧,没有文档的,没人看的懂

int sysfs_add_file_mode_ns(struct kernfs_node *parent,
  const struct attribute *attr, bool is_bin,
  umode_t mode, const void *ns)
{
struct lock_class_key *key = NULL;
const struct kernfs_ops *ops;
struct kernfs_node *kn;
loff_t size;

if (!is_bin) {
struct kobject *kobj = parent->priv;
const struct sysfs_ops *sysfs_ops = kobj->ktype->sysfs_ops;

/* every kobject with an attribute needs a ktype assigned */
if (WARN(!sysfs_ops, KERN_ERR
"missing sysfs attribute operations for kobject: %s\n",
kobject_name(kobj)))
return -EINVAL;

if (sysfs_ops->show && sysfs_ops->store)
ops = &sysfs_file_kfops_rw;
else if (sysfs_ops->show)
ops = &sysfs_file_kfops_ro;
else if (sysfs_ops->store)
ops = &sysfs_file_kfops_wo;
else
ops = &sysfs_file_kfops_empty;

size = PAGE_SIZE;
} else {
struct bin_attribute *battr = (void *)attr;

if (battr->mmap)
ops = &sysfs_bin_kfops_mmap;
else if (battr->read && battr->write)
ops = &sysfs_bin_kfops_rw;
else if (battr->read)
ops = &sysfs_bin_kfops_ro;
else if (battr->write)
ops = &sysfs_bin_kfops_wo;
else
ops = &sysfs_file_kfops_empty;

size = battr->size;
}

#ifdef CONFIG_DEBUG_LOCK_ALLOC
if (!attr->ignore_lockdep)
key = attr->key ?: (struct lock_class_key *)&attr->skey;
#endif
kn = __kernfs_create_file(parent, attr->name, mode, size, ops,
 (void *)attr, ns, true, key);
if (IS_ERR(kn)) {
if (PTR_ERR(kn) == -EEXIST)
sysfs_warn_dup(parent, attr->name);
return PTR_ERR(kn);
}
return 0;
}

populate_dir相关推荐

  1. 通过打印学习Linux内核之sysfs(1)

    先研究 /lib/kobject.c 吧 先打开该文件把所有的pr_info或者pr_err全部改为printk,能多打印就多打印了 哦,如果要修改代码,我们可以选择用vim,如果你喜欢的话,不过我们 ...

  2. kset_register

    本文中的源码均来自linux内核3.14.3版本/lib/kobject.c文件 /**  * kset_register - 初始化并添加一个kset  * @k: kset.  */ int ks ...

  3. LINUX设备驱动之设备模型一--kobject

    http://blog.csdn.net/yangzhu1982/article/details/6186016 Linux设备驱动之设备模型一kobject Eric Fang  2010-01-1 ...

  4. Linux通常把设备对象抽象为,linux 设备模型(1)

    设备模型(一) 一.概述 从2.6内核引入了sysfs文件系统,与proc, devfs, devpty同类别,属于虚拟的文件系统.目的是展示设备驱动模型中各组件的层次关系,第一层目录:block, ...

  5. 研究UEVENT相关东西,看到2篇优秀的博文,转载与此

    http://blog.chinaunix.net/u3/92745/showart_2145668.html LINUX设备驱动之设备模型一--kobject LINUX设备驱动驱动程序模型的核心数 ...

  6. linux驱动之I2C

    include/linux/i2c.h struct i2c_msg; struct i2c_algorithm; struct i2c_adapter; struct i2c_client; str ...

  7. Linux设备模型(4)_sysfs

    转载于: http://www.wowotech.net/linux_kenrel/dm_sysfs.html 1. 前言 sysfs是一个基于RAM的文件系统,它和Kobject一起,可以将Kern ...

  8. linux设备模型深探

    ------------------------------------------ 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ -------- ...

  9. 设备驱动中的kobject(kernel-4.7)

    kobject是Linux设备模型的最底层数据结构,它代表一个内核对象. kobject结构体定义在include/linux/kobject.h文件中: struct kobject {const ...

最新文章

  1. c 语言寻找最小生成树,求助,关于求无向图的最小生成树代码
  2. asp.net 添加成功弹出个div提示_Word双栏目录怎么做,这3个步骤早知道,让人眼前一亮...
  3. 墓志铭:非常了得其实早已死了
  4. android10位置信息,Android 11 中的位置信息更新
  5. 回复邮件时如何不要邮件头_如何为阅读,点击和回复率达到100%的CEO设计一封冷邮件...
  6. 基于MaxCompute搭建社交好友推荐系统
  7. 论坛在线时间挂机器_直播预告 | 智控未来——控制与机器人专题研讨会
  8. Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed betwee...
  9. 【安卓的一个进程等级】
  10. 阅读器关闭时尝试调用 Read 无效
  11. Debian 10 使用 rz sz 命令
  12. Android学习笔记3-开发过程中一些常用操作
  13. 站在巨人的肩膀上(转载)
  14. 集团企业邮箱申请哪家的好,怎么选择?
  15. [NLP]预处理--使用re正则化进行文本清理
  16. 如何使用 JavaScript 显示/隐藏或切换 DIV 元素
  17. Java找图 (截屏找图 大图找小图)--自己实现“按键精灵”
  18. Git 常用指令记录
  19. 高防IP适合那些行业呢?
  20. csapp程序人生大作业

热门文章

  1. C++ 继承与多继承
  2. HarmonyOS Text超出部分末尾显示...
  3. Java this 关键字使用
  4. Android运行时候报错:android.view.InflateException: Binary XML file line #19: Binary XML file lin
  5. Preview is unavailable until a successful build
  6. linux常用命令(转载)
  7. css中的display属性之li元素
  8. 手动添加Cookie
  9. 如何更优雅地对接第三方API
  10. 数据结构学习(十三)、快速排序