在 super.c
文件中,初始化逻辑主要涉及到几个关键函数,这些函数之间的调用关系对于理解 EROFS 文件系统的启动和挂载过程非常重要。以下是这些函数的调用关系和它们在初始化过程中的作用:
主要函数和调用关系
-
erofs_mount
- 这是挂载 EROFS 文件系统时调用的主函数。它负责解析挂载选项、读取和验证超级块、初始化文件系统的核心结构等。
- 调用
erofs_fill_super
来填充超级块结构。
-
erofs_fill_super
- 用于填充和初始化超级块结构
super_block
。 - 调用
erofs_read_superblock
来从磁盘读取超级块数据。 - 调用
erofs_superblock_csum_verify
来验证超级块的校验和。 - 调用
erofs_alloc_inode
来分配 inode 缓存。
- 用于填充和初始化超级块结构
-
erofs_read_superblock
- 从磁盘读取超级块数据到内存中。
- 这个函数直接操作磁盘 I/O,不调用其他函数。
-
erofs_superblock_csum_verify
- 验证读取的超级块数据的校验和。
- 这个函数主要进行数据校验,不调用其他函数。
-
erofs_alloc_inode
- 分配和初始化 inode 缓存。
- 调用
erofs_inode_init_once
来初始化每个 inode 结构。
-
erofs_inode_init_once
- 用于初始化单个 inode 结构。
- 这个函数主要设置 inode 结构的默认值,不调用其他函数。
总结
从 erofs_mount
开始,这个函数触发了一系列的调用,包括读取和验证超级块,以及初始化 inode 缓存。每个函数都承担了特定的任务,确保文件系统能够正确挂载和初始化。这些函数的调用关系清晰地展示了 EROFS 文件系统初始化的步骤和逻辑。
这些函数的详细介绍和代码位置可以在以下代码块中找到:
在您提供的 `super.c` 文件片段中,涉及到的代码主要是与 EROFS (Enhanced Read-Only File System) 文件系统的超级块操作相关。这些操作包括错误处理、信息记录、超级块校验、inode 初始化和释放等。以下是对代码中出现的局部变量和全局变量的详细介绍:
### 全局变量
- `erofs_inode_cachep`:这是一个全局变量,类型为 `struct kmem_cache *`。它用于存储 EROFS inode 的内存缓存池,这个缓存池是通过 `kmem_cache_create` 创建的,用于优化 inode 的分配和释放。
### 局部变量
局部变量主要出现在函数内部,用于执行特定的逻辑。
#### 函数 `_erofs_err` 和 `_erofs_info`
- `vaf`:类型为 `struct va_format`,用于格式化可变参数列表中的错误或信息消息。
- `args`:类型为 `va_list`,用于处理可变参数。
#### 函数 `erofs_superblock_csum_verify`
- `len`:类型为 `size_t`,存储超级块的长度。
- `dsb`:类型为 `struct erofs_super_block *`,指向超级块数据的指针。
- `expected_crc` 和 `crc`:类型为 `u32`,用于存储计算出的 CRC 校验值和期望的 CRC 校验值。
#### 函数 `erofs_inode_init_once`
- `vi`:类型为 `struct erofs_inode *`,指向初始化的 EROFS inode 结构。
#### 函数 `erofs_alloc_inode` 和 `erofs_free_inode`
- `vi`:类型为 `struct erofs_inode *`,在 `erofs_alloc_inode` 中用于存储新分配的 inode,在 `erofs_free_inode` 中用于指向要释放的 inode。
#### 函数 `check_layout_compatibility`
- `feature`:类型为 `unsigned int`,用于存储从磁盘读取的不兼容特性标志。
#### 函数 `erofs_read_metadata`
- `buffer` 和 `ptr`:类型为 `u8 *`,用于临时存储和处理元数据。
- `len` 和 `cnt`:类型为 `int`,`len` 存储元数据的长度,`cnt` 存储在单次循环中处理的字节数。
#### 函数 `z_erofs_parse_cfgs`
- 无特定局部变量,主要处理压缩配置。
#### 函数 `erofs_init_device`
- `sbi`:类型为 `struct erofs_sb_info *`,指向超级块信息结构。
- `fscache`:类型为 `struct erofs_fscache *`,用于文件系统缓存操作。
- `dis`:类型为 `struct erofs_deviceslot *`,用于存储设备信息。
- `bdev_file`:类型为 `struct file *`,用于表示块设备文件。
### 总结
这些变量在 `super.c` 中扮演着关键的角色,用于管理和操作 EROFS 文件系统的核心数据结构,如超级块、inode 和设备信息。全局变量 `erofs_inode_cachep` 是用于 inode 缓存的关键资源,而各个函数中的局部变量则具体负责执行函数的逻辑,如错误处理、数据校验、内存分配等。