kset_create_and_add

我也是初学,做一些学习笔记,总结到哪里算哪里吧


本文中所有代码都是来自linux内核源文件/lib/kobject.c

/**
 * kset_create_and_add - 创建一个动态的kset 结构并添加到sysfs中

 *
 * @name:  kset名称
 * @uevent_ops: kset的kset_uevent_ops 结构
 * @parent_kobj: kset的付kobject,如果有的话
 *
 * 该方法创建一个动态的kset结构,并注册到sysfs上。用完该结构之后

 * 调用kset_unregister() ,该结构将会被动态的释放,之后该结构将不再

 * 被使用。

 *
 * 当无法创建kset,将返回NULL
 */
struct kset *kset_create_and_add(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
{
        struct kset *kset;
        int error;

        kset = kset_create(name, uevent_ops, parent_kobj);
        if (!kset)
                return NULL;
        error = kset_register(kset);
        if (error) {
                kfree(kset);
                return NULL;
        }
        return kset;
}


/**

 * kset_create - 动态创建kset结构
 *
 * @name: kset名称
 * @uevent_ops: kset的kset_uevent_ops 结构
 * @parent_kobj: kset的付kobject,如果有的话
 *
 * 该方法动态的创建一个kset结构。该结构可以注册到系统中,并在调用
 * kset_register()之后再sysfs中显示。使用完该结构之后,如果调用了
 * kset_register() ,需要调用kset_unregister(),该结构将动态的释放,并
 * 不会被继续使用。
 *
 * 如果无法创建kset将返回NULL
 */
static struct kset *kset_create(const char *name,
                const struct kset_uevent_ops *uevent_ops,
                struct kobject *parent_kobj)
{
        struct kset *kset;
        int retval;

        kset = kzalloc(sizeof(*kset), GFP_KERNEL);
        if (!kset)
                return NULL;
        retval = kobject_set_name(&kset->kobj, "%s", name);
        if (retval) {
                kfree(kset);
                return NULL;
        }
        kset->uevent_ops = uevent_ops;
        kset->kobj.parent = parent_kobj;

        /*
        * 当属于该kset的kobject,有一个不属于该kset的kset_ktype 
        * 类型.  那样,当我们使用完它之后,可以正确的释放。
        */
        kset->kobj.ktype = &kset_ktype;
        kset->kobj.kset = NULL;

        return kset;
}


/**
 * kobject_set_name - 设置kobject的名称
 * @kobj: 需要设置名称的struct kobject
 * @fmt: 构建名称的字符串格式
 *
 * 这里设置kobject名称.  如果已经将该kobject添加到system中,
 * 那么你必须调用kobject_rename()来改变kobject的名称。
 */
int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
{
        va_list vargs;
        int retval;

        va_start(vargs, fmt);
        retval = kobject_set_name_vargs(kobj, fmt, vargs);
        va_end(vargs);

        return retval;
}


/**
 * kobject_set_name_vargs - 设置一个kobject的名称
 * @kobj: 要设置名称的kobject
 * @fmt: 用了构建名称的字符串格式
 * @vargs: 构建字符串的参数
 */
int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
 va_list vargs)
{
        const char *old_name = kobj->name;
        char *s;

        if (kobj->name && !fmt)
                return 0;

        kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
        if (!kobj->name) {
                kobj->name = old_name;
                return -ENOMEM;
        }

        /* ewww... some of these buggers have '/' in the name ... 名称中不能用‘/’*/

        while ((s = strchr(kobj->name, '/')))
                s[0] = '!';

        kfree(old_name);
        return 0;
}


好吧,关于kvasprintf这里就不再继续挖下去了,猜应该是类似sprintf的一个方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值