RK3588 kernel-6.1 fs/ext4/sysfs.c sysfs / proc 调试与调参接口分析

RK3588 kernel-6.1 fs/ext4/sysfs.c sysfs / proc 调试与调参接口分析

1. 分析范围

  • rk3588/kernel-6.1/fs/ext4/sysfs.c
  • 挂载/卸载钩子:ext4_register_sysfs / ext4_unregister_sysfs(由 super.c 等在合适生命周期调用;注释要求 卸载时先于 journal teardown
  • 协作:super.cext4_seq_options_show、错误计数 notify)、mballoc.cext4_mb_seq_*)、extents.cext4_seq_es_shrinker_info_show)、fast_commit.cext4_fc_info_show

2. 代码作用(一句话)

sysfs.c 为每个已挂载的 ext4 卷在 /sys/fs/ext4/<设备名> 注册 s_kobj,用统一的 struct ext4_attr + calc_ptrext4_sb_info/ext4_super_block 字段特例回调 暴露为 可读/可写 sysfs 属性;并在 /proc/fs/ext4/<设备名> 下挂 optionsmb_groups、fast commit、extent shrinkerseq_file 接口;全局 /sys/fs/ext4/features 下列出 本内核编译进 ext4 的可选能力ext4_notify_error_sysfs** 在错误计数变化时 sysfs_notify 便于用户态轮询。**


3. 解决了什么问题

问题 sysfs.c 中的处理方式
运维需要看清「这一_mount」的写量、预分配、延迟分配 delayed_allocation_blockss_dirtyclusters_counter 换块)、session_write_kbytes/lifetime_write_kbytespart_stat 与挂载初值、s_kbytes_written
在线调 mballoc / inode 读预读 / extent zeroout 等行为 mb_*inode_goalextent_max_zeroout_kbmb_prefetch*last_trim_minblks 等映射到 ext4_sb_info 字段(多数 0644 可写)
预留簇(quota/管理用) reserved_clusterskstrtoull + 上限为卷簇数,写入 s_resv_clusters
日志线程是谁、是否存活 journal_task:输出 jbd2 j_task 的 pid,无 journal 为 <none>
Correlating 内核报错与盘上 s_error_* 只读errors_countfirst/last_error_{ino,block,line,func,errcode,time},时间用 superblock 中 32+8 位时间戳time64_t 输出
限流 spam 可写:err/warning/msg_ratelimit_{interval_ms,burst}sbiratelimit_state
回归/故障注入 trigger_fs_error0200CAP_SYS_ADMINext4_error);CONFIG_EXT4_DEBUGsimulate_fail
用户态要知道「当前内核 ext4 编进了哪些特性」 /sys/fs/ext4/features/*:各属性 show 固定 supported,列表随 Kconfig 变化(encryption、casefold、verity、fast_commit 等)
/proc/mounts 以外还要看实际 mount 选项 /proc/fs/ext4/xxx/optionsext4_seq_options_show
大块分配器内部状态难查 mb_groupsmb_statsmb_structs_summaryseq opsmballoc.c
extent 状态树 shrinker / fast commit 状态 es_shrinker_infofc_info
错误监控事件 ext4_notify_error_sysfs:通知 errors_count,便于 inotify/udev 类工具
卸载顺序与 sysfs 并发 ext4_unregister_sysfsremove_proc_subtree + kobject_delsuper.c 要求 先于 jbd2_journal_destroy,避免 sysfs 仍访问 j_task

4. 机制摘要

4.1 属性分发器

  • calc_ptr:按 attr_ptr 把属性绑定到 sbi 某偏移s_es 某偏移,或 显式全局指针(如 max_writeback_mb_bump 指向静态 old_bump_val=128,只读兼容项)。
  • ext4_attr_show/ext4_attr_store:根据 attr_id/attr_id_t 分支;对 ext4_super_blockpointer_ui 在 show/store 中使用 小端 le32 / le64 转换
  • inode_readahead_blks:写入要求 2 的幂且不超过上界,否则 -EINVAL

4.2 每文件系统 kobject

  • ext4_sb_ktypedefault_groups = ext4_groups(由 ext4_attrs[] + ATTRIBUTE_GROUPS(ext4) 生成)、release = ext4_sb_releasecomplete(s_kobj_unregister),与 super.ckobject_put + wait_for_completion 配对。

4.3 全局 features kobject

  • ext4_feat_ktypereleasekfree(kobj)(该 kobject 为 kzalloc 的单独对象);子属性全部 attr_feature → show supported\n

4.4 proc 目录

  • ext4_proc_rootproc_mkdir("fs/ext4", NULL),与 sysfs fs/ext4 命名并列,路径为 /proc/fs/ext4/<sb->s_id>
  • proc_create_*sb 传入 single/seq,供 options 与 mballoc 导出

5. 与用户可见路径对照(逻辑)

路径前缀 含义
/sys/fs/ext4/<s_id>/... 该卷 sysfs 调参/只读统计
/sys/fs/ext4/features/... 本内核支持的 ext4 编译期特性占位文件
/proc/fs/ext4/<s_id>/... options / mb_ / fc / es_shrinker* 等 proc seq

<s_id> 一般为块设备标识字符串(如 sda1),与 super_block->s_id 一致。


6. 小结

sysfs.c 不参与数据路径 I/O,负责 可观测性与可调参数:把 内存/超级块中的计数与调参位 暴露给 sysfs,把 更长的调试报表 放在 proc seq;并通过 features 目录 区分 「文件系统特性位」「内核是否支持某能力」。修改 ext4_sb_info 运行参数 时需注意 与 mount 选项、锁及与其他子系统的语义(例如 reserved_clusters 影响可用空闲统计),此类细节仍以 mballoc/super 实现为准。

若需对照 挂载选项序列化,见 super.cext4_seq_options_showmballoc 导出字段含义mballoc.c

文章互动

阅读 --

留言

0 条留言

正在加载留言…