btrfs: use common file type conversion
Subsystems (2)
RFC PATCH v4 9/9 btrfs: use common file type conversion
Deduplicate the btrfs file type conversion implementation - 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
Acked-by David Sterba <[email protected]>
Signed-off-by Amir Goldstein <[email protected]>
Signed-off-by Phillip Potter <[email protected]>
--- fs/btrfs/btrfs_inode.h | 2 -- fs/btrfs/delayed-inode.c | 2 +- fs/btrfs/inode.c | 32 +++++++++++++++----------------- include/uapi/linux/btrfs_tree.h | 2 ++ 4 files changed, 18 insertions(+), 20 deletions(-)
fs/btrfs/btrfs_inode.h +0 -2
@@ -196,8 +196,6 @@ struct btrfs_inode {struct inode vfs_inode; }; -extern unsigned char btrfs_filetype_table[]; -static inline struct btrfs_inode *BTRFS_I (const struct inode *inode) { return container_of(inode, struct btrfs_inode, vfs_inode);
fs/btrfs/delayed-inode.c +1 -1
@@ -1692,7 +1692,7 @@ int btrfs_readdir_delayed_dir_index(struct dir_context *ctx, name = (char *)(di +1 ); name_len =btrfs_stack_dir_name_len (di); - d_type = btrfs_filetype_table[di->type]; + d_type =fs_ftype_to_dtype (di->type);btrfs_disk_key_to_cpu (&location, &di->location); over = !dir_emit(ctx, name, name_len,
fs/btrfs/inode.c +15 -17
@@ -72,17 +72,6 @@ struct kmem_cache *btrfs_trans_handle_cachep;struct kmem_cache *btrfs_path_cachep;struct kmem_cache *btrfs_free_space_cachep; -#define S_SHIFT 12 -static const unsigned char btrfs_type_by_mode[S_IFMT >>S_SHIFT ] = { - [S_IFREG >>S_SHIFT ] =BTRFS_FT_REG_FILE , - [S_IFDIR >>S_SHIFT ] =BTRFS_FT_DIR , - [S_IFCHR >>S_SHIFT ] =BTRFS_FT_CHRDEV , - [S_IFBLK >>S_SHIFT ] =BTRFS_FT_BLKDEV , - [S_IFIFO >>S_SHIFT ] =BTRFS_FT_FIFO , - [S_IFSOCK >>S_SHIFT ] =BTRFS_FT_SOCK , - [S_IFLNK >>S_SHIFT ] =BTRFS_FT_SYMLINK , -}; -static int btrfs_setsize (struct inode *inode,struct iattr *attr);static int btrfs_truncate (struct inode *inode,bool skip_writeback);static int btrfs_finish_ordered_io (struct btrfs_ordered_extent *ordered_extent);
@@ -5793,10 +5782,6 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,return d_splice_alias (inode, dentry); } -unsigned char btrfs_filetype_table[] = { -DT_UNKNOWN ,DT_REG ,DT_DIR ,DT_CHR ,DT_BLK ,DT_FIFO ,DT_SOCK ,DT_LNK -}; -/* * All this infrastructure exists because dir_emit can fault, and we are holding * the tree lock when doing readdir. For now just allocate a buffer and copy
@@ -5935,7 +5920,7 @@ static int btrfs_real_readdir(struct file *file, struct dir_context *ctx) name_ptr = (char *)(entry +1 );read_extent_buffer (leaf, name_ptr, (unsigned long )(di +1 ), name_len); -put_unaligned (btrfs_filetype_table[btrfs_dir_type (leaf, di)], +put_unaligned (fs_ftype_to_dtype (btrfs_dir_type (leaf, di)), &entry->type);btrfs_dir_item_key_to_cpu (leaf, di, &location);put_unaligned (location.objectid, &entry->ino);
@@ -6340,7 +6325,20 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,static inline u8 btrfs_inode_type (struct inode *inode) { -return btrfs_type_by_mode[(inode->i_mode &S_IFMT ) >>S_SHIFT ]; +/* +* compile-time asserts that generic FT_x types still match +* BTRFS_FT_x types +*/ +BUILD_BUG_ON (BTRFS_FT_UNKNOWN !=FT_UNKNOWN ); +BUILD_BUG_ON (BTRFS_FT_REG_FILE !=FT_REG_FILE ); +BUILD_BUG_ON (BTRFS_FT_DIR !=FT_DIR ); +BUILD_BUG_ON (BTRFS_FT_CHRDEV !=FT_CHRDEV ); +BUILD_BUG_ON (BTRFS_FT_BLKDEV !=FT_BLKDEV ); +BUILD_BUG_ON (BTRFS_FT_FIFO !=FT_FIFO ); +BUILD_BUG_ON (BTRFS_FT_SOCK !=FT_SOCK ); +BUILD_BUG_ON (BTRFS_FT_SYMLINK !=FT_SYMLINK ); + +return fs_umode_to_ftype (inode->i_mode); }/*
include/uapi/linux/btrfs_tree.h +2 -0
@@ -307,6 +307,8 @@* * Used by: * struct btrfs_dir_item.type +* +* Values 0..7 must match common file type values in fs_types.h. */ #define BTRFS_FT_UNKNOWN 0#define BTRFS_FT_REG_FILE 1
Signature · 1 line
2.19.1
Quoted 8 lines · Phillip Potter
Deduplicate the btrfs file type conversion implementation - 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.cAcked-by David Sterba <[email protected]>Signed-off-by Amir Goldstein <[email protected]>Signed-off-by Phillip Potter <[email protected]>
The patch looks good. You can add:
Reviewed-by Jan Kara <[email protected]>
Honza
Quoted 113 lines
--- fs/btrfs/btrfs_inode.h | 2 -- fs/btrfs/delayed-inode.c | 2 +- fs/btrfs/inode.c | 32 +++++++++++++++----------------- include/uapi/linux/btrfs_tree.h | 2 ++ 4 files changed, 18 insertions(+), 20 deletions(-)fs/btrfs/btrfs_inode.h +0
-2@@ -196,8 +196,6 @@ struct btrfs_inode {struct inode vfs_inode; }; -extern unsigned char btrfs_filetype_table[]; -static inline struct btrfs_inode *BTRFS_I (const struct inode *inode) { return container_of(inode, struct btrfs_inode, vfs_inode);fs/btrfs/delayed-inode.c +1
-1@@ -1692,7 +1692,7 @@ int btrfs_readdir_delayed_dir_index(struct dir_context *ctx, name = (char *)(di +1 ); name_len =btrfs_stack_dir_name_len (di); - d_type = btrfs_filetype_table[di->type]; + d_type =fs_ftype_to_dtype (di->type);btrfs_disk_key_to_cpu (&location, &di->location); over = !dir_emit(ctx, name, name_len,fs/btrfs/inode.c +15
-17@@ -72,17 +72,6 @@ struct kmem_cache *btrfs_trans_handle_cachep;struct kmem_cache *btrfs_path_cachep;struct kmem_cache *btrfs_free_space_cachep; -#define S_SHIFT 12 -static const unsigned char btrfs_type_by_mode[S_IFMT >>S_SHIFT ] = { - [S_IFREG >>S_SHIFT ] =BTRFS_FT_REG_FILE , - [S_IFDIR >>S_SHIFT ] =BTRFS_FT_DIR , - [S_IFCHR >>S_SHIFT ] =BTRFS_FT_CHRDEV , - [S_IFBLK >>S_SHIFT ] =BTRFS_FT_BLKDEV , - [S_IFIFO >>S_SHIFT ] =BTRFS_FT_FIFO , - [S_IFSOCK >>S_SHIFT ] =BTRFS_FT_SOCK , - [S_IFLNK >>S_SHIFT ] =BTRFS_FT_SYMLINK , -}; -static int btrfs_setsize (struct inode *inode,struct iattr *attr);static int btrfs_truncate (struct inode *inode,bool skip_writeback);static int btrfs_finish_ordered_io (struct btrfs_ordered_extent *ordered_extent);@@ -5793,10 +5782,6 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,return d_splice_alias (inode, dentry); } -unsigned char btrfs_filetype_table[] = { -DT_UNKNOWN ,DT_REG ,DT_DIR ,DT_CHR ,DT_BLK ,DT_FIFO ,DT_SOCK ,DT_LNK -}; -/* * All this infrastructure exists because dir_emit can fault, and we are holding * the tree lock when doing readdir. For now just allocate a buffer and copy @@ -5935,7 +5920,7 @@ static int btrfs_real_readdir(struct file *file, struct dir_context *ctx) name_ptr = (char *)(entry +1 );read_extent_buffer (leaf, name_ptr, (unsigned long )(di +1 ), name_len); -put_unaligned (btrfs_filetype_table[btrfs_dir_type (leaf, di)], +put_unaligned (fs_ftype_to_dtype (btrfs_dir_type (leaf, di)), &entry->type);btrfs_dir_item_key_to_cpu (leaf, di, &location);put_unaligned (location.objectid, &entry->ino);@@ -6340,7 +6325,20 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,static inline u8 btrfs_inode_type (struct inode *inode) { -return btrfs_type_by_mode[(inode->i_mode &S_IFMT ) >>S_SHIFT ]; +/* +* compile-time asserts that generic FT_x types still match +* BTRFS_FT_x types +*/ +BUILD_BUG_ON (BTRFS_FT_UNKNOWN !=FT_UNKNOWN ); +BUILD_BUG_ON (BTRFS_FT_REG_FILE !=FT_REG_FILE ); +BUILD_BUG_ON (BTRFS_FT_DIR !=FT_DIR ); +BUILD_BUG_ON (BTRFS_FT_CHRDEV !=FT_CHRDEV ); +BUILD_BUG_ON (BTRFS_FT_BLKDEV !=FT_BLKDEV ); +BUILD_BUG_ON (BTRFS_FT_FIFO !=FT_FIFO ); +BUILD_BUG_ON (BTRFS_FT_SOCK !=FT_SOCK ); +BUILD_BUG_ON (BTRFS_FT_SYMLINK !=FT_SYMLINK ); + +return fs_umode_to_ftype (inode->i_mode); }/* include/uapi/linux/btrfs_tree.h +2
-0@@ -307,6 +307,8 @@* * Used by: * struct btrfs_dir_item.type +* +* Values 0..7 must match common file type values in fs_types.h. */ #define BTRFS_FT_UNKNOWN 0#define BTRFS_FT_REG_FILE 1Signature · 1 line
2.19.1
Signature · 2 lines
Jan Kara <[email protected]> SUSE Labs, CR