forked from Bananymous/banan-os
				
			
			update main #1
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <BAN/HashMap.h>
 | 
			
		||||
#include <kernel/Storage/StorageDevice.h>
 | 
			
		||||
#include <kernel/FS/FileSystem.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::HashMap<ino_t, BAN::RefPtr<Inode>>& inode_cache() { return m_inode_cache; }
 | 
			
		||||
 | 
			
		||||
		const Ext2::Superblock& superblock() const { return m_superblock; }
 | 
			
		||||
 | 
			
		||||
		struct BlockLocation
 | 
			
		||||
| 
						 | 
				
			
			@ -104,6 +107,8 @@ namespace Kernel
 | 
			
		|||
		BAN::RefPtr<Inode> m_root_inode;
 | 
			
		||||
		BAN::Vector<uint32_t> m_superblock_backups;
 | 
			
		||||
 | 
			
		||||
		BAN::HashMap<ino_t, BAN::RefPtr<Inode>> m_inode_cache;
 | 
			
		||||
 | 
			
		||||
		BlockBufferManager m_buffer_manager;
 | 
			
		||||
 | 
			
		||||
		Ext2::Superblock m_superblock;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,9 @@ namespace Kernel
 | 
			
		|||
 | 
			
		||||
	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 block_buffer = fs.get_block_buffer();
 | 
			
		||||
| 
						 | 
				
			
			@ -30,10 +33,12 @@ namespace Kernel
 | 
			
		|||
 | 
			
		||||
		auto& inode = *(Ext2::Inode*)(block_buffer.data() + inode_location.offset);
 | 
			
		||||
 | 
			
		||||
		Ext2Inode* result = new Ext2Inode(fs, inode, inode_ino);
 | 
			
		||||
		if (result == nullptr)
 | 
			
		||||
		Ext2Inode* result_ptr = new Ext2Inode(fs, inode, inode_ino);
 | 
			
		||||
		if (result_ptr == nullptr)
 | 
			
		||||
			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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue