nilfs2: use common file type conversion
Subsystems (2)
RFC PATCH v2 9/10 nilfs2: use common file type conversion
Deduplicate the nilfs2 file type conversion implementation.
Original patch by Amir Goldstein.
v2:
- Compile-time checks added by Phillip Potter to make sure the NILFS_FT_x enum values stay same as FT_x values
v1:
- Initial implementation
Signed-off-by Phillip Potter <[email protected]>
--- fs/nilfs2/dir.c | 54 +++++++++++------------------- include/uapi/linux/nilfs2_ondisk.h | 1 + 2 files changed, 20 insertions(+), 35 deletions(-)
fs/nilfs2/dir.c +19 -35
@@ -229,35 +229,25 @@ static struct nilfs_dir_entry *nilfs_next_entry(struct nilfs_dir_entry *p) nilfs_rec_len_from_disk(p->rec_len)); } -static unsigned char -nilfs_filetype_table[NILFS_FT_MAX ] = { - [NILFS_FT_UNKNOWN ] =DT_UNKNOWN , - [NILFS_FT_REG_FILE ] =DT_REG , - [NILFS_FT_DIR ] =DT_DIR , - [NILFS_FT_CHRDEV ] =DT_CHR , - [NILFS_FT_BLKDEV ] =DT_BLK , - [NILFS_FT_FIFO ] =DT_FIFO , - [NILFS_FT_SOCK ] =DT_SOCK , - [NILFS_FT_SYMLINK ] =DT_LNK , -}; - -#define S_SHIFT 12 -static unsigned char -nilfs_type_by_mode[S_IFMT >>S_SHIFT ] = { - [S_IFREG >>S_SHIFT ] =NILFS_FT_REG_FILE , - [S_IFDIR >>S_SHIFT ] =NILFS_FT_DIR , - [S_IFCHR >>S_SHIFT ] =NILFS_FT_CHRDEV , - [S_IFBLK >>S_SHIFT ] =NILFS_FT_BLKDEV , - [S_IFIFO >>S_SHIFT ] =NILFS_FT_FIFO , - [S_IFSOCK >>S_SHIFT ] =NILFS_FT_SOCK , - [S_IFLNK >>S_SHIFT ] =NILFS_FT_SYMLINK , -}; -static void nilfs_set_de_type (struct nilfs_dir_entry *de,struct inode *inode) { -umode_t mode = inode->i_mode; - - de->file_type = nilfs_type_by_mode[(mode &S_IFMT )>>S_SHIFT ]; +/* +* compile-time asserts that generic FT_x types +* still match NILFS_FT_x types - no need to list +* in other functions as well as build will +* fail either way +*/ +BUILD_BUG_ON (NILFS_FT_UNKNOWN !=FT_UNKNOWN ); +BUILD_BUG_ON (NILFS_FT_REG_FILE !=FT_REG_FILE ); +BUILD_BUG_ON (NILFS_FT_DIR !=FT_DIR ); +BUILD_BUG_ON (NILFS_FT_CHRDEV !=FT_CHRDEV ); +BUILD_BUG_ON (NILFS_FT_BLKDEV !=FT_BLKDEV ); +BUILD_BUG_ON (NILFS_FT_FIFO !=FT_FIFO ); +BUILD_BUG_ON (NILFS_FT_SOCK !=FT_SOCK ); +BUILD_BUG_ON (NILFS_FT_SYMLINK !=FT_SYMLINK ); +BUILD_BUG_ON (NILFS_FT_MAX !=FT_MAX ); + + de->file_type =fs_umode_to_ftype (inode->i_mode); }static int nilfs_readdir (struct file *file,struct dir_context *ctx)
@@ -293,15 +283,9 @@ static int nilfs_readdir(struct file *file, struct dir_context *ctx)return -EIO ; }if (de->inode) { -unsigned char t; - -if (de->file_type <NILFS_FT_MAX ) - t = nilfs_filetype_table[de->file_type]; -else - t =DT_UNKNOWN ; -if (!dir_emit (ctx, de->name, de->name_len, -le64_to_cpu (de->inode), t)) { +le64_to_cpu (de->inode), +fs_dtype (de->file_type))) {nilfs_put_page (page);return 0 ; }
include/uapi/linux/nilfs2_ondisk.h +1 -0
@@ -309,6 +309,7 @@ struct nilfs_dir_entry {/* * NILFS directory file types. Only the low 3 bits are used. The * other bits are reserved for now. +* Values should match common file type values in file_type.h. */ enum {NILFS_FT_UNKNOWN ,
Signature · 1 line
2.17.2