mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-21 18:37:58 +03: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:
parent
43f930d3aa
commit
15cd5d324c
Notes:
sideshowbarker
2024-07-18 07:32:03 +09:00
Author: https://github.com/bgianfo Commit: https://github.com/SerenityOS/serenity/commit/15cd5d324c9 Pull-request: https://github.com/SerenityOS/serenity/pull/9154 Reviewed-by: https://github.com/alimpfard ✅
@ -701,7 +701,7 @@ void Ext2FS::flush_writes()
|
||||
}
|
||||
for (auto& cached_bitmap : m_cached_bitmaps) {
|
||||
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()) {
|
||||
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;
|
||||
}
|
||||
|
||||
auto block = KBuffer::create_with_size(block_size(), Region::Access::Read | Region::Access::Write, "Ext2FS: Cached bitmap block");
|
||||
auto buffer = UserOrKernelBuffer::for_kernel_buffer(block.data());
|
||||
auto block = KBuffer::try_create_with_size(block_size(), Region::Access::Read | Region::Access::Write, "Ext2FS: Cached bitmap block");
|
||||
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()) {
|
||||
dbgln("Ext2FS: Failed to load bitmap block {}", bitmap_block_index);
|
||||
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)
|
||||
return ENOMEM;
|
||||
if (!m_cached_bitmaps.try_append(move(new_bitmap)))
|
||||
|
@ -168,15 +168,15 @@ private:
|
||||
bool m_block_group_descriptors_dirty { false };
|
||||
|
||||
struct CachedBitmap {
|
||||
CachedBitmap(BlockIndex bi, KBuffer&& buf)
|
||||
CachedBitmap(BlockIndex bi, NonnullOwnPtr<KBuffer> buf)
|
||||
: bitmap_block_index(bi)
|
||||
, buffer(move(buf))
|
||||
{
|
||||
}
|
||||
BlockIndex bitmap_block_index { 0 };
|
||||
bool dirty { false };
|
||||
KBuffer buffer;
|
||||
BitmapView bitmap(u32 blocks_per_group) { return BitmapView { buffer.data(), blocks_per_group }; }
|
||||
NonnullOwnPtr<KBuffer> buffer;
|
||||
BitmapView bitmap(u32 blocks_per_group) { return BitmapView { buffer->data(), blocks_per_group }; }
|
||||
};
|
||||
|
||||
KResultOr<CachedBitmap*> get_bitmap_block(BlockIndex);
|
||||
|
Loading…
Reference in New Issue
Block a user