From 4f142b86ec8068cfc57a3b2b4f7d844d1179206a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 25 Dec 2018 00:10:32 +0100 Subject: [PATCH] Refactor FS::write_inode() into Inode::write(). --- VirtualFileSystem/Ext2FileSystem.cpp | 28 ++++++++--------------- VirtualFileSystem/Ext2FileSystem.h | 2 +- VirtualFileSystem/FileSystem.h | 2 +- VirtualFileSystem/SyntheticFileSystem.cpp | 12 +++++----- VirtualFileSystem/SyntheticFileSystem.h | 2 +- 5 files changed, 18 insertions(+), 28 deletions(-) diff --git a/VirtualFileSystem/Ext2FileSystem.cpp b/VirtualFileSystem/Ext2FileSystem.cpp index 730ec3f93f..38b6e82b4e 100644 --- a/VirtualFileSystem/Ext2FileSystem.cpp +++ b/VirtualFileSystem/Ext2FileSystem.cpp @@ -373,35 +373,27 @@ ssize_t Ext2FSInode::read_bytes(Unix::off_t offset, size_t count, byte* buffer, return nread; } -bool Ext2FS::write_inode(InodeIdentifier inode, const ByteBuffer& data) +bool Ext2FSInode::write(const ByteBuffer& data) { - ASSERT(inode.fsid() == id()); - - auto e2inode = lookup_ext2_inode(inode.index()); - if (!e2inode) { - kprintf("ext2fs: writeInode: metadata lookup for inode %u failed\n", inode.index()); - return false; - } - // FIXME: Support writing to symlink inodes. - ASSERT(!isSymbolicLink(e2inode->i_mode)); + ASSERT(!m_metadata.isSymbolicLink()); - unsigned blocksNeededBefore = ceilDiv(e2inode->i_size, blockSize()); - unsigned blocksNeededAfter = ceilDiv((unsigned)data.size(), blockSize()); + unsigned blocksNeededBefore = ceilDiv(size(), fs().blockSize()); + unsigned blocksNeededAfter = ceilDiv((unsigned)data.size(), fs().blockSize()); // FIXME: Support growing or shrinking the block list. ASSERT(blocksNeededBefore == blocksNeededAfter); - auto list = block_list_for_inode(*e2inode); + auto list = fs().block_list_for_inode(m_raw_inode); if (list.is_empty()) { - kprintf("ext2fs: writeInode: empty block list for inode %u\n", inode.index()); + kprintf("ext2fs: writeInode: empty block list for inode %u\n", index()); return false; } for (unsigned i = 0; i < list.size(); ++i) { - auto section = data.slice(i * blockSize(), blockSize()); + auto section = data.slice(i * fs().blockSize(), fs().blockSize()); //kprintf("section = %p (%u)\n", section.pointer(), section.size()); - bool success = writeBlock(list[i], section); + bool success = fs().writeBlock(list[i], section); ASSERT(success); } @@ -522,9 +514,7 @@ bool Ext2FS::write_directory_inode(unsigned directoryInode, Vectorwrite(directoryData); } unsigned Ext2FS::inodes_per_block() const diff --git a/VirtualFileSystem/Ext2FileSystem.h b/VirtualFileSystem/Ext2FileSystem.h index 3e4992f53d..429834408a 100644 --- a/VirtualFileSystem/Ext2FileSystem.h +++ b/VirtualFileSystem/Ext2FileSystem.h @@ -28,6 +28,7 @@ private: virtual InodeIdentifier lookup(const String& name) override; virtual String reverse_lookup(InodeIdentifier) override; virtual void flush_metadata() override; + virtual bool write(const ByteBuffer&) override; void populate_lookup_cache(); @@ -71,7 +72,6 @@ private: virtual const char* class_name() const override; virtual InodeIdentifier root_inode() const override; - virtual bool write_inode(InodeIdentifier, const ByteBuffer&) override; virtual RetainPtr create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override; virtual RetainPtr create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override; virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override; diff --git a/VirtualFileSystem/FileSystem.h b/VirtualFileSystem/FileSystem.h index dc7727e5f3..dcc8a4ddda 100644 --- a/VirtualFileSystem/FileSystem.h +++ b/VirtualFileSystem/FileSystem.h @@ -31,7 +31,6 @@ public: virtual bool initialize() = 0; virtual const char* class_name() const = 0; virtual InodeIdentifier root_inode() const = 0; - virtual bool write_inode(InodeIdentifier, const ByteBuffer&) = 0; bool is_readonly() const { return m_readonly; } @@ -82,6 +81,7 @@ public: virtual bool traverse_as_directory(Function) = 0; virtual InodeIdentifier lookup(const String& name) = 0; virtual String reverse_lookup(InodeIdentifier) = 0; + virtual bool write(const ByteBuffer&) = 0; bool is_metadata_dirty() const { return m_metadata_dirty; } diff --git a/VirtualFileSystem/SyntheticFileSystem.cpp b/VirtualFileSystem/SyntheticFileSystem.cpp index 0f6d0d0e69..63994345aa 100644 --- a/VirtualFileSystem/SyntheticFileSystem.cpp +++ b/VirtualFileSystem/SyntheticFileSystem.cpp @@ -143,12 +143,6 @@ RetainPtr SynthFS::create_inode(InodeIdentifier parentInode, const String return { }; } -bool SynthFS::write_inode(InodeIdentifier, const ByteBuffer&) -{ - kprintf("FIXME: Implement SyntheticFileSystem::writeInode().\n"); - return false; -} - RetainPtr SynthFS::create_directory(InodeIdentifier, const String&, Unix::mode_t, int& error) { error = -EROFS; @@ -263,3 +257,9 @@ String SynthFSInode::reverse_lookup(InodeIdentifier child_id) void SynthFSInode::flush_metadata() { } + +bool SynthFSInode::write(const ByteBuffer&) +{ + ASSERT_NOT_REACHED(); + return false; +} diff --git a/VirtualFileSystem/SyntheticFileSystem.h b/VirtualFileSystem/SyntheticFileSystem.h index 4f69a9333d..020e9e14eb 100644 --- a/VirtualFileSystem/SyntheticFileSystem.h +++ b/VirtualFileSystem/SyntheticFileSystem.h @@ -14,7 +14,6 @@ public: virtual bool initialize() override; virtual const char* class_name() const override; virtual InodeIdentifier root_inode() const override; - virtual bool write_inode(InodeIdentifier, const ByteBuffer&) override; virtual RetainPtr create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override; virtual RetainPtr create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override; virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override; @@ -53,6 +52,7 @@ private: virtual InodeIdentifier lookup(const String& name) override; virtual String reverse_lookup(InodeIdentifier) override; virtual void flush_metadata() override; + virtual bool write(const ByteBuffer&) override; SynthFS& fs(); const SynthFS& fs() const;