From b6c34c05219e2deadce18eedadce425878442254 Mon Sep 17 00:00:00 2001 From: Itamar Date: Fri, 28 Aug 2020 16:15:51 +0300 Subject: [PATCH] Ext2FS: Make reported file_type values match up with those in dirent This fixes an issue we had in the git port where git would not recognize untracked files (for example in 'git status'). When git used readdir, the 'd_type' field in the dirent struct contained bad values (Specifically, it contained the values defiend in Kernel/FileSystem/ext2_fs.h instead of the ones in LibC/dirent.h). After this fix, we can create a new git repository with 'git init', and then stage and commit files as usual. --- Kernel/FileSystem/Ext2FileSystem.cpp | 24 +++++++++++++++++++++++- Kernel/FileSystem/Ext2FileSystem.h | 2 ++ Kernel/UnixTypes.h | 22 ++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 9f547bb85b..e18e8049c7 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -855,6 +855,28 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, ssize_t count, const u8* data, Fi return nwritten; } +u8 Ext2FSInode::file_type_for_directory_entry(const ext2_dir_entry_2& entry) +{ + switch (entry.file_type) { + case EXT2_FT_REG_FILE: + return DT_REG; + case EXT2_FT_DIR: + return DT_DIR; + case EXT2_FT_CHRDEV: + return DT_CHR; + case EXT2_FT_BLKDEV: + return DT_BLK; + case EXT2_FT_FIFO: + return DT_FIFO; + case EXT2_FT_SOCK: + return EXT2_FT_SOCK; + case EXT2_FT_SYMLINK: + return DT_LNK; + default: + return DT_UNKNOWN; + } +} + KResult Ext2FSInode::traverse_as_directory(Function callback) const { LOCKER(m_lock); @@ -877,7 +899,7 @@ KResult Ext2FSInode::traverse_as_directory(Functioninode << ", name_len: " << entry->name_len << ", rec_len: " << entry->rec_len << ", file_type: " << entry->file_type << ", name: " << String(entry->name, entry->name_len); #endif - if (!callback({ { entry->name, entry->name_len }, { fsid(), entry->inode }, entry->file_type })) + if (!callback({ { entry->name, entry->name_len }, { fsid(), entry->inode }, file_type_for_directory_entry(*entry) })) break; } entry = (ext2_dir_entry_2*)((char*)entry + entry->rec_len); diff --git a/Kernel/FileSystem/Ext2FileSystem.h b/Kernel/FileSystem/Ext2FileSystem.h index 3de9029676..dee084813a 100644 --- a/Kernel/FileSystem/Ext2FileSystem.h +++ b/Kernel/FileSystem/Ext2FileSystem.h @@ -81,6 +81,8 @@ private: void populate_lookup_cache() const; KResult resize(u64); + static u8 file_type_for_directory_entry(const ext2_dir_entry_2&); + Ext2FS& fs(); const Ext2FS& fs() const; Ext2FSInode(Ext2FS&, unsigned index); diff --git a/Kernel/UnixTypes.h b/Kernel/UnixTypes.h index 9c2b568076..77467a1e53 100644 --- a/Kernel/UnixTypes.h +++ b/Kernel/UnixTypes.h @@ -614,3 +614,25 @@ struct rtentry { #define PT_PEEK 7 #define PT_POKE 8 #define PT_SETREGS 9 + +// Used in struct dirent +enum { + DT_UNKNOWN = 0, +#define DT_UNKNOWN DT_UNKNOWN + DT_FIFO = 1, +#define DT_FIFO DT_FIFO + DT_CHR = 2, +#define DT_CHR DT_CHR + DT_DIR = 4, +#define DT_DIR DT_DIR + DT_BLK = 6, +#define DT_BLK DT_BLK + DT_REG = 8, +#define DT_REG DT_REG + DT_LNK = 10, +#define DT_LNK DT_LNK + DT_SOCK = 12, +#define DT_SOCK DT_SOCK + DT_WHT = 14 +#define DT_WHT DT_WHT +};