From d4f40241f11a7bc40dde6c1f460625ca9e388ef5 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 2 Feb 2021 16:37:52 +0100 Subject: [PATCH] Ext2FS: Avoid unnecessary parent inode lookup during inode creation Creation of new inodes is always driven by the parent inode, so we can just refer directly to it instead of looking up the parent by ID. --- Kernel/FileSystem/Ext2FileSystem.cpp | 25 ++++++++++--------------- Kernel/FileSystem/Ext2FileSystem.h | 4 ++-- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index b150194e80..7ed5212404 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -1044,8 +1044,8 @@ KResult Ext2FSInode::write_directory(const Vector& entries KResultOr> Ext2FSInode::create_child(const String& name, mode_t mode, dev_t dev, uid_t uid, gid_t gid) { if (::is_directory(mode)) - return fs().create_directory(identifier(), name, mode, uid, gid); - return fs().create_inode(identifier(), name, mode, dev, uid, gid); + return fs().create_directory(*this, name, mode, uid, gid); + return fs().create_inode(*this, name, mode, dev, uid, gid); } KResult Ext2FSInode::add_child(Inode& child, const StringView& name, mode_t mode) @@ -1426,13 +1426,12 @@ bool Ext2FS::set_block_allocation_state(BlockIndex block_index, bool new_state) return true; } -KResult Ext2FS::create_directory(InodeIdentifier parent_id, const String& name, mode_t mode, uid_t uid, gid_t gid) +KResult Ext2FS::create_directory(Ext2FSInode& parent_inode, const String& name, mode_t mode, uid_t uid, gid_t gid) { LOCKER(m_lock); - ASSERT(parent_id.fsid() == fsid()); ASSERT(is_directory(mode)); - auto inode_or_error = create_inode(parent_id, name, mode, 0, uid, gid); + auto inode_or_error = create_inode(parent_inode, name, mode, 0, uid, gid); if (inode_or_error.is_error()) return inode_or_error.error(); @@ -1444,14 +1443,13 @@ KResult Ext2FS::create_directory(InodeIdentifier parent_id, const String& name, Vector entries; entries.empend(".", inode->identifier(), static_cast(EXT2_FT_DIR)); - entries.empend("..", parent_id, static_cast(EXT2_FT_DIR)); + entries.empend("..", parent_inode.identifier(), static_cast(EXT2_FT_DIR)); auto result = static_cast(*inode).write_directory(entries); if (result.is_error()) return result; - auto parent_inode = get_inode(parent_id); - result = parent_inode->increment_link_count(); + result = parent_inode.increment_link_count(); if (result.is_error()) return result; @@ -1462,21 +1460,18 @@ KResult Ext2FS::create_directory(InodeIdentifier parent_id, const String& name, return KSuccess; } -KResultOr> Ext2FS::create_inode(InodeIdentifier parent_id, const String& name, mode_t mode, dev_t dev, uid_t uid, gid_t gid) +KResultOr> Ext2FS::create_inode(Ext2FSInode& parent_inode, const String& name, mode_t mode, dev_t dev, uid_t uid, gid_t gid) { LOCKER(m_lock); - ASSERT(parent_id.fsid() == fsid()); - auto parent_inode = get_inode(parent_id); - ASSERT(parent_inode); - if (static_cast(*parent_inode).m_raw_inode.i_links_count == 0) + if (parent_inode.m_raw_inode.i_links_count == 0) return ENOENT; if (name.length() > EXT2_NAME_LEN) return ENAMETOOLONG; #if EXT2_DEBUG - dbgln("Ext2FS: Adding inode '{}' (mode {:o}) to parent directory {}", name, mode, parent_inode->index()); + dbgln("Ext2FS: Adding inode '{}' (mode {:o}) to parent directory {}", name, mode, parent_inode.index()); #endif // NOTE: This doesn't commit the inode allocation just yet! @@ -1523,7 +1518,7 @@ KResultOr> Ext2FS::create_inode(InodeIdentifier parent_id, auto inode = get_inode({ fsid(), inode_id }); - auto result = parent_inode->add_child(*inode, name, mode); + auto result = parent_inode.add_child(*inode, name, mode); if (result.is_error()) return result; diff --git a/Kernel/FileSystem/Ext2FileSystem.h b/Kernel/FileSystem/Ext2FileSystem.h index 28e4b76760..55ba1eea93 100644 --- a/Kernel/FileSystem/Ext2FileSystem.h +++ b/Kernel/FileSystem/Ext2FileSystem.h @@ -138,8 +138,8 @@ private: virtual const char* class_name() const override; virtual NonnullRefPtr root_inode() const override; RefPtr get_inode(InodeIdentifier) const; - KResultOr> create_inode(InodeIdentifier parent_id, const String& name, mode_t, dev_t, uid_t, gid_t); - KResult create_directory(InodeIdentifier parent_inode, const String& name, mode_t, uid_t, gid_t); + KResultOr> create_inode(Ext2FSInode& parent_inode, const String& name, mode_t, dev_t, uid_t, gid_t); + KResult create_directory(Ext2FSInode& parent_inode, const String& name, mode_t, uid_t, gid_t); virtual void flush_writes() override; BlockIndex first_block_index() const;