You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的子节点直接查找,具体步骤如下:

  1. 确保正确获取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);
    }
    
  2. 查找/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);
      }
      
  3. 获取f2fs对应的kset
    拿到f2fs_kobj后,直接访问其kset成员即可:

    struct kset *f2fs_kset = f2fs_kobj->kset;
    if (!f2fs_kset) {
        // 处理f2fs kobject未关联kset的情况
    }
    
  4. 释放资源
    操作完成后,调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:10:49