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