1*bbe7449eSPhillip Potter /* SPDX-License-Identifier: GPL-2.0 */ 2*bbe7449eSPhillip Potter #ifndef _LINUX_FS_TYPES_H 3*bbe7449eSPhillip Potter #define _LINUX_FS_TYPES_H 4*bbe7449eSPhillip Potter 5*bbe7449eSPhillip Potter /* 6*bbe7449eSPhillip Potter * This is a header for the common implementation of dirent 7*bbe7449eSPhillip Potter * to fs on-disk file type conversion. Although the fs on-disk 8*bbe7449eSPhillip Potter * bits are specific to every file system, in practice, many 9*bbe7449eSPhillip Potter * file systems use the exact same on-disk format to describe 10*bbe7449eSPhillip Potter * the lower 3 file type bits that represent the 7 POSIX file 11*bbe7449eSPhillip Potter * types. 12*bbe7449eSPhillip Potter * 13*bbe7449eSPhillip Potter * It is important to note that the definitions in this 14*bbe7449eSPhillip Potter * header MUST NOT change. This would break both the 15*bbe7449eSPhillip Potter * userspace ABI and the on-disk format of filesystems 16*bbe7449eSPhillip Potter * using this code. 17*bbe7449eSPhillip Potter * 18*bbe7449eSPhillip Potter * All those file systems can use this generic code for the 19*bbe7449eSPhillip Potter * conversions. 20*bbe7449eSPhillip Potter */ 21*bbe7449eSPhillip Potter 22*bbe7449eSPhillip Potter /* 23*bbe7449eSPhillip Potter * struct dirent file types 24*bbe7449eSPhillip Potter * exposed to user via getdents(2), readdir(3) 25*bbe7449eSPhillip Potter * 26*bbe7449eSPhillip Potter * These match bits 12..15 of stat.st_mode 27*bbe7449eSPhillip Potter * (ie "(i_mode >> 12) & 15"). 28*bbe7449eSPhillip Potter */ 29*bbe7449eSPhillip Potter #define S_DT_SHIFT 12 30*bbe7449eSPhillip Potter #define S_DT(mode) (((mode) & S_IFMT) >> S_DT_SHIFT) 31*bbe7449eSPhillip Potter #define S_DT_MASK (S_IFMT >> S_DT_SHIFT) 32*bbe7449eSPhillip Potter 33*bbe7449eSPhillip Potter /* these are defined by POSIX and also present in glibc's dirent.h */ 34*bbe7449eSPhillip Potter #define DT_UNKNOWN 0 35*bbe7449eSPhillip Potter #define DT_FIFO 1 36*bbe7449eSPhillip Potter #define DT_CHR 2 37*bbe7449eSPhillip Potter #define DT_DIR 4 38*bbe7449eSPhillip Potter #define DT_BLK 6 39*bbe7449eSPhillip Potter #define DT_REG 8 40*bbe7449eSPhillip Potter #define DT_LNK 10 41*bbe7449eSPhillip Potter #define DT_SOCK 12 42*bbe7449eSPhillip Potter #define DT_WHT 14 43*bbe7449eSPhillip Potter 44*bbe7449eSPhillip Potter #define DT_MAX (S_DT_MASK + 1) /* 16 */ 45*bbe7449eSPhillip Potter 46*bbe7449eSPhillip Potter /* 47*bbe7449eSPhillip Potter * fs on-disk file types. 48*bbe7449eSPhillip Potter * Only the low 3 bits are used for the POSIX file types. 49*bbe7449eSPhillip Potter * Other bits are reserved for fs private use. 50*bbe7449eSPhillip Potter * These definitions are shared and used by multiple filesystems, 51*bbe7449eSPhillip Potter * and MUST NOT change under any circumstances. 52*bbe7449eSPhillip Potter * 53*bbe7449eSPhillip Potter * Note that no fs currently stores the whiteout type on-disk, 54*bbe7449eSPhillip Potter * so whiteout dirents are exposed to user as DT_CHR. 55*bbe7449eSPhillip Potter */ 56*bbe7449eSPhillip Potter #define FT_UNKNOWN 0 57*bbe7449eSPhillip Potter #define FT_REG_FILE 1 58*bbe7449eSPhillip Potter #define FT_DIR 2 59*bbe7449eSPhillip Potter #define FT_CHRDEV 3 60*bbe7449eSPhillip Potter #define FT_BLKDEV 4 61*bbe7449eSPhillip Potter #define FT_FIFO 5 62*bbe7449eSPhillip Potter #define FT_SOCK 6 63*bbe7449eSPhillip Potter #define FT_SYMLINK 7 64*bbe7449eSPhillip Potter 65*bbe7449eSPhillip Potter #define FT_MAX 8 66*bbe7449eSPhillip Potter 67*bbe7449eSPhillip Potter /* 68*bbe7449eSPhillip Potter * declarations for helper functions, accompanying implementation 69*bbe7449eSPhillip Potter * is in fs/fs_types.c 70*bbe7449eSPhillip Potter */ 71*bbe7449eSPhillip Potter extern unsigned char fs_ftype_to_dtype(unsigned int filetype); 72*bbe7449eSPhillip Potter extern unsigned char fs_umode_to_ftype(umode_t mode); 73*bbe7449eSPhillip Potter extern unsigned char fs_umode_to_dtype(umode_t mode); 74*bbe7449eSPhillip Potter 75*bbe7449eSPhillip Potter #endif 76