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 */
8static 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 */
37unsigned 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}
44EXPORT_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 */
50static 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 */
77unsigned char fs_umode_to_ftype(umode_t mode)
78{
79	return fs_ftype_by_dtype[S_DT(mode)];
80}
81EXPORT_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 */
101unsigned char fs_umode_to_dtype(umode_t mode)
102{
103	return fs_ftype_to_dtype(fs_umode_to_ftype(mode));
104}
105EXPORT_SYMBOL_GPL(fs_umode_to_dtype);
106