Refactor FS::write_inode() into Inode::write().
This commit is contained in:
parent
b0db0e5de0
commit
4f142b86ec
Notes:
sideshowbarker
2024-07-19 16:07:12 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/4f142b86ec8
5 changed files with 18 additions and 28 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue