Skip to content

Commit b87ea77

Browse files
committed
fix reading bgdt at incorrect offset for block sizes other than 1k
1 parent 82a1ff2 commit b87ea77

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

ext2/src/lib.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ pub struct Ext2Fs<T> {
3636
}
3737

3838
const SUPERBLOCK_OFFSET: usize = 1024;
39-
const BLOCK_GROUP_DESCRIPTOR_TABLE_OFFSET: usize = 2048;
4039
const BGD_SIZE: usize = 32; // 32 bytes per block group descriptor
4140

4241
impl<T> Ext2Fs<T>
@@ -53,9 +52,11 @@ where
5352
let number_of_block_groups = (superblock.num_blocks() + superblock.blocks_per_group() - 1)
5453
/ superblock.blocks_per_group();
5554

55+
let bgdt_offset = if superblock.block_size() == 1024 { 2048 } else { superblock.block_size() } as usize;
56+
5657
let mut bgdt_data = vec![0_u8; superblock.block_size() as usize];
5758
block_device
58-
.read_at(BLOCK_GROUP_DESCRIPTOR_TABLE_OFFSET, &mut bgdt_data)
59+
.read_at(bgdt_offset, &mut bgdt_data)
5960
.map_err(|_| Error::UnableToReadBlockGroupDescriptorTable)?;
6061
let mut bgdt = BlockGroupDescriptorTable::new();
6162
for i in 0..number_of_block_groups as usize {
@@ -73,6 +74,15 @@ where
7374
})
7475
}
7576

77+
fn bgdt_offset(&self) -> usize {
78+
let block_size = self.superblock.block_size() as usize;
79+
if block_size == 1024 {
80+
2048
81+
} else {
82+
block_size
83+
}
84+
}
85+
7686
pub fn superblock(&self) -> &Superblock {
7787
&self.superblock
7888
}
@@ -158,6 +168,7 @@ where
158168
{
159169
let block_size = self.superblock.block_size();
160170
let num_groups = self.bgdt.len();
171+
let bgdt_offset = self.bgdt_offset();
161172

162173
for group_index in 0..num_groups {
163174
let first_free_resource_index = try_reserve_in_group(self, group_index)?;
@@ -172,7 +183,7 @@ where
172183
// read the block group descriptor table
173184
let mut bgdt_data = vec![0_u8; block_size as usize];
174185
self.block_device
175-
.read_at(BLOCK_GROUP_DESCRIPTOR_TABLE_OFFSET, &mut bgdt_data)
186+
.read_at(bgdt_offset, &mut bgdt_data)
176187
.map_err(|_| Error::UnableToReadBlockGroupDescriptorTable)?;
177188
// merge the changed descriptor back into the table
178189
let bgd_offset = group_index * BGD_SIZE;
@@ -181,7 +192,7 @@ where
181192
bgdt_data[bgd_offset..bgd_end].copy_from_slice(&bgd_data);
182193
// write the block group descriptor table back
183194
self.block_device
184-
.write_at(BLOCK_GROUP_DESCRIPTOR_TABLE_OFFSET, &bgdt_data)
195+
.write_at(bgdt_offset, &bgdt_data)
185196
.map_err(|_| Error::UnableToWriteBlockGroupDescriptorTable)?;
186197

187198
*self.superblock.num_unallocated_blocks_mut() -= 1;

0 commit comments

Comments
 (0)