From 47da86d13646e202a71b985c536dc101c9706f59 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 18 Dec 2020 13:18:47 +0100 Subject: Ext2FS: Fail the mount if BGD table cache allocation fails Instead of asserting if we can't allocate enough memory for a BGD table cache, just fail the mount instead. --- Kernel/FileSystem/Ext2FileSystem.cpp | 8 ++++++-- Kernel/FileSystem/Ext2FileSystem.h | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) (limited to 'Kernel') diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 26767b31ad..41d0dcd39f 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -141,8 +141,12 @@ bool Ext2FS::initialize() unsigned blocks_to_read = ceil_div(m_block_group_count * sizeof(ext2_group_desc), block_size()); BlockIndex first_block_of_bgdt = block_size() == 1024 ? 2 : 1; - m_cached_group_descriptor_table = KBuffer::create_with_size(block_size() * blocks_to_read, Region::Access::Read | Region::Access::Write, "Ext2FS: Block group descriptors"); - auto buffer = UserOrKernelBuffer::for_kernel_buffer(m_cached_group_descriptor_table.value().data()); + m_cached_group_descriptor_table = KBuffer::try_create_with_size(block_size() * blocks_to_read, Region::Access::Read | Region::Access::Write, "Ext2FS: Block group descriptors"); + if (!m_cached_group_descriptor_table) { + dbgln("Ext2FS: Failed to allocate memory for group descriptor table"); + return false; + } + auto buffer = UserOrKernelBuffer::for_kernel_buffer(m_cached_group_descriptor_table->data()); read_blocks(first_block_of_bgdt, blocks_to_read, buffer); #ifdef EXT2_DEBUG diff --git a/Kernel/FileSystem/Ext2FileSystem.h b/Kernel/FileSystem/Ext2FileSystem.h index d274fb082e..d811ca0f8a 100644 --- a/Kernel/FileSystem/Ext2FileSystem.h +++ b/Kernel/FileSystem/Ext2FileSystem.h @@ -120,8 +120,8 @@ private: const ext2_super_block& super_block() const { return m_super_block; } const ext2_group_desc& group_descriptor(GroupIndex) const; - ext2_group_desc* block_group_descriptors() { return (ext2_group_desc*)m_cached_group_descriptor_table.value().data(); } - const ext2_group_desc* block_group_descriptors() const { return (const ext2_group_desc*)m_cached_group_descriptor_table.value().data(); } + ext2_group_desc* block_group_descriptors() { return (ext2_group_desc*)m_cached_group_descriptor_table->data(); } + const ext2_group_desc* block_group_descriptors() const { return (const ext2_group_desc*)m_cached_group_descriptor_table->data(); } void flush_block_group_descriptor_table(); unsigned inodes_per_block() const; unsigned inodes_per_group() const; @@ -170,7 +170,7 @@ private: unsigned m_block_group_count { 0 }; mutable ext2_super_block m_super_block; - mutable Optional m_cached_group_descriptor_table; + mutable OwnPtr m_cached_group_descriptor_table; mutable HashMap> m_inode_cache; -- cgit v1.2.3