RK3588 kernel-6.1 fs/ext4/super.c 超级块与挂载生命周期分析
1. 分析范围
rk3588/kernel-6.1/fs/ext4/super.c(体量大,单一源文件覆盖:注册文件系统类型、fill_super/挂载上下文、超级块与块组描述符校验、journal 装载与回收、super_operations/配额/NFS export、错误处理与只读降级、freeze/sync、lazy inode table 初始化、以及ext4_read_bh等跨模块公用辅助)- 协作:
ext4_jbd2.c(日志)、inode.c(ext4_iget、root)、mballoc.c、sysfs.c、resize.c(ext4_alloc_flex_bg_array等同名能力在别文件亦有入口)、xattr/acl/fscrypt
2. 代码作用(一句话)
super.c 定义 ext4 在 VFS 层的 「整卷对象」:模块 __init 顺序注册 ext4(及可选 ext3/ext2 别名);ext4_init_fs_context + ext4_get_tree → ext4_fill_super → __ext4_fill_super** 读 主超级块、校验 feature/metadata 校验和、解析并一致性检查 挂载参数、初始化 ext4_sb_info 几何与 per-cpu 计数器、ext4_group_desc_init/ext4_check_descriptors、按需 ext4_load_and_init_journal(含 recovery)、ext4_iget(ROOT)、ext4_setup_super 更新 挂载计数与状态位、ext4_mb_init/ext4_ext_init 等子系统;卸载时 ext4_put_super 按序 拆 sysfs、停 lazyinit、销毁 journal、写回干净 superblock、释放 GDT/flex/mballoc 资源;并通过 ext4_sops 向内核提供 inode 生命周期、sync、statfs、quota、show_options 等回调。**
3. 解决了什么问题
| 问题 | super.c 中的处理方式 |
|---|---|
| 如何安全挂卷 | __ext4_fill_super:ext4_load_super → ext4_superblock_csum_*、ext4_init_metadata_csum;ext4_feature_set_ok/ext4_check_feature_compatibility;几何 ext4_geometry_check/generic_check_addressable;ext4_group_desc_init + ext4_check_descriptors(位图/itb 与 sb/GDT 不交叠、ext4_group_desc_csum_verify) |
| 卷级参数与内核能力是否匹配 | ext4_parse_param(fs_parameter_spec):data=、journal_*、quota、DAX、block_validity、fast commit debug 等;ext4_check_opt_consistency(如 bigalloc 与 data=journal、DAX 与 inline_data) |
| ext2/ext3 兼容名 | 条件编译 ext2_fs_type/ext3_fs_type 共享 ext4_init_fs_context;ext2_feature_set_ok/ext3_feature_set_ok |
| 日志与崩溃恢复 | ext4_load_and_init_journal;needs_recovery(s_last_orphan/orphan_present/journal_needs_recovery);NOLOAD 且需 recovery 则拒绝 rw 挂载 |
| 多挂载保护与 MMP | ext4_multi_mount_protect(feature mmp 且 rw) |
| 根 inode 先于业务可用 | 先 journal 再 ext4_iget(EXT4_ROOT_INO)(注释:根可能在日志中未回放) |
| 元数据错误如何反映到卷 | __ext4_error/ext4_handle_error:EXT4_ERROR_FS、save_error_info(首/末错与时间线);errors=continue/remount-ro/panic;ERRORS_CONT 时用 s_error_work 经 journal 刷 super |
| 卸载时资源与顺序 | ext4_put_super:先 ext4_unregister_sysfs(防 sysfs 触 journal);flush_stashed_error_work;jbd2_journal_destroy;清 recovery/orphan feature、ext4_commit_super;brelse GDT、kvfree flex_groups、ext4_mb_release 等 |
s_maxbytes 与 extent 格式极限 |
ext4_max_size:与 ee_block 32 位、huge_file、blkcnt_t 等约束一致 |
| flex_bg 元数据内存 | ext4_fill_flex_info/ext4_alloc_flex_bg_array(RCU 替换 + ext4_kvfree_array_rcu) |
| buffer 重读后必须重验 | ext4_read_bh/ext4_read_bh_nowait:clear_buffer_verified |
statfs/df 信息 |
ext4_statfs(与 bigalloc/overhead、quota 等协作) |
| 快照/一致性冻结 | ext4_freeze/ext4_unfreeze |
NFS exportfs |
ext4_export_ops(ext4_fh_to_dentry 等) |
| 延迟 inode 表初始化 | ext4_lazyinit_thread/ext4_register_li_request:大巻后台 zero table 减轻挂载时间 |
| 锁顺序文档 | 文件头注释:page fault / buffered write / truncate / DIO / writepages 与 sb_start_write、i_mutex、transaction、i_data_sem 的约定 |
4. 核心流程摘要
4.1 挂载主路径:__ext4_fill_super(节选逻辑顺序)
ext4_load_super→ 内存s_es、s_sbh- 校验和与默认挂载相关字段(
ext4_set_def_opts等) parse_apply_sb_mount_options→ext4_check_opt_consistency→ext4_apply_options- 编码、journal data 模式、ACL、feature 兼容性
s_maxbytes、描述符大小、blocks_per_group、hash 版本、cluster(bigalloc)ext4_group_desc_init、错误报告 timer、ext4_es_register_shrinker- 挂
sb->s_op/s_export_op/s_xattr/加密 verity/配额操作向量 ext4_fast_commit_init;MMP;journal 或 nojournal 路径- xattr cache、verity blocksize、overhead 计算、
rsv_conversion_wq - root inode +
d_make_root ext4_setup_super(s_mnt_count、s_state、journal orphan 标志)- 可选
block_validity→ext4_setup_system_zone ext4_ext_init、ext4_mb_init、journal commit callback- free clusters/inodes per-cpu 计数器、
ext4_register_li_request、sysfs 等收尾(后续代码在failed_mount*标签周边大量 回滚,保证失败可解挂)
4.2 ext4_setup_super(rw 挂载副作用)
- 无 journal 时 清
EXT4_VALID_FS(与历史 ext2 语义一致) - 调整
s_max_mnt_count/s_mnt_count/s_mtime - 有 journal:置
journal_needs_recovery;有 orphan file:orphan_present ext4_commit_super
4.3 ext4_put_super(卸载)
要点:**sysfs → lazyinit → quota → error work → orphan 文件元数据 → journal destroy → shrinker/timer/system_zone/mballoc/extents → rw 时清 recovery 位并提交 super → 释放 GDT/flex/counters → 同步/丢弃块设备 cache → 外部 journal bdev → xattr cache → MMP → kobject_put(s_kobj) 与 s_chksum_driver 等。
4.4 ext4_sops(对上 VFS)
1 | static const struct super_operations ext4_sops = { |
write_inode/evict_inode 等实现在 inode.c 等文件中;此处完成 函数向量绑定。
4.5 模块入口
1 | static struct file_system_type ext4_fs_type = { |
ext4_init_fs 另初始化 ext4__ioend_wq、ext4_init_es/pending/post_read/pageio/system_zone/sysfs/mballoc、inode slab、fast commit dentry cache,再 register_filesystem.
5. 小结
super.c 是 ext4 的 挂载轴心:把 块设备上的超级块与块组描述符 变成 可用的 super_block + ext4_sb_info,决定 本机是否接受该盘的 feature 组合,接上 jbd2 与 mballoc,并在全生命周期内维护 错误语义与卸载清理。具体 I/O 路径(readpage、get_block)不在此文件;目录/extent/inline 等逻辑见各自子模块。
若需对照 块组几何与位图,可结合 rk3588-kernel-6.1-ext4-balloc块位图与块组辅助分析.md;日志细节见 rk3588-kernel-6.1-ext4-ext4_jbd2与JBD2对接分析.md。
正在加载留言…