@@ -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