mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:38:11 +00:00
FileSystem: Pass mode_t to Inode::add_child().
This way the Ext2FS code can update its directory entry "file type" fields correctly based on the file mode. This fixes some e2fsck whining.
This commit is contained in:
parent
fdf3608c8a
commit
9ac95d1867
8 changed files with 30 additions and 29 deletions
|
@ -12,6 +12,25 @@
|
||||||
|
|
||||||
static const ssize_t max_inline_symlink_length = 60;
|
static const ssize_t max_inline_symlink_length = 60;
|
||||||
|
|
||||||
|
static byte to_ext2_file_type(mode_t mode)
|
||||||
|
{
|
||||||
|
if (is_regular_file(mode))
|
||||||
|
return EXT2_FT_REG_FILE;
|
||||||
|
if (is_directory(mode))
|
||||||
|
return EXT2_FT_DIR;
|
||||||
|
if (is_character_device(mode))
|
||||||
|
return EXT2_FT_CHRDEV;
|
||||||
|
if (is_block_device(mode))
|
||||||
|
return EXT2_FT_BLKDEV;
|
||||||
|
if (is_fifo(mode))
|
||||||
|
return EXT2_FT_FIFO;
|
||||||
|
if (is_socket(mode))
|
||||||
|
return EXT2_FT_SOCK;
|
||||||
|
if (is_symlink(mode))
|
||||||
|
return EXT2_FT_SYMLINK;
|
||||||
|
return EXT2_FT_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
Retained<Ext2FS> Ext2FS::create(Retained<DiskDevice>&& device)
|
Retained<Ext2FS> Ext2FS::create(Retained<DiskDevice>&& device)
|
||||||
{
|
{
|
||||||
return adopt(*new Ext2FS(move(device)));
|
return adopt(*new Ext2FS(move(device)));
|
||||||
|
@ -685,7 +704,7 @@ bool Ext2FSInode::traverse_as_directory(Function<bool(const FS::DirectoryEntry&)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult Ext2FSInode::add_child(InodeIdentifier child_id, const String& name, byte file_type)
|
KResult Ext2FSInode::add_child(InodeIdentifier child_id, const String& name, mode_t mode)
|
||||||
{
|
{
|
||||||
LOCKER(m_lock);
|
LOCKER(m_lock);
|
||||||
ASSERT(is_directory());
|
ASSERT(is_directory());
|
||||||
|
@ -713,7 +732,7 @@ KResult Ext2FSInode::add_child(InodeIdentifier child_id, const String& name, byt
|
||||||
if (child_inode)
|
if (child_inode)
|
||||||
child_inode->increment_link_count();
|
child_inode->increment_link_count();
|
||||||
|
|
||||||
entries.append({ name.characters(), name.length(), child_id, file_type });
|
entries.append({ name.characters(), name.length(), child_id, to_ext2_file_type(mode) });
|
||||||
bool success = fs().write_directory_inode(index(), move(entries));
|
bool success = fs().write_directory_inode(index(), move(entries));
|
||||||
if (success)
|
if (success)
|
||||||
m_lookup_cache.set(name, child_id.index());
|
m_lookup_cache.set(name, child_id.index());
|
||||||
|
@ -1130,24 +1149,8 @@ RetainPtr<Inode> Ext2FS::create_inode(InodeIdentifier parent_id, const String& n
|
||||||
return { };
|
return { };
|
||||||
}
|
}
|
||||||
|
|
||||||
byte file_type = 0;
|
|
||||||
if (is_regular_file(mode))
|
|
||||||
file_type = EXT2_FT_REG_FILE;
|
|
||||||
else if (is_directory(mode))
|
|
||||||
file_type = EXT2_FT_DIR;
|
|
||||||
else if (is_character_device(mode))
|
|
||||||
file_type = EXT2_FT_CHRDEV;
|
|
||||||
else if (is_block_device(mode))
|
|
||||||
file_type = EXT2_FT_BLKDEV;
|
|
||||||
else if (is_fifo(mode))
|
|
||||||
file_type = EXT2_FT_FIFO;
|
|
||||||
else if (is_socket(mode))
|
|
||||||
file_type = EXT2_FT_SOCK;
|
|
||||||
else if (is_symlink(mode))
|
|
||||||
file_type = EXT2_FT_SYMLINK;
|
|
||||||
|
|
||||||
// Try adding it to the directory first, in case the name is already in use.
|
// Try adding it to the directory first, in case the name is already in use.
|
||||||
auto result = parent_inode->add_child({ fsid(), inode_id }, name, file_type);
|
auto result = parent_inode->add_child({ fsid(), inode_id }, name, to_ext2_file_type(mode));
|
||||||
if (result.is_error()) {
|
if (result.is_error()) {
|
||||||
error = result;
|
error = result;
|
||||||
return { };
|
return { };
|
||||||
|
|
|
@ -32,7 +32,7 @@ private:
|
||||||
virtual String reverse_lookup(InodeIdentifier) override;
|
virtual String reverse_lookup(InodeIdentifier) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual ssize_t write_bytes(off_t, ssize_t, const byte* data, FileDescriptor*) override;
|
virtual ssize_t write_bytes(off_t, ssize_t, const byte* data, FileDescriptor*) override;
|
||||||
virtual KResult add_child(InodeIdentifier child_id, const String& name, byte file_type) override;
|
virtual KResult add_child(InodeIdentifier child_id, const String& name, mode_t) override;
|
||||||
virtual KResult remove_child(const String& name) override;
|
virtual KResult remove_child(const String& name) override;
|
||||||
virtual RetainPtr<Inode> parent() const override;
|
virtual RetainPtr<Inode> parent() const override;
|
||||||
virtual int set_atime(time_t) override;
|
virtual int set_atime(time_t) override;
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
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 ssize_t write_bytes(off_t, ssize_t, const byte* data, FileDescriptor*) = 0;
|
virtual ssize_t write_bytes(off_t, ssize_t, const byte* data, FileDescriptor*) = 0;
|
||||||
virtual KResult add_child(InodeIdentifier child_id, const String& name, byte file_type) = 0;
|
virtual KResult add_child(InodeIdentifier child_id, const String& name, mode_t) = 0;
|
||||||
virtual KResult remove_child(const String& name) = 0;
|
virtual KResult remove_child(const String& name) = 0;
|
||||||
virtual RetainPtr<Inode> parent() const = 0;
|
virtual RetainPtr<Inode> parent() const = 0;
|
||||||
virtual size_t directory_entry_count() const = 0;
|
virtual size_t directory_entry_count() const = 0;
|
||||||
|
|
|
@ -1079,11 +1079,10 @@ ssize_t ProcFSInode::write_bytes(off_t offset, ssize_t size, const byte* buffer,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult ProcFSInode::add_child(InodeIdentifier child_id, const String& name, byte file_type)
|
KResult ProcFSInode::add_child(InodeIdentifier child_id, const String& name, mode_t)
|
||||||
{
|
{
|
||||||
(void)child_id;
|
(void)child_id;
|
||||||
(void)name;
|
(void)name;
|
||||||
(void)file_type;
|
|
||||||
return KResult(-EPERM);
|
return KResult(-EPERM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ private:
|
||||||
virtual String reverse_lookup(InodeIdentifier) override;
|
virtual String reverse_lookup(InodeIdentifier) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual ssize_t write_bytes(off_t, ssize_t, const byte* buffer, FileDescriptor*) override;
|
virtual ssize_t write_bytes(off_t, ssize_t, const byte* buffer, FileDescriptor*) override;
|
||||||
virtual KResult add_child(InodeIdentifier child_id, const String& name, byte file_type) override;
|
virtual KResult add_child(InodeIdentifier child_id, const String& name, mode_t) override;
|
||||||
virtual KResult remove_child(const String& name) override;
|
virtual KResult remove_child(const String& name) override;
|
||||||
virtual RetainPtr<Inode> parent() const override;
|
virtual RetainPtr<Inode> parent() const override;
|
||||||
virtual size_t directory_entry_count() const override;
|
virtual size_t directory_entry_count() const override;
|
||||||
|
|
|
@ -279,11 +279,10 @@ ssize_t SynthFSInode::write_bytes(off_t offset, ssize_t size, const byte* buffer
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult SynthFSInode::add_child(InodeIdentifier child_id, const String& name, byte file_type)
|
KResult SynthFSInode::add_child(InodeIdentifier child_id, const String& name, mode_t)
|
||||||
{
|
{
|
||||||
(void)child_id;
|
(void)child_id;
|
||||||
(void)name;
|
(void)name;
|
||||||
(void)file_type;
|
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ private:
|
||||||
virtual String reverse_lookup(InodeIdentifier) override;
|
virtual String reverse_lookup(InodeIdentifier) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual ssize_t write_bytes(off_t, ssize_t, const byte* buffer, FileDescriptor*) override;
|
virtual ssize_t write_bytes(off_t, ssize_t, const byte* buffer, FileDescriptor*) override;
|
||||||
virtual KResult add_child(InodeIdentifier child_id, const String& name, byte file_type) override;
|
virtual KResult add_child(InodeIdentifier child_id, const String& name, mode_t) override;
|
||||||
virtual KResult remove_child(const String& name) override;
|
virtual KResult remove_child(const String& name) override;
|
||||||
virtual RetainPtr<Inode> parent() const override;
|
virtual RetainPtr<Inode> parent() const override;
|
||||||
virtual size_t directory_entry_count() const override;
|
virtual size_t directory_entry_count() const override;
|
||||||
|
|
|
@ -390,7 +390,7 @@ KResult VFS::rename(StringView old_path, StringView new_path, Custody& base)
|
||||||
new_custody.did_delete({});
|
new_custody.did_delete({});
|
||||||
}
|
}
|
||||||
|
|
||||||
auto result = new_parent_inode.add_child(old_inode.identifier(), new_basename, 0 /* FIXME: file type? */);
|
auto result = new_parent_inode.add_child(old_inode.identifier(), new_basename, old_inode.mode());
|
||||||
if (result.is_error())
|
if (result.is_error())
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
@ -461,7 +461,7 @@ KResult VFS::link(StringView old_path, StringView new_path, Custody& base)
|
||||||
if (!parent_inode.metadata().may_write(current->process()))
|
if (!parent_inode.metadata().may_write(current->process()))
|
||||||
return KResult(-EACCES);
|
return KResult(-EACCES);
|
||||||
|
|
||||||
return parent_inode.add_child(old_inode.identifier(), FileSystemPath(new_path).basename(), 0);
|
return parent_inode.add_child(old_inode.identifier(), FileSystemPath(new_path).basename(), old_inode.mode());
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult VFS::unlink(StringView path, Custody& base)
|
KResult VFS::unlink(StringView path, Custody& base)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue