1fb7df12dSIngo Molnar /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 267ef2879SArnaldo Carvalho de Melo #ifndef _UAPI_LINUX_STAT_H 367ef2879SArnaldo Carvalho de Melo #define _UAPI_LINUX_STAT_H 467ef2879SArnaldo Carvalho de Melo 567ef2879SArnaldo Carvalho de Melo #include <linux/types.h> 667ef2879SArnaldo Carvalho de Melo 767ef2879SArnaldo Carvalho de Melo #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) 867ef2879SArnaldo Carvalho de Melo 967ef2879SArnaldo Carvalho de Melo #define S_IFMT 00170000 1067ef2879SArnaldo Carvalho de Melo #define S_IFSOCK 0140000 1167ef2879SArnaldo Carvalho de Melo #define S_IFLNK 0120000 1267ef2879SArnaldo Carvalho de Melo #define S_IFREG 0100000 1367ef2879SArnaldo Carvalho de Melo #define S_IFBLK 0060000 1467ef2879SArnaldo Carvalho de Melo #define S_IFDIR 0040000 1567ef2879SArnaldo Carvalho de Melo #define S_IFCHR 0020000 1667ef2879SArnaldo Carvalho de Melo #define S_IFIFO 0010000 1767ef2879SArnaldo Carvalho de Melo #define S_ISUID 0004000 1867ef2879SArnaldo Carvalho de Melo #define S_ISGID 0002000 1967ef2879SArnaldo Carvalho de Melo #define S_ISVTX 0001000 2067ef2879SArnaldo Carvalho de Melo 2167ef2879SArnaldo Carvalho de Melo #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) 2267ef2879SArnaldo Carvalho de Melo #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 2367ef2879SArnaldo Carvalho de Melo #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 2467ef2879SArnaldo Carvalho de Melo #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) 2567ef2879SArnaldo Carvalho de Melo #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) 2667ef2879SArnaldo Carvalho de Melo #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) 2767ef2879SArnaldo Carvalho de Melo #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) 2867ef2879SArnaldo Carvalho de Melo 2967ef2879SArnaldo Carvalho de Melo #define S_IRWXU 00700 3067ef2879SArnaldo Carvalho de Melo #define S_IRUSR 00400 3167ef2879SArnaldo Carvalho de Melo #define S_IWUSR 00200 3267ef2879SArnaldo Carvalho de Melo #define S_IXUSR 00100 3367ef2879SArnaldo Carvalho de Melo 3467ef2879SArnaldo Carvalho de Melo #define S_IRWXG 00070 3567ef2879SArnaldo Carvalho de Melo #define S_IRGRP 00040 3667ef2879SArnaldo Carvalho de Melo #define S_IWGRP 00020 3767ef2879SArnaldo Carvalho de Melo #define S_IXGRP 00010 3867ef2879SArnaldo Carvalho de Melo 3967ef2879SArnaldo Carvalho de Melo #define S_IRWXO 00007 4067ef2879SArnaldo Carvalho de Melo #define S_IROTH 00004 4167ef2879SArnaldo Carvalho de Melo #define S_IWOTH 00002 4267ef2879SArnaldo Carvalho de Melo #define S_IXOTH 00001 4367ef2879SArnaldo Carvalho de Melo 4467ef2879SArnaldo Carvalho de Melo #endif 4567ef2879SArnaldo Carvalho de Melo 4667ef2879SArnaldo Carvalho de Melo /* 4767ef2879SArnaldo Carvalho de Melo * Timestamp structure for the timestamps in struct statx. 4867ef2879SArnaldo Carvalho de Melo * 4967ef2879SArnaldo Carvalho de Melo * tv_sec holds the number of seconds before (negative) or after (positive) 5067ef2879SArnaldo Carvalho de Melo * 00:00:00 1st January 1970 UTC. 5167ef2879SArnaldo Carvalho de Melo * 526e30437bSIngo Molnar * tv_nsec holds a number of nanoseconds (0..999,999,999) after the tv_sec time. 5367ef2879SArnaldo Carvalho de Melo * 5467ef2879SArnaldo Carvalho de Melo * __reserved is held in case we need a yet finer resolution. 5567ef2879SArnaldo Carvalho de Melo */ 5667ef2879SArnaldo Carvalho de Melo struct statx_timestamp { 5767ef2879SArnaldo Carvalho de Melo __s64 tv_sec; 586e30437bSIngo Molnar __u32 tv_nsec; 5967ef2879SArnaldo Carvalho de Melo __s32 __reserved; 6067ef2879SArnaldo Carvalho de Melo }; 6167ef2879SArnaldo Carvalho de Melo 6267ef2879SArnaldo Carvalho de Melo /* 6367ef2879SArnaldo Carvalho de Melo * Structures for the extended file attribute retrieval system call 6467ef2879SArnaldo Carvalho de Melo * (statx()). 6567ef2879SArnaldo Carvalho de Melo * 6667ef2879SArnaldo Carvalho de Melo * The caller passes a mask of what they're specifically interested in as a 6767ef2879SArnaldo Carvalho de Melo * parameter to statx(). What statx() actually got will be indicated in 6867ef2879SArnaldo Carvalho de Melo * st_mask upon return. 6967ef2879SArnaldo Carvalho de Melo * 7067ef2879SArnaldo Carvalho de Melo * For each bit in the mask argument: 7167ef2879SArnaldo Carvalho de Melo * 7267ef2879SArnaldo Carvalho de Melo * - if the datum is not supported: 7367ef2879SArnaldo Carvalho de Melo * 7467ef2879SArnaldo Carvalho de Melo * - the bit will be cleared, and 7567ef2879SArnaldo Carvalho de Melo * 7667ef2879SArnaldo Carvalho de Melo * - the datum will be set to an appropriate fabricated value if one is 7767ef2879SArnaldo Carvalho de Melo * available (eg. CIFS can take a default uid and gid), otherwise 7867ef2879SArnaldo Carvalho de Melo * 7967ef2879SArnaldo Carvalho de Melo * - the field will be cleared; 8067ef2879SArnaldo Carvalho de Melo * 8167ef2879SArnaldo Carvalho de Melo * - otherwise, if explicitly requested: 8267ef2879SArnaldo Carvalho de Melo * 8367ef2879SArnaldo Carvalho de Melo * - the datum will be synchronised to the server if AT_STATX_FORCE_SYNC is 8467ef2879SArnaldo Carvalho de Melo * set or if the datum is considered out of date, and 8567ef2879SArnaldo Carvalho de Melo * 8667ef2879SArnaldo Carvalho de Melo * - the field will be filled in and the bit will be set; 8767ef2879SArnaldo Carvalho de Melo * 8867ef2879SArnaldo Carvalho de Melo * - otherwise, if not requested, but available in approximate form without any 8967ef2879SArnaldo Carvalho de Melo * effort, it will be filled in anyway, and the bit will be set upon return 9067ef2879SArnaldo Carvalho de Melo * (it might not be up to date, however, and no attempt will be made to 9167ef2879SArnaldo Carvalho de Melo * synchronise the internal state first); 9267ef2879SArnaldo Carvalho de Melo * 9367ef2879SArnaldo Carvalho de Melo * - otherwise the field and the bit will be cleared before returning. 9467ef2879SArnaldo Carvalho de Melo * 9567ef2879SArnaldo Carvalho de Melo * Items in STATX_BASIC_STATS may be marked unavailable on return, but they 9667ef2879SArnaldo Carvalho de Melo * will have values installed for compatibility purposes so that stat() and 9767ef2879SArnaldo Carvalho de Melo * co. can be emulated in userspace. 9867ef2879SArnaldo Carvalho de Melo */ 9967ef2879SArnaldo Carvalho de Melo struct statx { 10067ef2879SArnaldo Carvalho de Melo /* 0x00 */ 101*af74e5feSNamhyung Kim /* What results were written [uncond] */ 102*af74e5feSNamhyung Kim __u32 stx_mask; 103*af74e5feSNamhyung Kim 104*af74e5feSNamhyung Kim /* Preferred general I/O size [uncond] */ 105*af74e5feSNamhyung Kim __u32 stx_blksize; 106*af74e5feSNamhyung Kim 107*af74e5feSNamhyung Kim /* Flags conveying information about the file [uncond] */ 108*af74e5feSNamhyung Kim __u64 stx_attributes; 109*af74e5feSNamhyung Kim 11067ef2879SArnaldo Carvalho de Melo /* 0x10 */ 111*af74e5feSNamhyung Kim /* Number of hard links */ 112*af74e5feSNamhyung Kim __u32 stx_nlink; 113*af74e5feSNamhyung Kim 114*af74e5feSNamhyung Kim /* User ID of owner */ 115*af74e5feSNamhyung Kim __u32 stx_uid; 116*af74e5feSNamhyung Kim 117*af74e5feSNamhyung Kim /* Group ID of owner */ 118*af74e5feSNamhyung Kim __u32 stx_gid; 119*af74e5feSNamhyung Kim 120*af74e5feSNamhyung Kim /* File mode */ 121*af74e5feSNamhyung Kim __u16 stx_mode; 12267ef2879SArnaldo Carvalho de Melo __u16 __spare0[1]; 123*af74e5feSNamhyung Kim 12467ef2879SArnaldo Carvalho de Melo /* 0x20 */ 125*af74e5feSNamhyung Kim /* Inode number */ 126*af74e5feSNamhyung Kim __u64 stx_ino; 127*af74e5feSNamhyung Kim 128*af74e5feSNamhyung Kim /* File size */ 129*af74e5feSNamhyung Kim __u64 stx_size; 130*af74e5feSNamhyung Kim 131*af74e5feSNamhyung Kim /* Number of 512-byte blocks allocated */ 132*af74e5feSNamhyung Kim __u64 stx_blocks; 133*af74e5feSNamhyung Kim 134*af74e5feSNamhyung Kim /* Mask to show what's supported in stx_attributes */ 135*af74e5feSNamhyung Kim __u64 stx_attributes_mask; 136*af74e5feSNamhyung Kim 13767ef2879SArnaldo Carvalho de Melo /* 0x40 */ 138*af74e5feSNamhyung Kim /* Last access time */ 139*af74e5feSNamhyung Kim struct statx_timestamp stx_atime; 140*af74e5feSNamhyung Kim 141*af74e5feSNamhyung Kim /* File creation time */ 142*af74e5feSNamhyung Kim struct statx_timestamp stx_btime; 143*af74e5feSNamhyung Kim 144*af74e5feSNamhyung Kim /* Last attribute change time */ 145*af74e5feSNamhyung Kim struct statx_timestamp stx_ctime; 146*af74e5feSNamhyung Kim 147*af74e5feSNamhyung Kim /* Last data modification time */ 148*af74e5feSNamhyung Kim struct statx_timestamp stx_mtime; 149*af74e5feSNamhyung Kim 15067ef2879SArnaldo Carvalho de Melo /* 0x80 */ 151*af74e5feSNamhyung Kim /* Device ID of special file [if bdev/cdev] */ 152*af74e5feSNamhyung Kim __u32 stx_rdev_major; 15367ef2879SArnaldo Carvalho de Melo __u32 stx_rdev_minor; 154*af74e5feSNamhyung Kim 155*af74e5feSNamhyung Kim /* ID of device containing file [uncond] */ 156*af74e5feSNamhyung Kim __u32 stx_dev_major; 15767ef2879SArnaldo Carvalho de Melo __u32 stx_dev_minor; 158*af74e5feSNamhyung Kim 15967ef2879SArnaldo Carvalho de Melo /* 0x90 */ 16093dc627fSArnaldo Carvalho de Melo __u64 stx_mnt_id; 161*af74e5feSNamhyung Kim 162*af74e5feSNamhyung Kim /* Memory buffer alignment for direct I/O */ 163*af74e5feSNamhyung Kim __u32 stx_dio_mem_align; 164*af74e5feSNamhyung Kim 165*af74e5feSNamhyung Kim /* File offset alignment for direct I/O */ 166*af74e5feSNamhyung Kim __u32 stx_dio_offset_align; 167*af74e5feSNamhyung Kim 16893dc627fSArnaldo Carvalho de Melo /* 0xa0 */ 169*af74e5feSNamhyung Kim /* Subvolume identifier */ 170*af74e5feSNamhyung Kim __u64 stx_subvol; 171*af74e5feSNamhyung Kim 172*af74e5feSNamhyung Kim /* Min atomic write unit in bytes */ 173*af74e5feSNamhyung Kim __u32 stx_atomic_write_unit_min; 174*af74e5feSNamhyung Kim 175*af74e5feSNamhyung Kim /* Max atomic write unit in bytes */ 176*af74e5feSNamhyung Kim __u32 stx_atomic_write_unit_max; 177*af74e5feSNamhyung Kim 178845295f4SNamhyung Kim /* 0xb0 */ 179*af74e5feSNamhyung Kim /* Max atomic write segment count */ 180*af74e5feSNamhyung Kim __u32 stx_atomic_write_segments_max; 181*af74e5feSNamhyung Kim 182*af74e5feSNamhyung Kim /* File offset alignment for direct I/O reads */ 183*af74e5feSNamhyung Kim __u32 stx_dio_read_offset_align; 184*af74e5feSNamhyung Kim 185845295f4SNamhyung Kim /* 0xb8 */ 186845295f4SNamhyung Kim __u64 __spare3[9]; /* Spare space for future expansion */ 187*af74e5feSNamhyung Kim 18867ef2879SArnaldo Carvalho de Melo /* 0x100 */ 18967ef2879SArnaldo Carvalho de Melo }; 19067ef2879SArnaldo Carvalho de Melo 19167ef2879SArnaldo Carvalho de Melo /* 19267ef2879SArnaldo Carvalho de Melo * Flags to be stx_mask 19367ef2879SArnaldo Carvalho de Melo * 19467ef2879SArnaldo Carvalho de Melo * Query request/result mask for statx() and struct statx::stx_mask. 19567ef2879SArnaldo Carvalho de Melo * 19667ef2879SArnaldo Carvalho de Melo * These bits should be set in the mask argument of statx() to request 19767ef2879SArnaldo Carvalho de Melo * particular items when calling statx(). 19867ef2879SArnaldo Carvalho de Melo */ 19967ef2879SArnaldo Carvalho de Melo #define STATX_TYPE 0x00000001U /* Want/got stx_mode & S_IFMT */ 20067ef2879SArnaldo Carvalho de Melo #define STATX_MODE 0x00000002U /* Want/got stx_mode & ~S_IFMT */ 20167ef2879SArnaldo Carvalho de Melo #define STATX_NLINK 0x00000004U /* Want/got stx_nlink */ 20267ef2879SArnaldo Carvalho de Melo #define STATX_UID 0x00000008U /* Want/got stx_uid */ 20367ef2879SArnaldo Carvalho de Melo #define STATX_GID 0x00000010U /* Want/got stx_gid */ 20467ef2879SArnaldo Carvalho de Melo #define STATX_ATIME 0x00000020U /* Want/got stx_atime */ 20567ef2879SArnaldo Carvalho de Melo #define STATX_MTIME 0x00000040U /* Want/got stx_mtime */ 20667ef2879SArnaldo Carvalho de Melo #define STATX_CTIME 0x00000080U /* Want/got stx_ctime */ 20767ef2879SArnaldo Carvalho de Melo #define STATX_INO 0x00000100U /* Want/got stx_ino */ 20867ef2879SArnaldo Carvalho de Melo #define STATX_SIZE 0x00000200U /* Want/got stx_size */ 20967ef2879SArnaldo Carvalho de Melo #define STATX_BLOCKS 0x00000400U /* Want/got stx_blocks */ 21067ef2879SArnaldo Carvalho de Melo #define STATX_BASIC_STATS 0x000007ffU /* The stuff in the normal stat struct */ 21167ef2879SArnaldo Carvalho de Melo #define STATX_BTIME 0x00000800U /* Want/got stx_btime */ 21293dc627fSArnaldo Carvalho de Melo #define STATX_MNT_ID 0x00001000U /* Got stx_mnt_id */ 21349c75d30SArnaldo Carvalho de Melo #define STATX_DIOALIGN 0x00002000U /* Want/got direct I/O alignment info */ 214690811f0SArnaldo Carvalho de Melo #define STATX_MNT_ID_UNIQUE 0x00004000U /* Want/got extended stx_mount_id */ 215d6283b16SArnaldo Carvalho de Melo #define STATX_SUBVOL 0x00008000U /* Want/got stx_subvol */ 216845295f4SNamhyung Kim #define STATX_WRITE_ATOMIC 0x00010000U /* Want/got atomic_write_* fields */ 217*af74e5feSNamhyung Kim #define STATX_DIO_READ_ALIGN 0x00020000U /* Want/got dio read alignment info */ 218581701b7SMiklos Szeredi 21904ec75e0SArnaldo Carvalho de Melo #define STATX__RESERVED 0x80000000U /* Reserved for future struct statx expansion */ 22067ef2879SArnaldo Carvalho de Melo 221581701b7SMiklos Szeredi #ifndef __KERNEL__ 222581701b7SMiklos Szeredi /* 223581701b7SMiklos Szeredi * This is deprecated, and shall remain the same value in the future. To avoid 224581701b7SMiklos Szeredi * confusion please use the equivalent (STATX_BASIC_STATS | STATX_BTIME) 225581701b7SMiklos Szeredi * instead. 226581701b7SMiklos Szeredi */ 227581701b7SMiklos Szeredi #define STATX_ALL 0x00000fffU 228581701b7SMiklos Szeredi #endif 229581701b7SMiklos Szeredi 23067ef2879SArnaldo Carvalho de Melo /* 23104ec75e0SArnaldo Carvalho de Melo * Attributes to be found in stx_attributes and masked in stx_attributes_mask. 23267ef2879SArnaldo Carvalho de Melo * 23367ef2879SArnaldo Carvalho de Melo * These give information about the features or the state of a file that might 23467ef2879SArnaldo Carvalho de Melo * be of use to ordinary userspace programs such as GUIs or ls rather than 23567ef2879SArnaldo Carvalho de Melo * specialised tools. 23667ef2879SArnaldo Carvalho de Melo * 2371c28a05dSArnaldo Carvalho de Melo * Note that the flags marked [I] correspond to the FS_IOC_SETFLAGS flags 23867ef2879SArnaldo Carvalho de Melo * semantically. Where possible, the numerical value is picked to correspond 2391c28a05dSArnaldo Carvalho de Melo * also. Note that the DAX attribute indicates that the file is in the CPU 2401c28a05dSArnaldo Carvalho de Melo * direct access state. It does not correspond to the per-inode flag that 2411c28a05dSArnaldo Carvalho de Melo * some filesystems support. 2421c28a05dSArnaldo Carvalho de Melo * 24367ef2879SArnaldo Carvalho de Melo */ 24467ef2879SArnaldo Carvalho de Melo #define STATX_ATTR_COMPRESSED 0x00000004 /* [I] File is compressed by the fs */ 24567ef2879SArnaldo Carvalho de Melo #define STATX_ATTR_IMMUTABLE 0x00000010 /* [I] File is marked immutable */ 24667ef2879SArnaldo Carvalho de Melo #define STATX_ATTR_APPEND 0x00000020 /* [I] File is append-only */ 24767ef2879SArnaldo Carvalho de Melo #define STATX_ATTR_NODUMP 0x00000040 /* [I] File is not to be dumped */ 24867ef2879SArnaldo Carvalho de Melo #define STATX_ATTR_ENCRYPTED 0x00000800 /* [I] File requires key to decrypt in fs */ 24967ef2879SArnaldo Carvalho de Melo #define STATX_ATTR_AUTOMOUNT 0x00001000 /* Dir: Automount trigger */ 25093dc627fSArnaldo Carvalho de Melo #define STATX_ATTR_MOUNT_ROOT 0x00002000 /* Root of a mount */ 251c66f2566SArnaldo Carvalho de Melo #define STATX_ATTR_VERITY 0x00100000 /* [I] Verity protected file */ 2521c28a05dSArnaldo Carvalho de Melo #define STATX_ATTR_DAX 0x00200000 /* File is currently in DAX state */ 253845295f4SNamhyung Kim #define STATX_ATTR_WRITE_ATOMIC 0x00400000 /* File supports atomic write operations */ 25467ef2879SArnaldo Carvalho de Melo 25567ef2879SArnaldo Carvalho de Melo 25667ef2879SArnaldo Carvalho de Melo #endif /* _UAPI_LINUX_STAT_H */ 257