forked from mirrors/linux
		
	 bbe7449e25
			
		
	
	
		bbe7449e25
		
	
	
	
	
		
			
			Many file systems use a copy&paste implementation of dirent to on-disk file type conversions. Create a common implementation to be used by file systems with some useful conversion helpers to reduce open coded file type conversions in file system code. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Phillip Potter <phil@philpotter.co.uk> Signed-off-by: Jan Kara <jack@suse.cz>
		
			
				
	
	
		
			105 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // 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);
 |