Kernel: Ext2 inodes are now stored in cache
This allows faster inode access and ensures working inodes when opened in multiple places.
This commit is contained in:
parent
b62186441b
commit
55d30a7cc3
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <BAN/HashMap.h>
|
||||||
#include <kernel/Storage/StorageDevice.h>
|
#include <kernel/Storage/StorageDevice.h>
|
||||||
#include <kernel/FS/FileSystem.h>
|
#include <kernel/FS/FileSystem.h>
|
||||||
#include <kernel/FS/Ext2/Inode.h>
|
#include <kernel/FS/Ext2/Inode.h>
|
||||||
|
@ -65,6 +66,8 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<uint32_t> reserve_free_block(uint32_t primary_bgd);
|
BAN::ErrorOr<uint32_t> reserve_free_block(uint32_t primary_bgd);
|
||||||
|
|
||||||
|
BAN::HashMap<ino_t, BAN::RefPtr<Inode>>& inode_cache() { return m_inode_cache; }
|
||||||
|
|
||||||
const Ext2::Superblock& superblock() const { return m_superblock; }
|
const Ext2::Superblock& superblock() const { return m_superblock; }
|
||||||
|
|
||||||
struct BlockLocation
|
struct BlockLocation
|
||||||
|
@ -104,6 +107,8 @@ namespace Kernel
|
||||||
BAN::RefPtr<Inode> m_root_inode;
|
BAN::RefPtr<Inode> m_root_inode;
|
||||||
BAN::Vector<uint32_t> m_superblock_backups;
|
BAN::Vector<uint32_t> m_superblock_backups;
|
||||||
|
|
||||||
|
BAN::HashMap<ino_t, BAN::RefPtr<Inode>> m_inode_cache;
|
||||||
|
|
||||||
BlockBufferManager m_buffer_manager;
|
BlockBufferManager m_buffer_manager;
|
||||||
|
|
||||||
Ext2::Superblock m_superblock;
|
Ext2::Superblock m_superblock;
|
||||||
|
|
|
@ -23,6 +23,9 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::RefPtr<Inode>> Ext2Inode::create(Ext2FS& fs, uint32_t inode_ino)
|
BAN::ErrorOr<BAN::RefPtr<Inode>> Ext2Inode::create(Ext2FS& fs, uint32_t inode_ino)
|
||||||
{
|
{
|
||||||
|
if (fs.inode_cache().contains(inode_ino))
|
||||||
|
return fs.inode_cache()[inode_ino];
|
||||||
|
|
||||||
auto inode_location = fs.locate_inode(inode_ino);
|
auto inode_location = fs.locate_inode(inode_ino);
|
||||||
|
|
||||||
auto block_buffer = fs.get_block_buffer();
|
auto block_buffer = fs.get_block_buffer();
|
||||||
|
@ -30,10 +33,12 @@ namespace Kernel
|
||||||
|
|
||||||
auto& inode = *(Ext2::Inode*)(block_buffer.data() + inode_location.offset);
|
auto& inode = *(Ext2::Inode*)(block_buffer.data() + inode_location.offset);
|
||||||
|
|
||||||
Ext2Inode* result = new Ext2Inode(fs, inode, inode_ino);
|
Ext2Inode* result_ptr = new Ext2Inode(fs, inode, inode_ino);
|
||||||
if (result == nullptr)
|
if (result_ptr == nullptr)
|
||||||
return BAN::Error::from_errno(ENOMEM);
|
return BAN::Error::from_errno(ENOMEM);
|
||||||
return BAN::RefPtr<Inode>::adopt(result);
|
auto result = BAN::RefPtr<Inode>::adopt(result_ptr);
|
||||||
|
TRY(fs.inode_cache().insert(inode_ino, result));
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VERIFY_AND_READ_BLOCK(expr) do { const uint32_t block_index = expr; ASSERT(block_index); m_fs.read_block(block_index, block_buffer); } while (false)
|
#define VERIFY_AND_READ_BLOCK(expr) do { const uint32_t block_index = expr; ASSERT(block_index); m_fs.read_block(block_index, block_buffer); } while (false)
|
||||||
|
|
Loading…
Reference in New Issue