root/fs/fs_dirent.c
// SPDX-License-Identifier: GPL-2.0
#include <linux/fs_dirent.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);