Refactor FS::write_inode() into Inode::write().

This commit is contained in:
Andreas Kling 2018-12-25 00:10:32 +01:00
parent b0db0e5de0
commit 4f142b86ec
Notes: sideshowbarker 2024-07-19 16:07:12 +09:00
5 changed files with 18 additions and 28 deletions

View file

@ -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, Vector<DirectoryEntr
kprintf("\n");
#endif
write_inode({ id(), directoryInode }, directoryData);
return true;
return get_inode({ id(), directoryInode })->write(directoryData);
}
unsigned Ext2FS::inodes_per_block() const

View file

@ -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<Inode> create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override;
virtual RetainPtr<Inode> create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override;
virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override;

View file

@ -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<bool(const FS::DirectoryEntry&)>) = 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; }

View file

@ -143,12 +143,6 @@ RetainPtr<Inode> SynthFS::create_inode(InodeIdentifier parentInode, const String
return { };
}
bool SynthFS::write_inode(InodeIdentifier, const ByteBuffer&)
{
kprintf("FIXME: Implement SyntheticFileSystem::writeInode().\n");
return false;
}
RetainPtr<Inode> 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;
}

View file

@ -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<Inode> create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override;
virtual RetainPtr<Inode> 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;