forked from Bananymous/banan-os
				
			
			update main #1
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <BAN/Iteration.h>
 | 
			
		||||
#include <BAN/Optional.h>
 | 
			
		||||
#include <kernel/FS/Inode.h>
 | 
			
		||||
#include <kernel/FS/TmpFS/Definitions.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +36,7 @@ namespace Kernel
 | 
			
		|||
		void sync();
 | 
			
		||||
		void free_all_blocks();
 | 
			
		||||
 | 
			
		||||
		size_t block_index(size_t data_block_index);
 | 
			
		||||
		BAN::Optional<size_t> block_index(size_t data_block_index);
 | 
			
		||||
		BAN::ErrorOr<size_t> block_index_with_allocation(size_t data_block_index);
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,11 +77,12 @@ namespace Kernel
 | 
			
		|||
			ASSERT(block == 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	size_t TmpInode::block_index(size_t data_block_index)
 | 
			
		||||
	BAN::Optional<size_t> TmpInode::block_index(size_t data_block_index)
 | 
			
		||||
	{
 | 
			
		||||
		ASSERT(data_block_index < TmpInodeInfo::direct_block_count);
 | 
			
		||||
		ASSERT(m_inode_info.block[data_block_index]);
 | 
			
		||||
		return m_inode_info.block[data_block_index];
 | 
			
		||||
		if (m_inode_info.block[data_block_index])
 | 
			
		||||
			return m_inode_info.block[data_block_index];
 | 
			
		||||
		return {};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BAN::ErrorOr<size_t> TmpInode::block_index_with_allocation(size_t data_block_index)
 | 
			
		||||
| 
						 | 
				
			
			@ -146,11 +147,14 @@ namespace Kernel
 | 
			
		|||
			const size_t data_block_index = (read_done + offset) / blksize();
 | 
			
		||||
			const size_t block_offset     = (read_done + offset) % blksize();
 | 
			
		||||
 | 
			
		||||
			const size_t block_index = this->block_index(data_block_index);
 | 
			
		||||
			const auto block_index = this->block_index(data_block_index);
 | 
			
		||||
 | 
			
		||||
			const size_t bytes = BAN::Math::min<size_t>(bytes_to_read - read_done, blksize() - block_offset);
 | 
			
		||||
 | 
			
		||||
			m_fs.read_block(block_index, block_buffer.span());
 | 
			
		||||
			if (block_index.has_value())
 | 
			
		||||
				m_fs.read_block(block_index.value(), block_buffer.span());
 | 
			
		||||
			else
 | 
			
		||||
				memset(block_buffer.data(), 0x00, block_buffer.size());
 | 
			
		||||
 | 
			
		||||
			memcpy(buffer.data() + read_done, block_buffer.data() + block_offset, bytes);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -178,7 +182,7 @@ namespace Kernel
 | 
			
		|||
			const size_t data_block_index = (write_done + offset) / blksize();
 | 
			
		||||
			const size_t block_offset     = (write_done + offset) % blksize();
 | 
			
		||||
 | 
			
		||||
			const size_t block_index = this->block_index(data_block_index);
 | 
			
		||||
			const size_t block_index = TRY(block_index_with_allocation(data_block_index));
 | 
			
		||||
 | 
			
		||||
			const size_t bytes = BAN::Math::min<size_t>(bytes_to_write - write_done, blksize() - block_offset);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -196,9 +200,6 @@ namespace Kernel
 | 
			
		|||
 | 
			
		||||
	BAN::ErrorOr<void> TmpFileInode::truncate_impl(size_t new_size)
 | 
			
		||||
	{
 | 
			
		||||
		size_t start_block = size() / blksize() * blksize();
 | 
			
		||||
		for (size_t off = start_block; off < new_size; off += blksize())
 | 
			
		||||
			TRY(block_index_with_allocation(off / blksize()));
 | 
			
		||||
		m_inode_info.size = new_size;
 | 
			
		||||
		return {};
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -349,8 +350,8 @@ namespace Kernel
 | 
			
		|||
		size_t full_offset = 0;
 | 
			
		||||
		while (full_offset < (size_t)size())
 | 
			
		||||
		{
 | 
			
		||||
			size_t data_block_index = full_offset / blksize();
 | 
			
		||||
			size_t block_index = this->block_index(data_block_index);
 | 
			
		||||
			const size_t data_block_index = full_offset / blksize();
 | 
			
		||||
			const size_t block_index = this->block_index(data_block_index).value();
 | 
			
		||||
 | 
			
		||||
			// FIXME: implement fast heap pages?
 | 
			
		||||
			BAN::Vector<uint8_t> buffer;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue