linux/fs/fs_types.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <linux/fs.h>
   3#include <linux/export.h>
   4
   5/*
   6 * fs on-disk file type to dirent file type conversion
   7 */
   8static const unsigned char fs_dtype_by_ftype[FT_MAX] = {
   9        [FT_UNKNOWN]    = DT_UNKNOWN,
  10        [FT_REG_FILE]   = DT_REG,
  11        [FT_DIR]        = DT_DIR,
  12        [FT_CHRDEV]     = DT_CHR,
  13        [FT_BLKDEV]     = DT_BLK,
  14        [FT_FIFO]       = DT_FIFO,
  15        [FT_SOCK]       = DT_SOCK,
  16        [FT_SYMLINK]    = DT_LNK
  17};
  18
  19/**
  20 * fs_ftype_to_dtype() - fs on-disk file type to dirent type.
  21 * @filetype: The on-disk file type to convert.
  22 *
  23 * This function converts the on-disk file type value (FT_*) to the directory
  24 * entry type (DT_*).
  25 *
  26 * Context: Any context.
  27 * Return:
  28 * * DT_UNKNOWN         - Unknown type
  29 * * DT_FIFO            - FIFO
  30 * * DT_CHR             - Character device
  31 * * DT_DIR             - Directory
  32 * * DT_BLK             - Block device
  33 * * DT_REG             - Regular file
  34 * * DT_LNK             - Symbolic link
  35 * * DT_SOCK            - Local-domain socket
  36 */
  37unsigned char fs_ftype_to_dtype(unsigned int filetype)
  38{
  39        if (filetype >= FT_MAX)
  40                return DT_UNKNOWN;
  41
  42        return fs_dtype_by_ftype[filetype];
  43}
  44EXPORT_SYMBOL_GPL(fs_ftype_to_dtype);
  45
  46/*
  47 * dirent file type to fs on-disk file type conversion
  48 * Values not initialized explicitly are FT_UNKNOWN (0).
  49 */
  50static const unsigned char fs_ftype_by_dtype[DT_MAX] = {
  51        [DT_REG]        = FT_REG_FILE,
  52        [DT_DIR]        = FT_DIR,
  53        [DT_LNK]        = FT_SYMLINK,
  54        [DT_CHR]        = FT_CHRDEV,
  55        [DT_BLK]        = FT_BLKDEV,
  56        [DT_FIFO]       = FT_FIFO,
  57        [DT_SOCK]       = FT_SOCK,
  58};
  59
  60/**
  61 * fs_umode_to_ftype() - file mode to on-disk file type.
  62 * @mode: The file mode to convert.
  63 *
  64 * This function converts the file mode value to the on-disk file type (FT_*).
  65 *
  66 * Context: Any context.
  67 * Return:
  68 * * FT_UNKNOWN         - Unknown type
  69 * * FT_REG_FILE        - Regular file
  70 * * FT_DIR             - Directory
  71 * * FT_CHRDEV          - Character device
  72 * * FT_BLKDEV          - Block device
  73 * * FT_FIFO            - FIFO
  74 * * FT_SOCK            - Local-domain socket
  75 * * FT_SYMLINK         - Symbolic link
  76 */
  77unsigned char fs_umode_to_ftype(umode_t mode)
  78{
  79        return fs_ftype_by_dtype[S_DT(mode)];
  80}
  81EXPORT_SYMBOL_GPL(fs_umode_to_ftype);
  82
  83/**
  84 * fs_umode_to_dtype() - file mode to dirent file type.
  85 * @mode: The file mode to convert.
  86 *
  87 * This function converts the file mode value to the directory
  88 * entry type (DT_*).
  89 *
  90 * Context: Any context.
  91 * Return:
  92 * * DT_UNKNOWN         - Unknown type
  93 * * DT_FIFO            - FIFO
  94 * * DT_CHR             - Character device
  95 * * DT_DIR             - Directory
  96 * * DT_BLK             - Block device
  97 * * DT_REG             - Regular file
  98 * * DT_LNK             - Symbolic link
  99 * * DT_SOCK            - Local-domain socket
 100 */
 101unsigned char fs_umode_to_dtype(umode_t mode)
 102{
 103        return fs_ftype_to_dtype(fs_umode_to_ftype(mode));
 104}
 105EXPORT_SYMBOL_GPL(fs_umode_to_dtype);
 106