ext2: use common file type conversion
Subsystems (2)
RFC PATCH v5 4/9 ext2: use common file type conversion
Deduplicate the ext2 file type conversion implementation and remove EXT2_FT_* definitions - file systems that use the same file types as defined by POSIX do not need to define their own versions and can use the common helper functions decared in fs_types.h and implemented in fs_types.c
--- fs/ext2/dir.c | 35 ++++++----------------------------- fs/ext2/ext2.h | 16 ---------------- 2 files changed, 6 insertions(+), 45 deletions(-)
fs/ext2/dir.c +6 -29
@@ -252,33 +252,10 @@ ext2_validate_entry(char *base, unsigned offset, unsigned mask)return (char *)p - base; } -static unsigned char ext2_filetype_table[EXT2_FT_MAX ] = { - [EXT2_FT_UNKNOWN ] =DT_UNKNOWN , - [EXT2_FT_REG_FILE ] =DT_REG , - [EXT2_FT_DIR ] =DT_DIR , - [EXT2_FT_CHRDEV ] =DT_CHR , - [EXT2_FT_BLKDEV ] =DT_BLK , - [EXT2_FT_FIFO ] =DT_FIFO , - [EXT2_FT_SOCK ] =DT_SOCK , - [EXT2_FT_SYMLINK ] =DT_LNK , -}; - -#define S_SHIFT 12 -static unsigned char ext2_type_by_mode[S_IFMT >>S_SHIFT ] = { - [S_IFREG >>S_SHIFT ] =EXT2_FT_REG_FILE , - [S_IFDIR >>S_SHIFT ] =EXT2_FT_DIR , - [S_IFCHR >>S_SHIFT ] =EXT2_FT_CHRDEV , - [S_IFBLK >>S_SHIFT ] =EXT2_FT_BLKDEV , - [S_IFIFO >>S_SHIFT ] =EXT2_FT_FIFO , - [S_IFSOCK >>S_SHIFT ] =EXT2_FT_SOCK , - [S_IFLNK >>S_SHIFT ] =EXT2_FT_SYMLINK , -}; -static inline void ext2_set_de_type (ext2_dirent *de,struct inode *inode) { -umode_t mode = inode->i_mode;if (EXT2_HAS_INCOMPAT_FEATURE (inode->i_sb,EXT2_FEATURE_INCOMPAT_FILETYPE )) - de->file_type = ext2_type_by_mode[(mode &S_IFMT )>>S_SHIFT ]; + de->file_type =fs_umode_to_ftype (inode->i_mode);else de->file_type =0 ; }
@@ -293,14 +270,14 @@ ext2_readdir(struct file *file, struct dir_context *ctx)unsigned long n = pos >>PAGE_SHIFT ;unsigned long npages =dir_pages (inode);unsigned chunk_mask = ~(ext2_chunk_size (inode)-1 ); -unsigned char *types =NULL ;bool need_revalidate = !inode_eq_iversion (inode, file->f_version); +bool has_filetype;if (pos > inode->i_size -EXT2_DIR_REC_LEN (1 ))return 0 ; -if (EXT2_HAS_INCOMPAT_FEATURE (sb,EXT2_FEATURE_INCOMPAT_FILETYPE )) - types = ext2_filetype_table; + has_filetype = +EXT2_HAS_INCOMPAT_FEATURE (sb,EXT2_FEATURE_INCOMPAT_FILETYPE );for ( ; n < npages; n++, offset =0 ) {char *kaddr, *limit;
@@ -335,8 +312,8 @@ ext2_readdir(struct file *file, struct dir_context *ctx) if (de->inode) { unsigned char d_type = DT_UNKNOWN; - if (types && de->file_type < EXT2_FT_MAX) - d_type = types[de->file_type]; + if (has_filetype) + d_type = fs_ftype_to_dtype(de->file_type); if (!dir_emit(ctx, de->name, de->name_len, le32_to_cpu(de->inode),
fs/ext2/ext2.h +0 -16
@@ -603,22 +603,6 @@ struct ext2_dir_entry_2 {char name[];/* File name, up to EXT2_NAME_LEN */ }; -/* -* Ext2 directory file types. Only the low 3 bits are used. The -* other bits are reserved for now. -*/ -enum { -EXT2_FT_UNKNOWN =0 , -EXT2_FT_REG_FILE =1 , -EXT2_FT_DIR =2 , -EXT2_FT_CHRDEV =3 , -EXT2_FT_BLKDEV =4 , -EXT2_FT_FIFO =5 , -EXT2_FT_SOCK =6 , -EXT2_FT_SYMLINK =7 , -EXT2_FT_MAX -}; -/* * EXT2_DIR_PAD defines the directory entries boundaries *
Signature · 1 line
2.20.1
Jan Kara
reviewerQuoted 8 lines · Phillip Potter
Deduplicate the ext2 file type conversion implementation and remove EXT2_FT_* definitions - file systems that use the same file types as defined by POSIX do not need to define their own versions and can use the common helper functions decared in
fs_types.hand implemented infs_types.cSigned-off-by Amir Goldstein <[email protected]>Signed-off-by Phillip Potter <[email protected]>
This patch and the generic one look good to me. I'll wait couple more days whether someone won't object to the general idea and then push these two patches to my tree.
Honza
Quoted 103 lines
--- fs/ext2/dir.c | 35 ++++++----------------------------- fs/ext2/ext2.h | 16 ---------------- 2 files changed, 6 insertions(+), 45 deletions(-)fs/ext2/dir.c +6
-29@@ -252,33 +252,10 @@ ext2_validate_entry(char *base, unsigned offset, unsigned mask)return (char *)p - base; } -static unsigned char ext2_filetype_table[EXT2_FT_MAX ] = { - [EXT2_FT_UNKNOWN ] =DT_UNKNOWN , - [EXT2_FT_REG_FILE ] =DT_REG , - [EXT2_FT_DIR ] =DT_DIR , - [EXT2_FT_CHRDEV ] =DT_CHR , - [EXT2_FT_BLKDEV ] =DT_BLK , - [EXT2_FT_FIFO ] =DT_FIFO , - [EXT2_FT_SOCK ] =DT_SOCK , - [EXT2_FT_SYMLINK ] =DT_LNK , -}; - -#define S_SHIFT 12 -static unsigned char ext2_type_by_mode[S_IFMT >>S_SHIFT ] = { - [S_IFREG >>S_SHIFT ] =EXT2_FT_REG_FILE , - [S_IFDIR >>S_SHIFT ] =EXT2_FT_DIR , - [S_IFCHR >>S_SHIFT ] =EXT2_FT_CHRDEV , - [S_IFBLK >>S_SHIFT ] =EXT2_FT_BLKDEV , - [S_IFIFO >>S_SHIFT ] =EXT2_FT_FIFO , - [S_IFSOCK >>S_SHIFT ] =EXT2_FT_SOCK , - [S_IFLNK >>S_SHIFT ] =EXT2_FT_SYMLINK , -}; -static inline void ext2_set_de_type (ext2_dirent *de,struct inode *inode) { -umode_t mode = inode->i_mode;if (EXT2_HAS_INCOMPAT_FEATURE (inode->i_sb,EXT2_FEATURE_INCOMPAT_FILETYPE )) - de->file_type = ext2_type_by_mode[(mode &S_IFMT )>>S_SHIFT ]; + de->file_type =fs_umode_to_ftype (inode->i_mode);else de->file_type =0 ; }@@ -293,14 +270,14 @@ ext2_readdir(struct file *file, struct dir_context *ctx)unsigned long n = pos >>PAGE_SHIFT ;unsigned long npages =dir_pages (inode);unsigned chunk_mask = ~(ext2_chunk_size (inode)-1 ); -unsigned char *types =NULL ;bool need_revalidate = !inode_eq_iversion (inode, file->f_version); +bool has_filetype;if (pos > inode->i_size -EXT2_DIR_REC_LEN (1 ))return 0 ; -if (EXT2_HAS_INCOMPAT_FEATURE (sb,EXT2_FEATURE_INCOMPAT_FILETYPE )) - types = ext2_filetype_table; + has_filetype = +EXT2_HAS_INCOMPAT_FEATURE (sb,EXT2_FEATURE_INCOMPAT_FILETYPE );for ( ; n < npages; n++, offset =0 ) {char *kaddr, *limit;@@ -335,8 +312,8 @@ ext2_readdir(struct file *file, struct dir_context *ctx) if (de->inode) { unsigned char d_type = DT_UNKNOWN; - if (types && de->file_type < EXT2_FT_MAX) - d_type = types[de->file_type]; + if (has_filetype) + d_type = fs_ftype_to_dtype(de->file_type); if (!dir_emit(ctx, de->name, de->name_len, le32_to_cpu(de->inode),fs/ext2/ext2.h +0
-16@@ -603,22 +603,6 @@ struct ext2_dir_entry_2 {char name[];/* File name, up to EXT2_NAME_LEN */ }; -/* -* Ext2 directory file types. Only the low 3 bits are used. The -* other bits are reserved for now. -*/ -enum { -EXT2_FT_UNKNOWN =0 , -EXT2_FT_REG_FILE =1 , -EXT2_FT_DIR =2 , -EXT2_FT_CHRDEV =3 , -EXT2_FT_BLKDEV =4 , -EXT2_FT_FIFO =5 , -EXT2_FT_SOCK =6 , -EXT2_FT_SYMLINK =7 , -EXT2_FT_MAX -}; -/* * EXT2_DIR_PAD defines the directory entries boundaries * Signature · 1 line
2.20.1
Signature · 2 lines
Jan Kara <[email protected]> SUSE Labs, CR