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