1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 15:48:12 +00:00

Kernel: Handle OOM from KBuffer usage in Ext2FS::get_bitmap_block()

Fixes up error handling on an OOM-able path, and removes one more usage
of KBuffer::create_with_size.
This commit is contained in:
Brian Gianforcaro 2021-08-01 02:21:20 -07:00 committed by Andreas Kling
parent 43f930d3aa
commit 15cd5d324c
2 changed files with 9 additions and 7 deletions

View file

@ -701,7 +701,7 @@ void Ext2FS::flush_writes()
} }
for (auto& cached_bitmap : m_cached_bitmaps) { for (auto& cached_bitmap : m_cached_bitmaps) {
if (cached_bitmap->dirty) { if (cached_bitmap->dirty) {
auto buffer = UserOrKernelBuffer::for_kernel_buffer(cached_bitmap->buffer.data()); auto buffer = UserOrKernelBuffer::for_kernel_buffer(cached_bitmap->buffer->data());
if (auto result = write_block(cached_bitmap->bitmap_block_index, buffer, block_size()); result.is_error()) { if (auto result = write_block(cached_bitmap->bitmap_block_index, buffer, block_size()); result.is_error()) {
dbgln("Ext2FS[{}]::flush_writes(): Failed to write blocks: {}", fsid(), result.error()); dbgln("Ext2FS[{}]::flush_writes(): Failed to write blocks: {}", fsid(), result.error());
} }
@ -1499,13 +1499,15 @@ KResultOr<Ext2FS::CachedBitmap*> Ext2FS::get_bitmap_block(BlockIndex bitmap_bloc
return cached_bitmap; return cached_bitmap;
} }
auto block = KBuffer::create_with_size(block_size(), Region::Access::Read | Region::Access::Write, "Ext2FS: Cached bitmap block"); auto block = KBuffer::try_create_with_size(block_size(), Region::Access::Read | Region::Access::Write, "Ext2FS: Cached bitmap block");
auto buffer = UserOrKernelBuffer::for_kernel_buffer(block.data()); if (!block)
return ENOMEM;
auto buffer = UserOrKernelBuffer::for_kernel_buffer(block->data());
if (auto result = read_block(bitmap_block_index, &buffer, block_size()); result.is_error()) { if (auto result = read_block(bitmap_block_index, &buffer, block_size()); result.is_error()) {
dbgln("Ext2FS: Failed to load bitmap block {}", bitmap_block_index); dbgln("Ext2FS: Failed to load bitmap block {}", bitmap_block_index);
return result; return result;
} }
auto new_bitmap = adopt_own_if_nonnull(new (nothrow) CachedBitmap(bitmap_block_index, move(block))); auto new_bitmap = adopt_own_if_nonnull(new (nothrow) CachedBitmap(bitmap_block_index, block.release_nonnull()));
if (!new_bitmap) if (!new_bitmap)
return ENOMEM; return ENOMEM;
if (!m_cached_bitmaps.try_append(move(new_bitmap))) if (!m_cached_bitmaps.try_append(move(new_bitmap)))

View file

@ -168,15 +168,15 @@ private:
bool m_block_group_descriptors_dirty { false }; bool m_block_group_descriptors_dirty { false };
struct CachedBitmap { struct CachedBitmap {
CachedBitmap(BlockIndex bi, KBuffer&& buf) CachedBitmap(BlockIndex bi, NonnullOwnPtr<KBuffer> buf)
: bitmap_block_index(bi) : bitmap_block_index(bi)
, buffer(move(buf)) , buffer(move(buf))
{ {
} }
BlockIndex bitmap_block_index { 0 }; BlockIndex bitmap_block_index { 0 };
bool dirty { false }; bool dirty { false };
KBuffer buffer; NonnullOwnPtr<KBuffer> buffer;
BitmapView bitmap(u32 blocks_per_group) { return BitmapView { buffer.data(), blocks_per_group }; } BitmapView bitmap(u32 blocks_per_group) { return BitmapView { buffer->data(), blocks_per_group }; }
}; };
KResultOr<CachedBitmap*> get_bitmap_block(BlockIndex); KResultOr<CachedBitmap*> get_bitmap_block(BlockIndex);