@@ -41,15 +41,14 @@ struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2, XFS_DIR3_FT_DIR };
* for file type specification. This will be propagated into the directory
* structure if appropriate for the given operation and filesystem config.
*/
-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_dtype_to_ftype[DT_MAX] = {
+ [DT_REG] = XFS_DIR3_FT_REG_FILE,
+ [DT_DIR] = XFS_DIR3_FT_DIR,
+ [DT_CHR] = XFS_DIR3_FT_CHRDEV,
+ [DT_BLK] = XFS_DIR3_FT_BLKDEV,
+ [DT_FIFO] = XFS_DIR3_FT_FIFO,
+ [DT_SOCK] = XFS_DIR3_FT_SOCK,
+ [DT_LNK] = XFS_DIR3_FT_SYMLINK,
};
/*
@@ -34,8 +34,7 @@ extern struct xfs_name xfs_name_dotdot;
/*
* directory filetype conversion tables.
*/
-#define S_SHIFT 12
-extern const unsigned char xfs_mode_to_ftype[];
+extern const unsigned char xfs_dtype_to_ftype[];
/*
* 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_dtype_to_ftype[S_DT(mode)];
}
STATIC void
Use common mode to file type conversion macros. Fix the size of the mode_to_ftype conversion table, which was too small to handle the malformed value of mode=S_IFMT. Signed-off-by: Amir Goldstein <amir73il@gmail.com> --- fs/xfs/libxfs/xfs_dir2.c | 17 ++++++++--------- fs/xfs/libxfs/xfs_dir2.h | 3 +-- fs/xfs/xfs_iops.c | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) Ted and Dave, How's this for a less controversial cleanup? I would send the ext4 patch, but it looks exactly the same, so if you guys ACK this sample patch, I will re-post the entire series. There is still a question of whether or not to leave the common FT_* definitions and conversion helpers in file_type.h. I see no harm in that. Even if no current fs will want to use them (exofs maintainer already indicated otherwise), the next file system of the day may decide to use the common values rather then re-defining its own set of identical on-disk values. Amir. v3: - resort to simpler cleanup with macros DT_MAX and S_DT() - mention the minor bug fix in commit message v2: - add private conversion from common to on-disk values v1: - use common conversion functions to get on-disk values