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的一個方法
總結
以上是生活随笔為你收集整理的kset_create_and_add的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux设备:初始化
- 下一篇: kset_register