xfs: replace xfs_mode_to_ftype table with switch statement
The size of the xfs_mode_to_ftype[] conversion table was too small to handle an invalid value of mode=S_IFMT. Instead of fixing the table size, replace the conversion table with a conversion helper that uses a switch statement. Suggested-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
b597dd5373
commit
1fc4d33fed
@ -36,21 +36,29 @@
|
||||
struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2, XFS_DIR3_FT_DIR };
|
||||
|
||||
/*
|
||||
* @mode, if set, indicates that the type field needs to be set up.
|
||||
* This uses the transformation from file mode to DT_* as defined in linux/fs.h
|
||||
* for file type specification. This will be propagated into the directory
|
||||
* structure if appropriate for the given operation and filesystem config.
|
||||
* Convert inode mode to directory entry filetype
|
||||
*/
|
||||
const unsigned char xfs_mode_to_ftype[S_IFMT >> S_SHIFT] = {
|
||||
[0] = XFS_DIR3_FT_UNKNOWN,
|
||||
[S_IFREG >> S_SHIFT] = XFS_DIR3_FT_REG_FILE,
|
||||
[S_IFDIR >> S_SHIFT] = XFS_DIR3_FT_DIR,
|
||||
[S_IFCHR >> S_SHIFT] = XFS_DIR3_FT_CHRDEV,
|
||||
[S_IFBLK >> S_SHIFT] = XFS_DIR3_FT_BLKDEV,
|
||||
[S_IFIFO >> S_SHIFT] = XFS_DIR3_FT_FIFO,
|
||||
[S_IFSOCK >> S_SHIFT] = XFS_DIR3_FT_SOCK,
|
||||
[S_IFLNK >> S_SHIFT] = XFS_DIR3_FT_SYMLINK,
|
||||
};
|
||||
const unsigned char xfs_mode_to_ftype(int mode)
|
||||
{
|
||||
switch (mode & S_IFMT) {
|
||||
case S_IFREG:
|
||||
return XFS_DIR3_FT_REG_FILE;
|
||||
case S_IFDIR:
|
||||
return XFS_DIR3_FT_DIR;
|
||||
case S_IFCHR:
|
||||
return XFS_DIR3_FT_CHRDEV;
|
||||
case S_IFBLK:
|
||||
return XFS_DIR3_FT_BLKDEV;
|
||||
case S_IFIFO:
|
||||
return XFS_DIR3_FT_FIFO;
|
||||
case S_IFSOCK:
|
||||
return XFS_DIR3_FT_SOCK;
|
||||
case S_IFLNK:
|
||||
return XFS_DIR3_FT_SYMLINK;
|
||||
default:
|
||||
return XFS_DIR3_FT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ASCII case-insensitive (ie. A-Z) support for directories that was
|
||||
|
@ -35,10 +35,9 @@ struct xfs_dir2_data_unused;
|
||||
extern struct xfs_name xfs_name_dotdot;
|
||||
|
||||
/*
|
||||
* directory filetype conversion tables.
|
||||
* Convert inode mode to directory entry filetype
|
||||
*/
|
||||
#define S_SHIFT 12
|
||||
extern const unsigned char xfs_mode_to_ftype[];
|
||||
extern const unsigned char xfs_mode_to_ftype(int mode);
|
||||
|
||||
/*
|
||||
* directory operations vector for encode/decode routines
|
||||
|
@ -103,7 +103,7 @@ xfs_dentry_to_name(
|
||||
{
|
||||
namep->name = dentry->d_name.name;
|
||||
namep->len = dentry->d_name.len;
|
||||
namep->type = xfs_mode_to_ftype[(mode & S_IFMT) >> S_SHIFT];
|
||||
namep->type = xfs_mode_to_ftype(mode);
|
||||
}
|
||||
|
||||
STATIC void
|
||||
|
Loading…
Reference in New Issue
Block a user