RK3588 kernel-6.1 fs/ext4/super.c 超级块与挂载生命周期分析

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/synclazy inode table 初始化、以及 ext4_read_bh 等跨模块公用辅助)
  • 协作:ext4_jbd2.c(日志)、inode.cext4_iget、root)、mballoc.csysfs.cresize.cext4_alloc_flex_bg_array 等同名能力在别文件亦有入口)、xattr/acl/fscrypt

2. 代码作用(一句话)

super.c 定义 ext4 在 VFS 层的 「整卷对象」:模块 __init 顺序注册 ext4(及可选 ext3/ext2 别名)ext4_init_fs_context + ext4_get_treeext4_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_superext4_load_superext4_superblock_csum_*ext4_init_metadata_csumext4_feature_set_ok/ext4_check_feature_compatibility;几何 ext4_geometry_check/generic_check_addressableext4_group_desc_init + ext4_check_descriptors(位图/itb 与 sb/GDT 不交叠、ext4_group_desc_csum_verify
卷级参数与内核能力是否匹配 ext4_parse_paramfs_parameter_spec):data=journal_*、quotaDAXblock_validityfast commit debug 等;ext4_check_opt_consistency(如 bigalloc 与 data=journalDAX 与 inline_data
ext2/ext3 兼容名 条件编译 ext2_fs_type/ext3_fs_type 共享 ext4_init_fs_contextext2_feature_set_ok/ext3_feature_set_ok
日志与崩溃恢复 ext4_load_and_init_journalneeds_recoverys_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_errorEXT4_ERROR_FSsave_error_info(首/末错与时间线);errors=continue/remount-ro/panicERRORS_CONT 时用 s_error_work 经 journal 刷 super
卸载时资源与顺序 ext4_put_superext4_unregister_sysfs(防 sysfs 触 journal);flush_stashed_error_workjbd2_journal_destroy;清 recovery/orphan featureext4_commit_superbrelse GDT、kvfree flex_groupsext4_mb_release
s_maxbytes 与 extent 格式极限 ext4_max_size:与 ee_block 32 位huge_fileblkcnt_t 等约束一致
flex_bg 元数据内存 ext4_fill_flex_info/ext4_alloc_flex_bg_array(RCU 替换 + ext4_kvfree_array_rcu
buffer 重读后必须重验 ext4_read_bh/ext4_read_bh_nowaitclear_buffer_verified
statfs/df 信息 ext4_statfs(与 bigalloc/overheadquota 等协作)
快照/一致性冻结 ext4_freeze/ext4_unfreeze
NFS exportfs ext4_export_opsext4_fh_to_dentry 等)
延迟 inode 表初始化 ext4_lazyinit_thread/ext4_register_li_request:大巻后台 zero table 减轻挂载时间
锁顺序文档 文件头注释:page fault / buffered write / truncate / DIO / writepagessb_start_writei_mutextransactioni_data_sem 的约定

4. 核心流程摘要

4.1 挂载主路径:__ext4_fill_super(节选逻辑顺序)

  1. ext4_load_super → 内存 s_ess_sbh
  2. 校验和与默认挂载相关字段ext4_set_def_opts 等)
  3. parse_apply_sb_mount_optionsext4_check_opt_consistencyext4_apply_options
  4. 编码、journal data 模式、ACL、feature 兼容性
  5. s_maxbytes、描述符大小、blocks_per_group、hash 版本、cluster(bigalloc)
  6. ext4_group_desc_init错误报告 timerext4_es_register_shrinker
  7. sb->s_op/s_export_op/s_xattr/加密 verity/配额操作向量
  8. ext4_fast_commit_initMMPjournal 或 nojournal 路径
  9. xattr cache、verity blocksize、overhead 计算、rsv_conversion_wq
  10. root inode + d_make_root
  11. ext4_setup_supers_mnt_counts_state、journal orphan 标志)
  12. 可选 block_validityext4_setup_system_zone
  13. ext4_ext_initext4_mb_init、journal commit callback
  14. 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 fileorphan_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static const struct super_operations ext4_sops = {
.alloc_inode = ext4_alloc_inode,
.free_inode = ext4_free_in_core_inode,
.destroy_inode = ext4_destroy_inode,
.write_inode = ext4_write_inode,
.dirty_inode = ext4_dirty_inode,
.drop_inode = ext4_drop_inode,
.evict_inode = ext4_evict_inode,
.put_super = ext4_put_super,
.sync_fs = ext4_sync_fs,
.freeze_fs = ext4_freeze,
.unfreeze_fs = ext4_unfreeze,
.statfs = ext4_statfs,
.show_options = ext4_show_options,
#ifdef CONFIG_QUOTA
.quota_read = ext4_quota_read,
.quota_write = ext4_quota_write,
.get_dquots = ext4_get_dquots,
#endif
};

write_inode/evict_inode 等实现在 inode.c 等文件中;此处完成 函数向量绑定

4.5 模块入口

1
2
3
4
5
6
7
8
static struct file_system_type ext4_fs_type = {
.owner = THIS_MODULE,
.name = "ext4",
.init_fs_context = ext4_init_fs_context,
.parameters = ext4_param_specs,
.kill_sb = kill_block_super,
.fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP,
};

ext4_init_fs 另初始化 ext4__ioend_wqext4_init_es/pending/post_read/pageio/system_zone/sysfs/mballocinode slabfast commit dentry cache,再 register_filesystem.


5. 小结

super.c 是 ext4 的 挂载轴心:把 块设备上的超级块与块组描述符 变成 可用的 super_block + ext4_sb_info,决定 本机是否接受该盘的 feature 组合,接上 jbd2 与 mballoc,并在全生命周期内维护 错误语义与卸载清理具体 I/O 路径readpageget_block)不在此文件;目录/extent/inline 等逻辑见各自子模块。

若需对照 块组几何与位图,可结合 rk3588-kernel-6.1-ext4-balloc块位图与块组辅助分析.md日志细节rk3588-kernel-6.1-ext4-ext4_jbd2与JBD2对接分析.md

文章互动

阅读 --

留言

0 条留言

正在加载留言…