Phillip Potter | bbe7449e | 2019-01-21 00:54:27 +0000 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | #include <linux/fs.h> |
| 3 | #include <linux/export.h> |
| 4 | |
| 5 | /* |
| 6 | * fs on-disk file type to dirent file type conversion |
| 7 | */ |
| 8 | static const unsigned char fs_dtype_by_ftype[FT_MAX] = { |
| 9 | [FT_UNKNOWN] = DT_UNKNOWN, |
| 10 | [FT_REG_FILE] = DT_REG, |
| 11 | [FT_DIR] = DT_DIR, |
| 12 | [FT_CHRDEV] = DT_CHR, |
| 13 | [FT_BLKDEV] = DT_BLK, |
| 14 | [FT_FIFO] = DT_FIFO, |
| 15 | [FT_SOCK] = DT_SOCK, |
| 16 | [FT_SYMLINK] = DT_LNK |
| 17 | }; |
| 18 | |
| 19 | /** |
| 20 | * fs_ftype_to_dtype() - fs on-disk file type to dirent type. |
| 21 | * @filetype: The on-disk file type to convert. |
| 22 | * |
| 23 | * This function converts the on-disk file type value (FT_*) to the directory |
| 24 | * entry type (DT_*). |
| 25 | * |
| 26 | * Context: Any context. |
| 27 | * Return: |
| 28 | * * DT_UNKNOWN - Unknown type |
| 29 | * * DT_FIFO - FIFO |
| 30 | * * DT_CHR - Character device |
| 31 | * * DT_DIR - Directory |
| 32 | * * DT_BLK - Block device |
| 33 | * * DT_REG - Regular file |
| 34 | * * DT_LNK - Symbolic link |
| 35 | * * DT_SOCK - Local-domain socket |
| 36 | */ |
| 37 | unsigned char fs_ftype_to_dtype(unsigned int filetype) |
| 38 | { |
| 39 | if (filetype >= FT_MAX) |
| 40 | return DT_UNKNOWN; |
| 41 | |
| 42 | return fs_dtype_by_ftype[filetype]; |
| 43 | } |
| 44 | EXPORT_SYMBOL_GPL(fs_ftype_to_dtype); |
| 45 | |
| 46 | /* |
| 47 | * dirent file type to fs on-disk file type conversion |
| 48 | * Values not initialized explicitly are FT_UNKNOWN (0). |
| 49 | */ |
| 50 | static const unsigned char fs_ftype_by_dtype[DT_MAX] = { |
| 51 | [DT_REG] = FT_REG_FILE, |
| 52 | [DT_DIR] = FT_DIR, |
| 53 | [DT_LNK] = FT_SYMLINK, |
| 54 | [DT_CHR] = FT_CHRDEV, |
| 55 | [DT_BLK] = FT_BLKDEV, |
| 56 | [DT_FIFO] = FT_FIFO, |
| 57 | [DT_SOCK] = FT_SOCK, |
| 58 | }; |
| 59 | |
| 60 | /** |
| 61 | * fs_umode_to_ftype() - file mode to on-disk file type. |
| 62 | * @mode: The file mode to convert. |
| 63 | * |
| 64 | * This function converts the file mode value to the on-disk file type (FT_*). |
| 65 | * |
| 66 | * Context: Any context. |
| 67 | * Return: |
| 68 | * * FT_UNKNOWN - Unknown type |
| 69 | * * FT_REG_FILE - Regular file |
| 70 | * * FT_DIR - Directory |
| 71 | * * FT_CHRDEV - Character device |
| 72 | * * FT_BLKDEV - Block device |
| 73 | * * FT_FIFO - FIFO |
| 74 | * * FT_SOCK - Local-domain socket |
| 75 | * * FT_SYMLINK - Symbolic link |
| 76 | */ |
| 77 | unsigned char fs_umode_to_ftype(umode_t mode) |
| 78 | { |
| 79 | return fs_ftype_by_dtype[S_DT(mode)]; |
| 80 | } |
| 81 | EXPORT_SYMBOL_GPL(fs_umode_to_ftype); |
| 82 | |
| 83 | /** |
| 84 | * fs_umode_to_dtype() - file mode to dirent file type. |
| 85 | * @mode: The file mode to convert. |
| 86 | * |
| 87 | * This function converts the file mode value to the directory |
| 88 | * entry type (DT_*). |
| 89 | * |
| 90 | * Context: Any context. |
| 91 | * Return: |
| 92 | * * DT_UNKNOWN - Unknown type |
| 93 | * * DT_FIFO - FIFO |
| 94 | * * DT_CHR - Character device |
| 95 | * * DT_DIR - Directory |
| 96 | * * DT_BLK - Block device |
| 97 | * * DT_REG - Regular file |
| 98 | * * DT_LNK - Symbolic link |
| 99 | * * DT_SOCK - Local-domain socket |
| 100 | */ |
| 101 | unsigned char fs_umode_to_dtype(umode_t mode) |
| 102 | { |
| 103 | return fs_ftype_to_dtype(fs_umode_to_ftype(mode)); |
| 104 | } |
| 105 | EXPORT_SYMBOL_GPL(fs_umode_to_dtype); |