10
10
11
11
// #define EXT2_DEBUG
12
12
13
+ static const size_t max_block_size = 4096 ;
13
14
static const ssize_t max_inline_symlink_length = 60 ;
14
15
15
16
static u8 to_ext2_file_type (mode_t mode)
@@ -121,8 +122,11 @@ bool Ext2FS::initialize()
121
122
kprintf (" ext2fs: desc size = %u\n " , EXT2_DESC_SIZE (&super_block));
122
123
#endif
123
124
125
+
124
126
set_block_size (EXT2_BLOCK_SIZE (&super_block));
125
127
128
+ ASSERT (block_size () <= (int )max_block_size);
129
+
126
130
m_block_group_count = ceil_div (super_block.s_blocks_count , super_block.s_blocks_per_group );
127
131
128
132
if (m_block_group_count == 0 ) {
@@ -157,27 +161,24 @@ InodeIdentifier Ext2FS::root_inode() const
157
161
return { fsid (), EXT2_ROOT_INO };
158
162
}
159
163
160
- ByteBuffer Ext2FS::read_block_containing_inode (unsigned inode, unsigned & block_index, unsigned & offset) const
164
+ bool Ext2FS::read_block_containing_inode (unsigned inode, unsigned & block_index, unsigned & offset, u8 * buffer ) const
161
165
{
162
166
LOCKER (m_lock);
163
167
auto & super_block = this ->super_block ();
164
168
165
169
if (inode != EXT2_ROOT_INO && inode < EXT2_FIRST_INO (&super_block))
166
- return {} ;
170
+ return false ;
167
171
168
172
if (inode > super_block.s_inodes_count )
169
- return {} ;
173
+ return false ;
170
174
171
175
auto & bgd = group_descriptor (group_index_from_inode (inode));
172
176
173
177
offset = ((inode - 1 ) % inodes_per_group ()) * inode_size ();
174
178
block_index = bgd.bg_inode_table + (offset >> EXT2_BLOCK_SIZE_BITS (&super_block));
175
179
offset &= block_size () - 1 ;
176
180
177
- auto buffer = ByteBuffer::create_uninitialized (block_size ());
178
- if (!read_block (block_index, buffer.data ()))
179
- return {};
180
- return buffer;
181
+ return read_block (block_index, buffer);
181
182
}
182
183
183
184
Ext2FS::BlockListShape Ext2FS::compute_block_list_shape (unsigned blocks)
@@ -290,7 +291,7 @@ bool Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e2in
290
291
--remaining_blocks;
291
292
}
292
293
stream.fill_to_end (0 );
293
- bool success = write_block (e2inode.i_block [EXT2_IND_BLOCK], block_contents);
294
+ bool success = write_block (e2inode.i_block [EXT2_IND_BLOCK], block_contents. data () );
294
295
ASSERT (success);
295
296
}
296
297
@@ -373,7 +374,7 @@ bool Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e2in
373
374
}
374
375
375
376
if (ind_block_dirty) {
376
- bool success = write_block (indirect_block_index, ind_block_contents);
377
+ bool success = write_block (indirect_block_index, ind_block_contents. data () );
377
378
ASSERT (success);
378
379
}
379
380
}
@@ -385,7 +386,7 @@ bool Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e2in
385
386
}
386
387
387
388
if (dind_block_dirty) {
388
- bool success = write_block (e2inode.i_block [EXT2_DIND_BLOCK], dind_block_contents);
389
+ bool success = write_block (e2inode.i_block [EXT2_DIND_BLOCK], dind_block_contents. data () );
389
390
ASSERT (success);
390
391
}
391
392
}
@@ -509,7 +510,7 @@ void Ext2FS::flush_block_group_descriptor_table()
509
510
LOCKER (m_lock);
510
511
unsigned blocks_to_write = ceil_div (m_block_group_count * (unsigned )sizeof (ext2_group_desc), block_size ());
511
512
unsigned first_block_of_bgdt = block_size () == 1024 ? 2 : 1 ;
512
- write_blocks (first_block_of_bgdt, blocks_to_write, m_cached_group_descriptor_table);
513
+ write_blocks (first_block_of_bgdt, blocks_to_write, m_cached_group_descriptor_table. data () );
513
514
}
514
515
515
516
Ext2FSInode::Ext2FSInode (Ext2FS& fs, unsigned index)
@@ -585,15 +586,15 @@ RefPtr<Inode> Ext2FS::get_inode(InodeIdentifier inode) const
585
586
586
587
unsigned block_index;
587
588
unsigned offset;
588
- auto block = read_block_containing_inode (inode. index (), block_index, offset) ;
589
- if (!block)
589
+ u8 block[max_block_size] ;
590
+ if (!read_block_containing_inode (inode. index (), block_index, offset, block) )
590
591
return {};
591
592
592
593
auto it = m_inode_cache.find (inode.index ());
593
594
if (it != m_inode_cache.end ())
594
595
return (*it).value ;
595
596
auto new_inode = adopt (*new Ext2FSInode (const_cast <Ext2FS&>(*this ), inode.index ()));
596
- memcpy (&new_inode->m_raw_inode , reinterpret_cast <ext2_inode*>(block. offset_pointer ( offset) ), sizeof (ext2_inode));
597
+ memcpy (&new_inode->m_raw_inode , reinterpret_cast <ext2_inode*>(block + offset), sizeof (ext2_inode));
597
598
m_inode_cache.set (inode.index (), new_inode);
598
599
return new_inode;
599
600
}
@@ -644,9 +645,7 @@ ssize_t Ext2FSInode::read_bytes(off_t offset, ssize_t count, u8* buffer, FileDes
644
645
// kprintf("ok let's do it, read(%u, %u) -> blocks %u thru %u, oifb: %u\n", offset, count, first_block_logical_index, last_block_logical_index, offset_into_first_block);
645
646
#endif
646
647
647
- // Biggest block size should be 4096..
648
- u8 block[4096 ];
649
- ASSERT (block_size < (int )sizeof (block));
648
+ u8 block[max_block_size];
650
649
651
650
for (int bi = first_block_logical_index; remaining_count && bi <= last_block_logical_index; ++bi) {
652
651
bool success = fs ().read_block (m_block_list[bi], block);
@@ -779,7 +778,7 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, ssize_t count, const u8* data, Fi
779
778
#ifdef EXT2_DEBUG
780
779
dbgprintf (" Ext2FSInode::write_bytes: writing block %u (offset_into_block: %u)\n " , m_block_list[bi], offset_into_block);
781
780
#endif
782
- bool success = fs ().write_block (m_block_list[bi], block);
781
+ bool success = fs ().write_block (m_block_list[bi], block. data () );
783
782
if (!success) {
784
783
kprintf (" Ext2FSInode::write_bytes: write_block(%u) failed (lbi: %u)\n " , m_block_list[bi], bi);
785
784
ASSERT_NOT_REACHED ();
@@ -985,10 +984,10 @@ bool Ext2FS::write_ext2_inode(unsigned inode, const ext2_inode& e2inode)
985
984
LOCKER (m_lock);
986
985
unsigned block_index;
987
986
unsigned offset;
988
- auto block = read_block_containing_inode (inode, block_index, offset) ;
989
- if (!block)
987
+ u8 block[max_block_size] ;
988
+ if (!read_block_containing_inode (inode, block_index, offset, block) )
990
989
return false ;
991
- memcpy (reinterpret_cast <ext2_inode*>(block. offset_pointer ( offset) ), &e2inode, inode_size ());
990
+ memcpy (reinterpret_cast <ext2_inode*>(block + offset), &e2inode, inode_size ());
992
991
bool success = write_block (block_index, block);
993
992
ASSERT (success);
994
993
return success;
@@ -1177,7 +1176,7 @@ bool Ext2FS::set_inode_allocation_state(InodeIndex inode_index, bool new_state)
1177
1176
}
1178
1177
1179
1178
bitmap.set (bit_index, new_state);
1180
- success = write_block (bgd.bg_inode_bitmap , block);
1179
+ success = write_block (bgd.bg_inode_bitmap , block. data () );
1181
1180
ASSERT (success);
1182
1181
1183
1182
// Update superblock
@@ -1241,7 +1240,7 @@ bool Ext2FS::set_block_allocation_state(BlockIndex block_index, bool new_state)
1241
1240
}
1242
1241
1243
1242
bitmap.set (bit_index, new_state);
1244
- success = write_block (bgd.bg_block_bitmap , block);
1243
+ success = write_block (bgd.bg_block_bitmap , block. data () );
1245
1244
ASSERT (success);
1246
1245
1247
1246
// Update superblock
0 commit comments