Skip to content

Commit

Permalink
ext2: use common file type conversion
Browse files Browse the repository at this point in the history
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

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Phillip Potter <phil@philpotter.co.uk>
Signed-off-by: Jan Kara <jack@suse.cz>
  • Loading branch information
Phillip Potter authored and Jan Kara committed Jan 21, 2019
1 parent bbe7449 commit e108921
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 45 deletions.
35 changes: 6 additions & 29 deletions fs/ext2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down Expand Up @@ -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),
Expand Down
16 changes: 0 additions & 16 deletions fs/ext2/ext2.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand Down

0 comments on commit e108921

Please sign in to comment.