Skip to content

Commit eb78238

Browse files
committed
Ext2FS: Don't worry about updating lookup caches in write_ext2_inode().
Instead, have Ext2FSInode worry about that when flushing. Also tidy up in the inode bitmap accessors at the same time for some reason.
1 parent 8f95421 commit eb78238

File tree

1 file changed

+22
-28
lines changed

1 file changed

+22
-28
lines changed

VirtualFileSystem/Ext2FileSystem.cpp

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,11 @@ void Ext2FSInode::flush_metadata()
249249
{
250250
dbgprintf("Ext2FSInode: flush_metadata for inode %u\n", index());
251251
fs().write_ext2_inode(index(), m_raw_inode);
252+
if (is_directory()) {
253+
// FIXME: This invalidation is way too hardcore.
254+
LOCKER(m_lock);
255+
m_lookup_cache.clear();
256+
}
252257
set_metadata_dirty(false);
253258
}
254259

@@ -586,17 +591,6 @@ bool Ext2FS::write_ext2_inode(unsigned inode, const ext2_inode& e2inode)
586591
auto block = read_block_containing_inode(inode, blockIndex, offset);
587592
if (!block)
588593
return false;
589-
{
590-
LOCKER(m_inode_cache_lock);
591-
auto it = m_inode_cache.find(inode);
592-
if (it != m_inode_cache.end()) {
593-
auto& cached_inode = *(*it).value;
594-
LOCKER(cached_inode.m_lock);
595-
cached_inode.m_raw_inode = e2inode;
596-
if (cached_inode.is_directory())
597-
cached_inode.m_lookup_cache.clear();
598-
}
599-
}
600594
memcpy(reinterpret_cast<ext2_inode*>(block.offset_pointer(offset)), &e2inode, inode_size());
601595
writeBlock(blockIndex, block);
602596
return true;
@@ -699,35 +693,34 @@ bool Ext2FS::get_inode_allocation_state(InodeIndex index) const
699693
if (index == 0)
700694
return true;
701695
auto& bgd = group_descriptor(group_index_from_inode(index));
702-
703-
unsigned inodesPerBitmapBlock = blockSize() * 8;
704-
unsigned bitmapBlockIndex = (index - 1) / inodesPerBitmapBlock;
705-
unsigned bitIndex = (index - 1) % inodesPerBitmapBlock;
706-
auto block = readBlock(bgd.bg_inode_bitmap + bitmapBlockIndex);
696+
unsigned inodes_per_bitmap_block = blockSize() * 8;
697+
unsigned bitmap_block_index = (index - 1) / inodes_per_bitmap_block;
698+
unsigned bit_index = (index - 1) % inodes_per_bitmap_block;
699+
auto block = readBlock(bgd.bg_inode_bitmap + bitmap_block_index);
707700
ASSERT(block);
708701
auto bitmap = Bitmap::wrap(block.pointer(), block.size());
709-
return bitmap.get(bitIndex);
702+
return bitmap.get(bit_index);
710703
}
711704

712-
bool Ext2FS::set_inode_allocation_state(unsigned inode, bool newState)
705+
bool Ext2FS::set_inode_allocation_state(unsigned index, bool newState)
713706
{
714-
auto& bgd = group_descriptor(group_index_from_inode(inode));
707+
auto& bgd = group_descriptor(group_index_from_inode(index));
715708

716709
// Update inode bitmap
717-
unsigned inodesPerBitmapBlock = blockSize() * 8;
718-
unsigned bitmapBlockIndex = (inode - 1) / inodesPerBitmapBlock;
719-
unsigned bitIndex = (inode - 1) % inodesPerBitmapBlock;
720-
auto block = readBlock(bgd.bg_inode_bitmap + bitmapBlockIndex);
710+
unsigned inodes_per_bitmap_block = blockSize() * 8;
711+
unsigned bitmap_block_index = (index - 1) / inodes_per_bitmap_block;
712+
unsigned bit_index = (index - 1) % inodes_per_bitmap_block;
713+
auto block = readBlock(bgd.bg_inode_bitmap + bitmap_block_index);
721714
ASSERT(block);
722715
auto bitmap = Bitmap::wrap(block.pointer(), block.size());
723-
bool currentState = bitmap.get(bitIndex);
724-
dbgprintf("ext2fs: setInodeAllocationState(%u) %u -> %u\n", inode, currentState, newState);
716+
bool currentState = bitmap.get(bit_index);
717+
dbgprintf("Ext2FS: set_inode_allocation_state(%u) %u -> %u\n", index, currentState, newState);
725718

726719
if (currentState == newState)
727720
return true;
728721

729-
bitmap.set(bitIndex, newState);
730-
writeBlock(bgd.bg_inode_bitmap + bitmapBlockIndex, block);
722+
bitmap.set(bit_index, newState);
723+
writeBlock(bgd.bg_inode_bitmap + bitmap_block_index, block);
731724

732725
// Update superblock
733726
auto& sb = *reinterpret_cast<ext2_super_block*>(m_cached_super_block.pointer());
@@ -913,11 +906,12 @@ RetainPtr<Inode> Ext2FS::create_inode(InodeIdentifier parent_id, const String& n
913906
// FIXME: Implement writing out indirect blocks!
914907
ASSERT(blocks.size() < EXT2_NDIR_BLOCKS);
915908

916-
dbgprintf("Ext2FS: writing %zu blocks to i_block array\n", min((size_t)EXT2_NDIR_BLOCKS, blocks.size()));
909+
dbgprintf("Ext2FS: writing %u blocks to i_block array\n", min((size_t)EXT2_NDIR_BLOCKS, blocks.size()));
917910
for (unsigned i = 0; i < min((size_t)EXT2_NDIR_BLOCKS, blocks.size()); ++i) {
918911
e2inode->i_block[i] = blocks[i];
919912
}
920913

914+
dbgprintf("Ext2FS: writing initial metadata for inode %u\n", inode_id);
921915
e2inode->i_flags = 0;
922916
success = write_ext2_inode(inode_id, *e2inode);
923917
ASSERT(success);

0 commit comments

Comments
 (0)