RK3588 kernel-6.1 fs/ext4/bitmap.c 位图统计与校验和分析

RK3588 kernel-6.1 fs/ext4/bitmap.c 位图统计与校验和分析

1. 分析范围

  • rk3588/kernel-6.1/fs/ext4/bitmap.c(约 99 行)
  • 调用方:balloc.c(块位图 CRC 校验)、ialloc.c(inode 位图 CRC 校验/设置、统计空闲 inode)、mballoc.c(块位图写后更新校验和)、resize.c(扩容后写回 GDT 中校验和)、super.c(调试/统计路径)等

2. 代码作用(一句话)

bitmap.c 提供两样东西:① 对内存中一段 位图缓冲区 统计 置 0 位数(即可分配槽位数);② 在启用 元数据校验和(metadata_csum) 时,对 块位图、inode 位图 计算/校验 CRC32,并与 块组描述符 ext4_group_desc 中存储的 低 16 / 扩展高 16 位比对。


3. 各函数说明

3.1 ext4_count_free

1
2
3
4
unsigned int ext4_count_free(char *bitmap, unsigned int numchars)
{
return numchars * BITS_PER_BYTE - memweight(bitmap, numchars);
}
  • memweight:统计 bitmapnumchars 字节里为 1 的位数(内核通用位操作辅助)。
  • 总 bit 数 − 已用 bit 数(1 的个数)= 空闲 bit 数(0 的个数)

用于在已知位图长度时 快速得到空闲 inode/cluster 数量(例如 ialloc.cext4_count_free_inodesballoc.c 调试路径与 super.c 部分统计)。

3.2 inode 位图校验和

  • ext4_inode_bitmap_csum_verify:若未启用 ext4_has_metadata_csum,直接返回 1(视为通过)。否则用 ext4_chksom(sbi, s_csum_seed, bh->b_data, sz) 计算 CRC,与 gdp->bg_inode_bitmap_csum_lo(及大描述符时的 bg_inode_bitmap_csum_hi 拼成 32 位)比较;小描述符只比较低 16 位(calculated &= 0xFFFF)。
  • ext4_inode_bitmap_csum_set:写位图后把 CRC 写回 GDT 相应字段。

参数 sz 由调用方传入(inode 位图有效字节数随每组合法 inode 数变化),保证 只对有效位图区域 做校验和。

3.3 块位图校验和

  • ext4_block_bitmap_csum_verify / ext4_block_bitmap_csum_set:逻辑与 inode 版相同,区别是 校验长度固定为
    EXT4_CLUSTERS_PER_GROUP(sb) / 8(每组 数 / 8 = 块位图有效字节数,与 bigalloc 一致:位图按 为单位)。
  • 存储字段:bg_block_bitmap_csum_lo / bg_block_bitmap_csum_hi(同样受 s_desc_sizeEXT4_BG_*_CSUM_HI_END 宏约束)。

balloc.cext4_validate_block_bitmap 中调用 ext4_block_bitmap_csum_verify,失败则标记组内块位图损坏。


4. 解决了什么问题

问题 做法
如何 O(字节) 统计位图中 0 bit 数量 ext4_count_freememweight 一次扫完,避免按位循环
静默位图损坏(I/O、存储误码)导致 错误分配/释放 metadata_csum:读位图后先验 CRC,与 GDT 不一致则拒绝信任该位图
写位图后 磁盘元数据自洽 事务提交前 _csum_set 更新 GDT,下次挂载或可校验
兼容 旧/小 组描述符 仅 16 位 CSUM 时只比较低 16;64 字节描述符 可存 完整 32 位 CRC

整体上,本文件把 「位图内容的数学性质」(数 0)和 「位图完整性」(CRC)从 balloc/ialloc/mballoc 大块逻辑里 剥离成独立小模块,便于维护与复用。


5. 与其它文件的关系

1
2
3
4
5
6
7
8
9
10
11
读块位图(balloc.c)
|
v
ext4_block_bitmap_csum_verify(bitmap.c)
|
+--> 失败 → ext4_mark_group_bitmap_corrupted

分配/释放后改位图(mballoc.c / ialloc.c)
|
v
ext4_*_bitmap_csum_set(bitmap.c)→ 写日记/GDT

6. RK3588 / 运维提示

  • 使用 metadata_csumtune2fs/mkfs 特性)时,位图 CRC 是 fsck 与内核在线 发现损坏 的重要防线;损坏常伴随 bad block bitmap checksum 类 dmesg。
  • 未启用 metadata_csum 时,本文件校验函数 恒为「通过」,仅 ext4_count_free 有意义。

7. 小结

维度 结论
作用 位图空闲位统计;块/inode 位图的 metadata CRC 计算与校验
解决问题 高性能计数;启用校验和时 检测位图与组描述符不一致,降低错误分配风险

源码:rk3588/kernel-6.1/fs/ext4/bitmap.c。文档:linuxDoc/fs/ext4/

文章互动

阅读 --

留言

0 条留言

正在加载留言…