@@ -36,7 +36,6 @@ pub struct Ext2Fs<T> {
36
36
}
37
37
38
38
const SUPERBLOCK_OFFSET : usize = 1024 ;
39
- const BLOCK_GROUP_DESCRIPTOR_TABLE_OFFSET : usize = 2048 ;
40
39
const BGD_SIZE : usize = 32 ; // 32 bytes per block group descriptor
41
40
42
41
impl < T > Ext2Fs < T >
53
52
let number_of_block_groups = ( superblock. num_blocks ( ) + superblock. blocks_per_group ( ) - 1 )
54
53
/ superblock. blocks_per_group ( ) ;
55
54
55
+ let bgdt_offset = if superblock. block_size ( ) == 1024 { 2048 } else { superblock. block_size ( ) } as usize ;
56
+
56
57
let mut bgdt_data = vec ! [ 0_u8 ; superblock. block_size( ) as usize ] ;
57
58
block_device
58
- . read_at ( BLOCK_GROUP_DESCRIPTOR_TABLE_OFFSET , & mut bgdt_data)
59
+ . read_at ( bgdt_offset , & mut bgdt_data)
59
60
. map_err ( |_| Error :: UnableToReadBlockGroupDescriptorTable ) ?;
60
61
let mut bgdt = BlockGroupDescriptorTable :: new ( ) ;
61
62
for i in 0 ..number_of_block_groups as usize {
73
74
} )
74
75
}
75
76
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
+
76
86
pub fn superblock ( & self ) -> & Superblock {
77
87
& self . superblock
78
88
}
@@ -158,6 +168,7 @@ where
158
168
{
159
169
let block_size = self . superblock . block_size ( ) ;
160
170
let num_groups = self . bgdt . len ( ) ;
171
+ let bgdt_offset = self . bgdt_offset ( ) ;
161
172
162
173
for group_index in 0 ..num_groups {
163
174
let first_free_resource_index = try_reserve_in_group ( self , group_index) ?;
@@ -172,7 +183,7 @@ where
172
183
// read the block group descriptor table
173
184
let mut bgdt_data = vec ! [ 0_u8 ; block_size as usize ] ;
174
185
self . block_device
175
- . read_at ( BLOCK_GROUP_DESCRIPTOR_TABLE_OFFSET , & mut bgdt_data)
186
+ . read_at ( bgdt_offset , & mut bgdt_data)
176
187
. map_err ( |_| Error :: UnableToReadBlockGroupDescriptorTable ) ?;
177
188
// merge the changed descriptor back into the table
178
189
let bgd_offset = group_index * BGD_SIZE ;
@@ -181,7 +192,7 @@ where
181
192
bgdt_data[ bgd_offset..bgd_end] . copy_from_slice ( & bgd_data) ;
182
193
// write the block group descriptor table back
183
194
self . block_device
184
- . write_at ( BLOCK_GROUP_DESCRIPTOR_TABLE_OFFSET , & bgdt_data)
195
+ . write_at ( bgdt_offset , & bgdt_data)
185
196
. map_err ( |_| Error :: UnableToWriteBlockGroupDescriptorTable ) ?;
186
197
187
198
* self . superblock . num_unallocated_blocks_mut ( ) -= 1 ;
0 commit comments