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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值