@@ -230,68 +230,68 @@ Ext2FS::BlockListShape Ext2FS::compute_block_list_shape(unsigned blocks) const
230
230
return shape;
231
231
}
232
232
233
- KResult Ext2FS::write_block_list_for_inode (InodeIndex inode_index, ext2_inode& e2inode, const Vector<BlockIndex>& blocks )
233
+ KResult Ext2FSInode::flush_block_list ( )
234
234
{
235
235
LOCKER (m_lock);
236
236
237
- if (blocks .is_empty ()) {
238
- e2inode .i_blocks = 0 ;
239
- memset (e2inode .i_block , 0 , sizeof (e2inode .i_block ));
240
- write_ext2_inode (inode_index, e2inode );
237
+ if (m_block_list .is_empty ()) {
238
+ m_raw_inode .i_blocks = 0 ;
239
+ memset (m_raw_inode .i_block , 0 , sizeof (m_raw_inode .i_block ));
240
+ fs (). write_ext2_inode (index (), m_raw_inode );
241
241
return KSuccess;
242
242
}
243
243
244
244
// NOTE: There is a mismatch between i_blocks and blocks.size() since i_blocks includes meta blocks and blocks.size() does not.
245
- auto old_block_count = ceil_div (static_cast <size_t >(e2inode .i_size ), block_size ());
245
+ auto old_block_count = ceil_div (static_cast <size_t >(m_raw_inode .i_size ), fs (). block_size ());
246
246
247
- auto old_shape = compute_block_list_shape (old_block_count);
248
- auto new_shape = compute_block_list_shape (blocks .size ());
247
+ auto old_shape = fs (). compute_block_list_shape (old_block_count);
248
+ auto new_shape = fs (). compute_block_list_shape (m_block_list .size ());
249
249
250
- Vector<BlockIndex> new_meta_blocks;
250
+ Vector<Ext2FS:: BlockIndex> new_meta_blocks;
251
251
if (new_shape.meta_blocks > old_shape.meta_blocks ) {
252
- auto blocks_or_error = allocate_blocks (group_index_from_inode (inode_index ), new_shape.meta_blocks - old_shape.meta_blocks );
252
+ auto blocks_or_error = fs (). allocate_blocks (fs (). group_index_from_inode (index () ), new_shape.meta_blocks - old_shape.meta_blocks );
253
253
if (blocks_or_error.is_error ())
254
254
return blocks_or_error.error ();
255
255
new_meta_blocks = blocks_or_error.release_value ();
256
256
}
257
257
258
- e2inode .i_blocks = (blocks .size () + new_shape.meta_blocks ) * (block_size () / 512 );
258
+ m_raw_inode .i_blocks = (m_block_list .size () + new_shape.meta_blocks ) * (fs (). block_size () / 512 );
259
259
260
260
bool inode_dirty = false ;
261
261
262
262
unsigned output_block_index = 0 ;
263
- unsigned remaining_blocks = blocks .size ();
263
+ unsigned remaining_blocks = m_block_list .size ();
264
264
for (unsigned i = 0 ; i < new_shape.direct_blocks ; ++i) {
265
- if (e2inode .i_block [i] != blocks [output_block_index])
265
+ if (m_raw_inode .i_block [i] != m_block_list [output_block_index])
266
266
inode_dirty = true ;
267
- e2inode .i_block [i] = blocks [output_block_index].value ();
267
+ m_raw_inode .i_block [i] = m_block_list [output_block_index].value ();
268
268
++output_block_index;
269
269
--remaining_blocks;
270
270
}
271
271
if (inode_dirty) {
272
272
if constexpr (EXT2_DEBUG) {
273
- dbgln (" Ext2FS: Writing {} direct block(s) to i_block array of inode {}" , min ((size_t )EXT2_NDIR_BLOCKS, blocks .size ()), inode_index );
274
- for (size_t i = 0 ; i < min ((size_t )EXT2_NDIR_BLOCKS, blocks .size ()); ++i)
275
- dbgln (" + {}" , blocks [i]);
273
+ dbgln (" Ext2FS: Writing {} direct block(s) to i_block array of inode {}" , min ((size_t )EXT2_NDIR_BLOCKS, m_block_list .size ()), index () );
274
+ for (size_t i = 0 ; i < min ((size_t )EXT2_NDIR_BLOCKS, m_block_list .size ()); ++i)
275
+ dbgln (" + {}" , m_block_list [i]);
276
276
}
277
- write_ext2_inode (inode_index, e2inode );
277
+ fs (). write_ext2_inode (index (), m_raw_inode );
278
278
inode_dirty = false ;
279
279
}
280
280
281
281
if (!remaining_blocks)
282
282
return KSuccess;
283
283
284
- const unsigned entries_per_block = EXT2_ADDR_PER_BLOCK (&super_block ());
284
+ const unsigned entries_per_block = EXT2_ADDR_PER_BLOCK (&fs (). super_block ());
285
285
286
- bool ind_block_new = !e2inode .i_block [EXT2_IND_BLOCK];
286
+ bool ind_block_new = !m_raw_inode .i_block [EXT2_IND_BLOCK];
287
287
if (ind_block_new) {
288
- BlockIndex new_indirect_block = new_meta_blocks.take_last ();
289
- if (e2inode .i_block [EXT2_IND_BLOCK] != new_indirect_block)
288
+ Ext2FS:: BlockIndex new_indirect_block = new_meta_blocks.take_last ();
289
+ if (m_raw_inode .i_block [EXT2_IND_BLOCK] != new_indirect_block)
290
290
inode_dirty = true ;
291
- e2inode .i_block [EXT2_IND_BLOCK] = new_indirect_block.value ();
291
+ m_raw_inode .i_block [EXT2_IND_BLOCK] = new_indirect_block.value ();
292
292
if (inode_dirty) {
293
- dbgln_if (EXT2_DEBUG, " Ext2FS: Adding the indirect block to i_block array of inode {}" , inode_index );
294
- write_ext2_inode (inode_index, e2inode );
293
+ dbgln_if (EXT2_DEBUG, " Ext2FS: Adding the indirect block to i_block array of inode {}" , index () );
294
+ fs (). write_ext2_inode (index (), m_raw_inode );
295
295
inode_dirty = false ;
296
296
}
297
297
}
@@ -301,19 +301,19 @@ KResult Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e
301
301
remaining_blocks -= new_shape.indirect_blocks ;
302
302
output_block_index += new_shape.indirect_blocks ;
303
303
} else {
304
- auto block_contents = ByteBuffer::create_uninitialized (block_size ());
304
+ auto block_contents = ByteBuffer::create_uninitialized (fs (). block_size ());
305
305
OutputMemoryStream stream { block_contents };
306
306
307
307
VERIFY (new_shape.indirect_blocks <= entries_per_block);
308
308
for (unsigned i = 0 ; i < new_shape.indirect_blocks ; ++i) {
309
- stream << blocks [output_block_index++].value ();
309
+ stream << m_block_list [output_block_index++].value ();
310
310
--remaining_blocks;
311
311
}
312
312
313
313
stream.fill_to_end (0 );
314
314
315
315
auto buffer = UserOrKernelBuffer::for_kernel_buffer (stream.data ());
316
- auto result = write_block (e2inode .i_block [EXT2_IND_BLOCK], buffer, stream.size ());
316
+ auto result = fs (). write_block (m_raw_inode .i_block [EXT2_IND_BLOCK], buffer, stream.size ());
317
317
if (result.is_error ())
318
318
return result;
319
319
}
@@ -323,15 +323,15 @@ KResult Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e
323
323
324
324
bool dind_block_dirty = false ;
325
325
326
- bool dind_block_new = !e2inode .i_block [EXT2_DIND_BLOCK];
326
+ bool dind_block_new = !m_raw_inode .i_block [EXT2_DIND_BLOCK];
327
327
if (dind_block_new) {
328
- BlockIndex new_dindirect_block = new_meta_blocks.take_last ();
329
- if (e2inode .i_block [EXT2_DIND_BLOCK] != new_dindirect_block)
328
+ Ext2FS:: BlockIndex new_dindirect_block = new_meta_blocks.take_last ();
329
+ if (m_raw_inode .i_block [EXT2_DIND_BLOCK] != new_dindirect_block)
330
330
inode_dirty = true ;
331
- e2inode .i_block [EXT2_DIND_BLOCK] = new_dindirect_block.value ();
331
+ m_raw_inode .i_block [EXT2_DIND_BLOCK] = new_dindirect_block.value ();
332
332
if (inode_dirty) {
333
- dbgln_if (EXT2_DEBUG, " Ext2FS: Adding the doubly-indirect block to i_block array of inode {}" , inode_index );
334
- write_ext2_inode (inode_index, e2inode );
333
+ dbgln_if (EXT2_DEBUG, " Ext2FS: Adding the doubly-indirect block to i_block array of inode {}" , index () );
334
+ fs (). write_ext2_inode (index (), m_raw_inode );
335
335
inode_dirty = false ;
336
336
}
337
337
}
@@ -343,13 +343,13 @@ KResult Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e
343
343
} else {
344
344
unsigned indirect_block_count = divide_rounded_up (new_shape.doubly_indirect_blocks , entries_per_block);
345
345
346
- auto dind_block_contents = ByteBuffer::create_uninitialized (block_size ());
346
+ auto dind_block_contents = ByteBuffer::create_uninitialized (fs (). block_size ());
347
347
if (dind_block_new) {
348
348
dind_block_contents.zero_fill ();
349
349
dind_block_dirty = true ;
350
350
} else {
351
351
auto buffer = UserOrKernelBuffer::for_kernel_buffer (dind_block_contents.data ());
352
- auto result = read_block (e2inode .i_block [EXT2_DIND_BLOCK], &buffer, block_size ());
352
+ auto result = fs (). read_block (m_raw_inode .i_block [EXT2_DIND_BLOCK], &buffer, fs (). block_size ());
353
353
if (result.is_error ()) {
354
354
dbgln (" Ext2FS: write_block_list_for_inode had error: {}" , result.error ());
355
355
return result;
@@ -361,7 +361,7 @@ KResult Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e
361
361
for (unsigned i = 0 ; i < indirect_block_count; ++i) {
362
362
bool ind_block_dirty = false ;
363
363
364
- BlockIndex indirect_block_index = dind_block_as_pointers[i];
364
+ Ext2FS:: BlockIndex indirect_block_index = dind_block_as_pointers[i];
365
365
366
366
bool ind_block_new = !indirect_block_index;
367
367
if (ind_block_new) {
@@ -370,13 +370,13 @@ KResult Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e
370
370
dind_block_dirty = true ;
371
371
}
372
372
373
- auto ind_block_contents = ByteBuffer::create_uninitialized (block_size ());
373
+ auto ind_block_contents = ByteBuffer::create_uninitialized (fs (). block_size ());
374
374
if (ind_block_new) {
375
375
ind_block_contents.zero_fill ();
376
376
ind_block_dirty = true ;
377
377
} else {
378
378
auto buffer = UserOrKernelBuffer::for_kernel_buffer (ind_block_contents.data ());
379
- auto result = read_block (indirect_block_index, &buffer, block_size ());
379
+ auto result = fs (). read_block (indirect_block_index, &buffer, fs (). block_size ());
380
380
if (result.is_error ()) {
381
381
dbgln (" Ext2FS: write_block_list_for_inode had error: {}" , result.error ());
382
382
return result;
@@ -390,7 +390,7 @@ KResult Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e
390
390
391
391
VERIFY (entries_to_write <= entries_per_block);
392
392
for (unsigned j = 0 ; j < entries_to_write; ++j) {
393
- BlockIndex output_block = blocks [output_block_index++];
393
+ Ext2FS:: BlockIndex output_block = m_block_list [output_block_index++];
394
394
if (ind_block_as_pointers[j] != output_block) {
395
395
ind_block_as_pointers[j] = output_block.value ();
396
396
ind_block_dirty = true ;
@@ -406,7 +406,7 @@ KResult Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e
406
406
407
407
if (ind_block_dirty) {
408
408
auto buffer = UserOrKernelBuffer::for_kernel_buffer (ind_block_contents.data ());
409
- int err = write_block (indirect_block_index, buffer, block_size ());
409
+ int err = fs (). write_block (indirect_block_index, buffer, fs (). block_size ());
410
410
VERIFY (err >= 0 );
411
411
}
412
412
}
@@ -419,7 +419,7 @@ KResult Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e
419
419
420
420
if (dind_block_dirty) {
421
421
auto buffer = UserOrKernelBuffer::for_kernel_buffer (dind_block_contents.data ());
422
- int err = write_block (e2inode .i_block [EXT2_DIND_BLOCK], buffer, block_size ());
422
+ int err = fs (). write_block (m_raw_inode .i_block [EXT2_DIND_BLOCK], buffer, fs (). block_size ());
423
423
VERIFY (err >= 0 );
424
424
}
425
425
}
@@ -733,8 +733,6 @@ ssize_t Ext2FSInode::read_bytes(off_t offset, ssize_t count, UserOrKernelBuffer&
733
733
return nread;
734
734
}
735
735
736
- Locker fs_locker (fs ().m_lock );
737
-
738
736
if (m_block_list.is_empty ())
739
737
m_block_list = fs ().block_list_for_inode (m_raw_inode);
740
738
@@ -828,15 +826,15 @@ KResult Ext2FSInode::resize(u64 new_size)
828
826
}
829
827
}
830
828
831
- auto result = fs ().write_block_list_for_inode (index (), m_raw_inode, block_list);
829
+ m_block_list = move (block_list);
830
+
831
+ auto result = flush_block_list ();
832
832
if (result.is_error ())
833
833
return result;
834
834
835
835
m_raw_inode.i_size = new_size;
836
836
set_metadata_dirty (true );
837
837
838
- m_block_list = move (block_list);
839
-
840
838
if (new_size > old_size) {
841
839
// If we're growing the inode, make sure we zero out all the new space.
842
840
// FIXME: There are definitely more efficient ways to achieve this.
@@ -862,7 +860,6 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, ssize_t count, const UserOrKernel
862
860
VERIFY (count >= 0 );
863
861
864
862
Locker inode_locker (m_lock);
865
- Locker fs_locker (fs ().m_lock );
866
863
867
864
auto result = prepare_to_write_data ();
868
865
if (result.is_error ())
0 commit comments