|
1 | 1 | use crate::BLOCK_SIZE; |
| 2 | +use crate::crc32c::crc32c; |
2 | 3 | use crate::crc32c::{ |
3 | 4 | crc32c_append, crc32c_init, ext4_crc32c_seed_from_superblock, ext4_superblock_has_metadata_csum, |
4 | 5 | }; |
5 | | -use crate::crc32c::crc32c; |
6 | 6 | use crate::disknode::Ext4Inode; |
7 | | -use crate::entries::Ext4DirEntryTail; |
8 | 7 | use crate::endian::DiskFormat; |
| 8 | +use crate::entries::Ext4DirEntryTail; |
9 | 9 | use crate::jbd2::jbdstruct::JournalSuperBllockS; |
10 | 10 | use crate::superblock::Ext4Superblock; |
11 | 11 |
|
@@ -54,11 +54,7 @@ pub fn ext4_update_superblock_checksum(sb: &mut Ext4Superblock) { |
54 | 54 | /// ext4 在某些场景下会把 CRC32C 的低 16 位存入 `bg_checksum`。 |
55 | 55 | /// 此函数只提供计算入口,是否/何时启用仍需根据 feature 位与布局规则决定。 |
56 | 56 | #[allow(dead_code)] |
57 | | -pub fn ext4_group_desc_csum16( |
58 | | - sb: &Ext4Superblock, |
59 | | - group_id: u32, |
60 | | - desc_bytes: &[u8], |
61 | | -) -> u16 { |
| 57 | +pub fn ext4_group_desc_csum16(sb: &Ext4Superblock, group_id: u32, desc_bytes: &[u8]) -> u16 { |
62 | 58 | let seed = ext4_crc32c_seed_from_superblock(sb); |
63 | 59 | let group_id_le = group_id.to_le_bytes(); |
64 | 60 | let csum = ext4_metadata_csum32(seed, &[&group_id_le, desc_bytes]); |
@@ -123,7 +119,6 @@ pub fn ext4_metadata_block_csum32(sb: &Ext4Superblock, data: &[u8]) -> u32 { |
123 | 119 | ext4_metadata_csum32(seed, &[data]) |
124 | 120 | } |
125 | 121 |
|
126 | | - |
127 | 122 | /// 校验目录块的 checksum 是否正确(读路径使用)。 |
128 | 123 | /// 返回 true 表示校验通过或未启用 metadata_csum。 |
129 | 124 | pub fn verify_ext4_dirblock_checksum( |
@@ -155,31 +150,34 @@ pub fn verify_ext4_dirblock_checksum( |
155 | 150 | } |
156 | 151 |
|
157 | 152 | /// 更新目录块(dirblock)的 CRC32C(32位)便捷封装 |
158 | | -pub fn update_ext4_dirblock_csum32(sb: &Ext4Superblock, parent_dir_ino: u32, generation: u32, block_bytes: &mut [u8]){ |
| 153 | +pub fn update_ext4_dirblock_csum32( |
| 154 | + sb: &Ext4Superblock, |
| 155 | + parent_dir_ino: u32, |
| 156 | + generation: u32, |
| 157 | + block_bytes: &mut [u8], |
| 158 | +) { |
159 | 159 | let has_checksum = ext4_superblock_has_metadata_csum(sb); |
160 | 160 | if has_checksum { |
161 | 161 | // 内核只对 tail 之前的数据计算 checksum:size = BLOCK_SIZE - 12 |
162 | 162 | let data_len = BLOCK_SIZE - Ext4DirEntryTail::TAIL_LEN as usize; |
163 | | - let csum = ext4_dirblock_csum32( |
164 | | - sb, |
165 | | - parent_dir_ino, |
166 | | - generation, |
167 | | - &block_bytes[..data_len], |
168 | | - ); |
169 | | - let tail_checksum = &mut block_bytes[BLOCK_SIZE-4..]; |
| 163 | + let csum = ext4_dirblock_csum32(sb, parent_dir_ino, generation, &block_bytes[..data_len]); |
| 164 | + let tail_checksum = &mut block_bytes[BLOCK_SIZE - 4..]; |
170 | 165 | tail_checksum.copy_from_slice(&csum.to_le_bytes()); |
171 | 166 | } |
172 | 167 | } |
173 | | - |
174 | | - |
175 | 168 |
|
176 | 169 | /// 计算目录块(dirblock)的 CRC32C(32位)。 |
177 | 170 | /// |
178 | 171 | /// 目录块的 checksum 与目录自身的 inode 号和 i_generation 绑定, |
179 | 172 | /// 避免跨目录搬运或 inode 复用后误通过校验。 |
180 | 173 | /// 输入形式:`seed + uuid + ino + gen + block_bytes`。 |
181 | 174 | #[allow(dead_code)] |
182 | | -pub fn ext4_dirblock_csum32(sb: &Ext4Superblock, ino: u32, generation: u32, block_bytes: &[u8]) -> u32 { |
| 175 | +pub fn ext4_dirblock_csum32( |
| 176 | + sb: &Ext4Superblock, |
| 177 | + ino: u32, |
| 178 | + generation: u32, |
| 179 | + block_bytes: &[u8], |
| 180 | +) -> u32 { |
183 | 181 | let seed = ext4_crc32c_seed_from_superblock(sb); |
184 | 182 | let ino_le = ino.to_le_bytes(); |
185 | 183 | let gen_le = generation.to_le_bytes(); |
@@ -258,4 +256,3 @@ pub fn ext4_inode_bitmap_csum32(sb: &Ext4Superblock, bitmap_bytes: &[u8]) -> u32 |
258 | 256 | let sz = core::cmp::min(sz, bitmap_bytes.len()); |
259 | 257 | ext4_metadata_csum32(seed, &[&bitmap_bytes[..sz]]) |
260 | 258 | } |
261 | | - |
0 commit comments