diff --git a/kernel/include/kernel/FS/Ext2/FileSystem.h b/kernel/include/kernel/FS/Ext2/FileSystem.h index f0719f69..4c5d1842 100644 --- a/kernel/include/kernel/FS/Ext2/FileSystem.h +++ b/kernel/include/kernel/FS/Ext2/FileSystem.h @@ -28,7 +28,7 @@ namespace Kernel BAN_NON_COPYABLE(BlockBufferWrapper); public: - BlockBufferWrapper(BAN::Span buffer, void (*callback)(void*, const uint8_t*), void* argument) + BlockBufferWrapper(BAN::ByteSpan buffer, void (*callback)(void*, const uint8_t*), void* argument) : m_buffer(buffer) , m_callback(callback) , m_argument(argument) @@ -60,13 +60,13 @@ namespace Kernel const uint8_t* data() const { return m_buffer.data(); } BAN::ByteSpan span() { return m_buffer; } - BAN::ConstByteSpan span() const { return m_buffer.as_const(); } + BAN::ConstByteSpan span() const { return m_buffer; } uint8_t& operator[](size_t index) { return m_buffer[index]; } uint8_t operator[](size_t index) const { return m_buffer[index]; } private: - BAN::Span m_buffer; + BAN::ByteSpan m_buffer; void (*m_callback)(void*, const uint8_t*); void* m_argument; }; @@ -128,7 +128,7 @@ namespace Kernel private: struct BlockBuffer { - BAN::Vector buffer; + BAN::ByteSpan buffer; bool used { false }; }; @@ -144,6 +144,7 @@ namespace Kernel Mutex m_buffer_mutex; ThreadBlocker m_buffer_blocker; + BAN::UniqPtr m_buffer_data; BAN::Array m_buffers; BAN::Array m_thread_infos; }; diff --git a/kernel/kernel/FS/Ext2/FileSystem.cpp b/kernel/kernel/FS/Ext2/FileSystem.cpp index 920cfc75..568a56b2 100644 --- a/kernel/kernel/FS/Ext2/FileSystem.cpp +++ b/kernel/kernel/FS/Ext2/FileSystem.cpp @@ -624,7 +624,7 @@ namespace Kernel continue; buffer.used = true; return Ext2FS::BlockBufferWrapper { - buffer.buffer.span(), + buffer.buffer, [](void* self, const uint8_t* buffer) { static_cast(self)->destroy_callback(buffer); }, this }; @@ -635,11 +635,23 @@ namespace Kernel BAN::ErrorOr Ext2FS::BlockBufferManager::initialize(size_t block_size) { - for (auto& buffer : m_buffers) + m_buffer_data = TRY(VirtualRange::create_to_vaddr_range( + PageTable::kernel(), + { KERNEL_OFFSET, BAN::numeric_limits::max() }, + block_size * m_buffers.size(), + PageTable::ReadWrite | PageTable::Present, + false + )); + + auto buffer_data_span = BAN::ByteSpan { reinterpret_cast(m_buffer_data->vaddr()), m_buffer_data->size() }; + for (size_t i = 0; i < m_buffers.size(); i++) { - TRY(buffer.buffer.resize(block_size)); - buffer.used = false; + m_buffers[i] = { + .buffer = buffer_data_span.slice(i * block_size, block_size), + .used = false, + }; } + return {}; }