From e36484662252fca23474e9227e3dee993ef3257a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 22 Sep 2019 18:50:24 +0200 Subject: [PATCH] Ext2FS: Don't allocate blocks until we're committed to a new inode Otherwise we would leak the blocks in case we returned earlier than expected. :^) --- Kernel/FileSystem/Ext2FileSystem.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index e9a0a78b84..cdeae78e23 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -1204,13 +1204,6 @@ RefPtr Ext2FS::create_inode(InodeIdentifier parent_id, const String& name return {}; } - auto blocks = allocate_blocks(group_index_from_inode(inode_id), needed_blocks); - if (blocks.size() != needed_blocks) { - kprintf("Ext2FS: create_inode: allocate_blocks failed\n"); - error = -ENOSPC; - return {}; - } - // Try adding it to the directory first, in case the name is already in use. auto result = parent_inode->add_child({ fsid(), inode_id }, name, mode); if (result.is_error()) { @@ -1218,6 +1211,9 @@ RefPtr Ext2FS::create_inode(InodeIdentifier parent_id, const String& name return {}; } + auto blocks = allocate_blocks(group_index_from_inode(inode_id), needed_blocks); + ASSERT(blocks.size() == needed_blocks); + // Looks like we're good, time to update the inode bitmap and group+global inode counters. bool success = set_inode_allocation_state(inode_id, true); ASSERT(success);