mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
![Phillip Potter](/assets/img/avatar_default.png)
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);
|