diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 2f897e8d99..58b5438237 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -987,7 +987,7 @@ KResult Ext2FSInode::traverse_as_directory(Function& entries) +KResult Ext2FSInode::write_directory(const Vector& entries) { LOCKER(m_lock); @@ -1034,9 +1034,11 @@ bool Ext2FSInode::write_directory(const Vector& entries) auto buffer = UserOrKernelBuffer::for_kernel_buffer(stream.data()); ssize_t nwritten = write_bytes(0, stream.size(), buffer, nullptr); if (nwritten < 0) - return false; + return KResult((ErrnoCode)-nwritten); set_metadata_dirty(true); - return static_cast(nwritten) == directory_data.size(); + if (static_cast(nwritten) != directory_data.size()) + return EIO; + return KSuccess; } KResultOr> Ext2FSInode::create_child(const String& name, mode_t mode, dev_t dev, uid_t uid, gid_t gid) @@ -1082,10 +1084,11 @@ KResult Ext2FSInode::add_child(Inode& child, const StringView& name, mode_t mode return result; entries.empend(name, child.identifier(), to_ext2_file_type(mode)); - bool success = write_directory(entries); - if (success) - m_lookup_cache.set(name, child.index()); + result = write_directory(entries); + if (result.is_error()) + return result; + m_lookup_cache.set(name, child.index()); did_add_child(child.identifier()); return KSuccess; } @@ -1118,11 +1121,9 @@ KResult Ext2FSInode::remove_child(const StringView& name) if (result.is_error()) return result; - bool success = write_directory(entries); - if (!success) { - // FIXME: Plumb error from write_directory(). - return EIO; - } + result = write_directory(entries); + if (result.is_error()) + return result; m_lookup_cache.remove(name); @@ -1455,11 +1456,12 @@ KResult Ext2FS::create_directory(InodeIdentifier parent_id, const String& name, entries.empend(".", inode->identifier(), static_cast(EXT2_FT_DIR)); entries.empend("..", parent_id, static_cast(EXT2_FT_DIR)); - bool success = static_cast(*inode).write_directory(entries); - ASSERT(success); + auto result = static_cast(*inode).write_directory(entries); + if (result.is_error()) + return result; auto parent_inode = get_inode(parent_id); - auto result = parent_inode->increment_link_count(); + result = parent_inode->increment_link_count(); if (result.is_error()) return result; diff --git a/Kernel/FileSystem/Ext2FileSystem.h b/Kernel/FileSystem/Ext2FileSystem.h index a395bd4c8e..aec3e30350 100644 --- a/Kernel/FileSystem/Ext2FileSystem.h +++ b/Kernel/FileSystem/Ext2FileSystem.h @@ -79,7 +79,7 @@ private: virtual KResultOr get_block_address(int) override; - bool write_directory(const Vector&); + KResult write_directory(const Vector&); bool populate_lookup_cache() const; KResult resize(u64);