populate_dir
/*
* 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相关推荐
- 通过打印学习Linux内核之sysfs(1)
先研究 /lib/kobject.c 吧 先打开该文件把所有的pr_info或者pr_err全部改为printk,能多打印就多打印了 哦,如果要修改代码,我们可以选择用vim,如果你喜欢的话,不过我们 ...
- kset_register
本文中的源码均来自linux内核3.14.3版本/lib/kobject.c文件 /** * kset_register - 初始化并添加一个kset * @k: kset. */ int ks ...
- LINUX设备驱动之设备模型一--kobject
http://blog.csdn.net/yangzhu1982/article/details/6186016 Linux设备驱动之设备模型一kobject Eric Fang 2010-01-1 ...
- Linux通常把设备对象抽象为,linux 设备模型(1)
设备模型(一) 一.概述 从2.6内核引入了sysfs文件系统,与proc, devfs, devpty同类别,属于虚拟的文件系统.目的是展示设备驱动模型中各组件的层次关系,第一层目录:block, ...
- 研究UEVENT相关东西,看到2篇优秀的博文,转载与此
http://blog.chinaunix.net/u3/92745/showart_2145668.html LINUX设备驱动之设备模型一--kobject LINUX设备驱动驱动程序模型的核心数 ...
- linux驱动之I2C
include/linux/i2c.h struct i2c_msg; struct i2c_algorithm; struct i2c_adapter; struct i2c_client; str ...
- Linux设备模型(4)_sysfs
转载于: http://www.wowotech.net/linux_kenrel/dm_sysfs.html 1. 前言 sysfs是一个基于RAM的文件系统,它和Kobject一起,可以将Kern ...
- linux设备模型深探
------------------------------------------ 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ -------- ...
- 设备驱动中的kobject(kernel-4.7)
kobject是Linux设备模型的最底层数据结构,它代表一个内核对象. kobject结构体定义在include/linux/kobject.h文件中: struct kobject {const ...
最新文章
- c 语言寻找最小生成树,求助,关于求无向图的最小生成树代码
- asp.net 添加成功弹出个div提示_Word双栏目录怎么做,这3个步骤早知道,让人眼前一亮...
- 墓志铭:非常了得其实早已死了
- android10位置信息,Android 11 中的位置信息更新
- 回复邮件时如何不要邮件头_如何为阅读,点击和回复率达到100%的CEO设计一封冷邮件...
- 基于MaxCompute搭建社交好友推荐系统
- 论坛在线时间挂机器_直播预告 | 智控未来——控制与机器人专题研讨会
- Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed betwee...
- 【安卓的一个进程等级】
- 阅读器关闭时尝试调用 Read 无效
- Debian 10 使用 rz sz 命令
- Android学习笔记3-开发过程中一些常用操作
- 站在巨人的肩膀上(转载)
- 集团企业邮箱申请哪家的好,怎么选择?
- [NLP]预处理--使用re正则化进行文本清理
- 如何使用 JavaScript 显示/隐藏或切换 DIV 元素
- Java找图 (截屏找图 大图找小图)--自己实现“按键精灵”
- Git 常用指令记录
- 高防IP适合那些行业呢?
- csapp程序人生大作业
热门文章
- C++ 继承与多继承
- HarmonyOS Text超出部分末尾显示...
- Java this 关键字使用
- Android运行时候报错:android.view.InflateException: Binary XML file line #19: Binary XML file lin
- Preview is unavailable until a successful build
- linux常用命令(转载)
- css中的display属性之li元素
- 手动添加Cookie
- 如何更优雅地对接第三方API
- 数据结构学习(十三)、快速排序