mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 18:08:12 +00:00
Refactor FS::write_inode() into Inode::write().
This commit is contained in:
parent
b0db0e5de0
commit
4f142b86ec
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;
|
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.
|
// FIXME: Support writing to symlink inodes.
|
||||||
ASSERT(!isSymbolicLink(e2inode->i_mode));
|
ASSERT(!m_metadata.isSymbolicLink());
|
||||||
|
|
||||||
unsigned blocksNeededBefore = ceilDiv(e2inode->i_size, blockSize());
|
unsigned blocksNeededBefore = ceilDiv(size(), fs().blockSize());
|
||||||
unsigned blocksNeededAfter = ceilDiv((unsigned)data.size(), blockSize());
|
unsigned blocksNeededAfter = ceilDiv((unsigned)data.size(), fs().blockSize());
|
||||||
|
|
||||||
// FIXME: Support growing or shrinking the block list.
|
// FIXME: Support growing or shrinking the block list.
|
||||||
ASSERT(blocksNeededBefore == blocksNeededAfter);
|
ASSERT(blocksNeededBefore == blocksNeededAfter);
|
||||||
|
|
||||||
auto list = block_list_for_inode(*e2inode);
|
auto list = fs().block_list_for_inode(m_raw_inode);
|
||||||
if (list.is_empty()) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned i = 0; i < list.size(); ++i) {
|
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());
|
//kprintf("section = %p (%u)\n", section.pointer(), section.size());
|
||||||
bool success = writeBlock(list[i], section);
|
bool success = fs().writeBlock(list[i], section);
|
||||||
ASSERT(success);
|
ASSERT(success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,9 +514,7 @@ bool Ext2FS::write_directory_inode(unsigned directoryInode, Vector<DirectoryEntr
|
||||||
kprintf("\n");
|
kprintf("\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
write_inode({ id(), directoryInode }, directoryData);
|
return get_inode({ id(), directoryInode })->write(directoryData);
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Ext2FS::inodes_per_block() const
|
unsigned Ext2FS::inodes_per_block() const
|
||||||
|
|
|
@ -28,6 +28,7 @@ private:
|
||||||
virtual InodeIdentifier lookup(const String& name) override;
|
virtual InodeIdentifier lookup(const String& name) override;
|
||||||
virtual String reverse_lookup(InodeIdentifier) override;
|
virtual String reverse_lookup(InodeIdentifier) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
|
virtual bool write(const ByteBuffer&) override;
|
||||||
|
|
||||||
void populate_lookup_cache();
|
void populate_lookup_cache();
|
||||||
|
|
||||||
|
@ -71,7 +72,6 @@ private:
|
||||||
|
|
||||||
virtual const char* class_name() const override;
|
virtual const char* class_name() const override;
|
||||||
virtual InodeIdentifier root_inode() 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_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 RetainPtr<Inode> create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override;
|
||||||
virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override;
|
virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override;
|
||||||
|
|
|
@ -31,7 +31,6 @@ public:
|
||||||
virtual bool initialize() = 0;
|
virtual bool initialize() = 0;
|
||||||
virtual const char* class_name() const = 0;
|
virtual const char* class_name() const = 0;
|
||||||
virtual InodeIdentifier root_inode() const = 0;
|
virtual InodeIdentifier root_inode() const = 0;
|
||||||
virtual bool write_inode(InodeIdentifier, const ByteBuffer&) = 0;
|
|
||||||
|
|
||||||
bool is_readonly() const { return m_readonly; }
|
bool is_readonly() const { return m_readonly; }
|
||||||
|
|
||||||
|
@ -82,6 +81,7 @@ public:
|
||||||
virtual bool traverse_as_directory(Function<bool(const FS::DirectoryEntry&)>) = 0;
|
virtual bool traverse_as_directory(Function<bool(const FS::DirectoryEntry&)>) = 0;
|
||||||
virtual InodeIdentifier lookup(const String& name) = 0;
|
virtual InodeIdentifier lookup(const String& name) = 0;
|
||||||
virtual String reverse_lookup(InodeIdentifier) = 0;
|
virtual String reverse_lookup(InodeIdentifier) = 0;
|
||||||
|
virtual bool write(const ByteBuffer&) = 0;
|
||||||
|
|
||||||
bool is_metadata_dirty() const { return m_metadata_dirty; }
|
bool is_metadata_dirty() const { return m_metadata_dirty; }
|
||||||
|
|
||||||
|
|
|
@ -143,12 +143,6 @@ RetainPtr<Inode> SynthFS::create_inode(InodeIdentifier parentInode, const String
|
||||||
return { };
|
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)
|
RetainPtr<Inode> SynthFS::create_directory(InodeIdentifier, const String&, Unix::mode_t, int& error)
|
||||||
{
|
{
|
||||||
error = -EROFS;
|
error = -EROFS;
|
||||||
|
@ -263,3 +257,9 @@ String SynthFSInode::reverse_lookup(InodeIdentifier child_id)
|
||||||
void SynthFSInode::flush_metadata()
|
void SynthFSInode::flush_metadata()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SynthFSInode::write(const ByteBuffer&)
|
||||||
|
{
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@ public:
|
||||||
virtual bool initialize() override;
|
virtual bool initialize() override;
|
||||||
virtual const char* class_name() const override;
|
virtual const char* class_name() const override;
|
||||||
virtual InodeIdentifier root_inode() 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_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 RetainPtr<Inode> create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override;
|
||||||
virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override;
|
virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override;
|
||||||
|
@ -53,6 +52,7 @@ private:
|
||||||
virtual InodeIdentifier lookup(const String& name) override;
|
virtual InodeIdentifier lookup(const String& name) override;
|
||||||
virtual String reverse_lookup(InodeIdentifier) override;
|
virtual String reverse_lookup(InodeIdentifier) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
|
virtual bool write(const ByteBuffer&) override;
|
||||||
|
|
||||||
SynthFS& fs();
|
SynthFS& fs();
|
||||||
const SynthFS& fs() const;
|
const SynthFS& fs() const;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue