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); |
106 | |