|
@@ -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
|