mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 15:28:11 +00:00
FileSystem: Convert file types to DT_* types at a later stage
A change introduced in 5e01234 made it the resposibility of each filesystem to have the file types returned from 'traverse_as_directory' match up with the DT_* types. However, this caused corruption of the Ext2FS file format because the Ext2FS uses 'traverse_as_directory' internally when manipulating the file system. The result was a mixture between EXT2_FT_* and DT_* file types in the internal Ext2FS structures. Starting with this commit, the conversion from internal filesystem file types to the user facing DT_* types happens at a later stage, in the 'FileDescription::get_dir_entries' function which is directly used by sys$get_dir_entries.
This commit is contained in:
parent
e68b158a52
commit
33138900de
4 changed files with 11 additions and 6 deletions
|
@ -855,7 +855,7 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, ssize_t count, const u8* data, Fi
|
||||||
return nwritten;
|
return nwritten;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 Ext2FSInode::file_type_for_directory_entry(const ext2_dir_entry_2& entry)
|
u8 Ext2FS::internal_file_type_to_directory_entry_type(const DirectoryEntryView& entry) const
|
||||||
{
|
{
|
||||||
switch (entry.file_type) {
|
switch (entry.file_type) {
|
||||||
case EXT2_FT_REG_FILE:
|
case EXT2_FT_REG_FILE:
|
||||||
|
@ -869,7 +869,7 @@ u8 Ext2FSInode::file_type_for_directory_entry(const ext2_dir_entry_2& entry)
|
||||||
case EXT2_FT_FIFO:
|
case EXT2_FT_FIFO:
|
||||||
return DT_FIFO;
|
return DT_FIFO;
|
||||||
case EXT2_FT_SOCK:
|
case EXT2_FT_SOCK:
|
||||||
return EXT2_FT_SOCK;
|
return DT_SOCK;
|
||||||
case EXT2_FT_SYMLINK:
|
case EXT2_FT_SYMLINK:
|
||||||
return DT_LNK;
|
return DT_LNK;
|
||||||
default:
|
default:
|
||||||
|
@ -899,7 +899,7 @@ KResult Ext2FSInode::traverse_as_directory(Function<bool(const FS::DirectoryEntr
|
||||||
#ifdef EXT2_DEBUG
|
#ifdef EXT2_DEBUG
|
||||||
dbg() << "Ext2Inode::traverse_as_directory: " << entry->inode << ", name_len: " << entry->name_len << ", rec_len: " << entry->rec_len << ", file_type: " << entry->file_type << ", name: " << String(entry->name, entry->name_len);
|
dbg() << "Ext2Inode::traverse_as_directory: " << entry->inode << ", name_len: " << entry->name_len << ", rec_len: " << entry->rec_len << ", file_type: " << entry->file_type << ", name: " << String(entry->name, entry->name_len);
|
||||||
#endif
|
#endif
|
||||||
if (!callback({ { entry->name, entry->name_len }, { fsid(), entry->inode }, file_type_for_directory_entry(*entry) }))
|
if (!callback({ { entry->name, entry->name_len }, { fsid(), entry->inode }, entry->file_type }))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
entry = (ext2_dir_entry_2*)((char*)entry + entry->rec_len);
|
entry = (ext2_dir_entry_2*)((char*)entry + entry->rec_len);
|
||||||
|
|
|
@ -110,6 +110,8 @@ public:
|
||||||
|
|
||||||
virtual bool supports_watchers() const override { return true; }
|
virtual bool supports_watchers() const override { return true; }
|
||||||
|
|
||||||
|
virtual u8 internal_file_type_to_directory_entry_type(const DirectoryEntryView& entry) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef unsigned BlockIndex;
|
typedef unsigned BlockIndex;
|
||||||
typedef unsigned GroupIndex;
|
typedef unsigned GroupIndex;
|
||||||
|
|
|
@ -188,9 +188,9 @@ ssize_t FileDescription::get_dir_entries(u8* buffer, ssize_t size)
|
||||||
|
|
||||||
auto temp_buffer = ByteBuffer::create_uninitialized(size_to_allocate);
|
auto temp_buffer = ByteBuffer::create_uninitialized(size_to_allocate);
|
||||||
BufferStream stream(temp_buffer);
|
BufferStream stream(temp_buffer);
|
||||||
KResult result = VFS::the().traverse_directory_inode(*m_inode, [&stream](auto& entry) {
|
KResult result = VFS::the().traverse_directory_inode(*m_inode, [&stream, this](auto& entry) {
|
||||||
stream << (u32)entry.inode.index();
|
stream << (u32)entry.inode.index();
|
||||||
stream << (u8)entry.file_type;
|
stream << m_inode->fs().internal_file_type_to_directory_entry_type(entry);
|
||||||
stream << (u32)entry.name.length();
|
stream << (u32)entry.name.length();
|
||||||
stream << entry.name;
|
stream << entry.name;
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -77,12 +77,15 @@ public:
|
||||||
u8 file_type { 0 };
|
u8 file_type { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual void flush_writes() { }
|
virtual void flush_writes() {}
|
||||||
|
|
||||||
size_t block_size() const { return m_block_size; }
|
size_t block_size() const { return m_block_size; }
|
||||||
|
|
||||||
virtual bool is_file_backed() const { return false; }
|
virtual bool is_file_backed() const { return false; }
|
||||||
|
|
||||||
|
// Converts file types that are used internally by the filesystem to DT_* types
|
||||||
|
virtual u8 internal_file_type_to_directory_entry_type(const DirectoryEntryView& entry) const { return entry.file_type; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
FS();
|
FS();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue