linux-hardened/fs/fs_types.c
Phillip Potter bbe7449e25 fs: common implementation of file type
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>
2019-01-21 17:48:13 +01:00

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);