如何在Linux内核中获取/sys/fs/f2fs的kobject与kset结构体?
解决方法
首先,fs_kobj对应/sys/fs目录的kobject,它本身并不属于任何kset,因此fs_kobj->kset为空是正常现象,不能用kset_find_obj来查找它的子节点。要获取/sys/fs/f2fs对应的kobject和kset,需从fs_kobj的子节点直接查找,具体步骤如下:
确保正确获取
fs_kobj
内核提供全局变量fs_kobj(定义在fs/fs_sysfs.c,可通过extern struct kobject *fs_kobj;引用),直接对应/sys/fs目录的kobject。若无法直接访问该全局变量,可通过/sys根kobject(sysfs_kobj)查找"fs"子节点:struct kobject *fs_kobj = kobject_find_by_name(sysfs_kobj, "fs"); if (!fs_kobj) { // 处理获取失败逻辑 return ERR_PTR(-ENOENT); }查找/sys/fs/f2fs对应的kobject
- 内核5.1及以上版本,可直接用
kobject_get_child函数:struct kobject *f2fs_kobj = kobject_get_child(fs_kobj, "f2fs"); if (!f2fs_kobj) { // f2fs未挂载或sysfs节点未创建,处理错误 kobject_put(fs_kobj); return ERR_PTR(-ENOENT); } - 5.1之前的旧内核,需遍历
fs_kobj的子节点链表:struct kobject *f2fs_kobj = NULL; struct kobj_entry *entry; mutex_lock(&fs_kobj->mutex); list_for_each_entry(entry, &fs_kobj->entry, node) { if (strcmp(entry->name, "f2fs") == 0) { f2fs_kobj = kobject_get(entry->kobj); break; } } mutex_unlock(&fs_kobj->mutex); if (!f2fs_kobj) { kobject_put(fs_kobj); return ERR_PTR(-ENOENT); }
- 内核5.1及以上版本,可直接用
获取f2fs对应的kset
拿到f2fs_kobj后,直接访问其kset成员即可:struct kset *f2fs_kset = f2fs_kobj->kset; if (!f2fs_kset) { // 处理f2fs kobject未关联kset的情况 }释放资源
操作完成后,调用kobject_put释放kobject,避免内存泄漏:kobject_put(f2fs_kobj); kobject_put(fs_kobj); // 若fs_kobj是通过kobject_find_by_name获取的
注意事项:
- 遍历kobject子节点时必须持有对应mutex,避免并发访问问题。
- 若f2fs未挂载,对应的sysfs节点可能不存在,需处理查找失败的逻辑。
- 不同内核版本的sysfs API存在差异,需根据目标版本调整代码。
内容的提问来源于stack exchange,提问作者user1651758
相关产品推荐
相关产品推荐

