|  | // SPDX-License-Identifier: GPL-2.0 | 
|  | #include <linux/fs.h> | 
|  | #include <linux/export.h> | 
|  |  | 
|  | /* | 
|  | * fs on-disk file type to dirent file type conversion | 
|  | */ | 
|  | static const unsigned char fs_dtype_by_ftype[FT_MAX] = { | 
|  | [FT_UNKNOWN]	= DT_UNKNOWN, | 
|  | [FT_REG_FILE]	= DT_REG, | 
|  | [FT_DIR]	= DT_DIR, | 
|  | [FT_CHRDEV]	= DT_CHR, | 
|  | [FT_BLKDEV]	= DT_BLK, | 
|  | [FT_FIFO]	= DT_FIFO, | 
|  | [FT_SOCK]	= DT_SOCK, | 
|  | [FT_SYMLINK]	= DT_LNK | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * fs_ftype_to_dtype() - fs on-disk file type to dirent type. | 
|  | * @filetype: The on-disk file type to convert. | 
|  | * | 
|  | * This function converts the on-disk file type value (FT_*) to the directory | 
|  | * entry type (DT_*). | 
|  | * | 
|  | * Context: Any context. | 
|  | * Return: | 
|  | * * DT_UNKNOWN		- Unknown type | 
|  | * * DT_FIFO		- FIFO | 
|  | * * DT_CHR		- Character device | 
|  | * * DT_DIR		- Directory | 
|  | * * DT_BLK		- Block device | 
|  | * * DT_REG		- Regular file | 
|  | * * DT_LNK		- Symbolic link | 
|  | * * DT_SOCK		- Local-domain socket | 
|  | */ | 
|  | unsigned char fs_ftype_to_dtype(unsigned int filetype) | 
|  | { | 
|  | if (filetype >= FT_MAX) | 
|  | return DT_UNKNOWN; | 
|  |  | 
|  | return fs_dtype_by_ftype[filetype]; | 
|  | } | 
|  | EXPORT_SYMBOL_GPL(fs_ftype_to_dtype); | 
|  |  | 
|  | /* | 
|  | * dirent file type to fs on-disk file type conversion | 
|  | * Values not initialized explicitly are FT_UNKNOWN (0). | 
|  | */ | 
|  | static const unsigned char fs_ftype_by_dtype[DT_MAX] = { | 
|  | [DT_REG]	= FT_REG_FILE, | 
|  | [DT_DIR]	= FT_DIR, | 
|  | [DT_LNK]	= FT_SYMLINK, | 
|  | [DT_CHR]	= FT_CHRDEV, | 
|  | [DT_BLK]	= FT_BLKDEV, | 
|  | [DT_FIFO]	= FT_FIFO, | 
|  | [DT_SOCK]	= FT_SOCK, | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * fs_umode_to_ftype() - file mode to on-disk file type. | 
|  | * @mode: The file mode to convert. | 
|  | * | 
|  | * This function converts the file mode value to the on-disk file type (FT_*). | 
|  | * | 
|  | * Context: Any context. | 
|  | * Return: | 
|  | * * FT_UNKNOWN		- Unknown type | 
|  | * * FT_REG_FILE	- Regular file | 
|  | * * FT_DIR		- Directory | 
|  | * * FT_CHRDEV		- Character device | 
|  | * * FT_BLKDEV		- Block device | 
|  | * * FT_FIFO		- FIFO | 
|  | * * FT_SOCK		- Local-domain socket | 
|  | * * FT_SYMLINK		- Symbolic link | 
|  | */ | 
|  | unsigned char fs_umode_to_ftype(umode_t mode) | 
|  | { | 
|  | return fs_ftype_by_dtype[S_DT(mode)]; | 
|  | } | 
|  | EXPORT_SYMBOL_GPL(fs_umode_to_ftype); | 
|  |  | 
|  | /** | 
|  | * fs_umode_to_dtype() - file mode to dirent file type. | 
|  | * @mode: The file mode to convert. | 
|  | * | 
|  | * This function converts the file mode value to the directory | 
|  | * entry type (DT_*). | 
|  | * | 
|  | * Context: Any context. | 
|  | * Return: | 
|  | * * DT_UNKNOWN		- Unknown type | 
|  | * * DT_FIFO		- FIFO | 
|  | * * DT_CHR		- Character device | 
|  | * * DT_DIR		- Directory | 
|  | * * DT_BLK		- Block device | 
|  | * * DT_REG		- Regular file | 
|  | * * DT_LNK		- Symbolic link | 
|  | * * DT_SOCK		- Local-domain socket | 
|  | */ | 
|  | unsigned char fs_umode_to_dtype(umode_t mode) | 
|  | { | 
|  | return fs_ftype_to_dtype(fs_umode_to_ftype(mode)); | 
|  | } | 
|  | EXPORT_SYMBOL_GPL(fs_umode_to_dtype); |