1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 #ifndef _ASM_X86_STAT_H 3 #define _ASM_X86_STAT_H 4 5 #include <asm/posix_types.h> 6 7 #define STAT_HAVE_NSEC 1 8 9 #ifdef __i386__ 10 struct stat { 11 unsigned long st_dev; 12 unsigned long st_ino; 13 unsigned short st_mode; 14 unsigned short st_nlink; 15 unsigned short st_uid; 16 unsigned short st_gid; 17 unsigned long st_rdev; 18 unsigned long st_size; 19 unsigned long st_blksize; 20 unsigned long st_blocks; 21 unsigned long st_atime; 22 unsigned long st_atime_nsec; 23 unsigned long st_mtime; 24 unsigned long st_mtime_nsec; 25 unsigned long st_ctime; 26 unsigned long st_ctime_nsec; 27 unsigned long __unused4; 28 unsigned long __unused5; 29 }; 30 31 /* We don't need to memset the whole thing just to initialize the padding */ 32 #define INIT_STRUCT_STAT_PADDING(st) do { \ 33 st.__unused4 = 0; \ 34 st.__unused5 = 0; \ 35 } while (0) 36 37 #define STAT64_HAS_BROKEN_ST_INO 1 38 39 /* This matches struct stat64 in glibc2.1, hence the absolutely 40 * insane amounts of padding around dev_t's. 41 */ 42 struct stat64 { 43 unsigned long long st_dev; 44 unsigned char __pad0[4]; 45 46 unsigned long __st_ino; 47 48 unsigned int st_mode; 49 unsigned int st_nlink; 50 51 unsigned long st_uid; 52 unsigned long st_gid; 53 54 unsigned long long st_rdev; 55 unsigned char __pad3[4]; 56 57 long long st_size; 58 unsigned long st_blksize; 59 60 /* Number 512-byte blocks allocated. */ 61 unsigned long long st_blocks; 62 63 unsigned long st_atime; 64 unsigned long st_atime_nsec; 65 66 unsigned long st_mtime; 67 unsigned int st_mtime_nsec; 68 69 unsigned long st_ctime; 70 unsigned long st_ctime_nsec; 71 72 unsigned long long st_ino; 73 }; 74 75 /* We don't need to memset the whole thing just to initialize the padding */ 76 #define INIT_STRUCT_STAT64_PADDING(st) do { \ 77 memset(&st.__pad0, 0, sizeof(st.__pad0)); \ 78 memset(&st.__pad3, 0, sizeof(st.__pad3)); \ 79 } while (0) 80 81 #else /* __i386__ */ 82 83 struct stat { 84 __kernel_ulong_t st_dev; 85 __kernel_ulong_t st_ino; 86 __kernel_ulong_t st_nlink; 87 88 unsigned int st_mode; 89 unsigned int st_uid; 90 unsigned int st_gid; 91 unsigned int __pad0; 92 __kernel_ulong_t st_rdev; 93 __kernel_long_t st_size; 94 __kernel_long_t st_blksize; 95 __kernel_long_t st_blocks; /* Number 512-byte blocks allocated. */ 96 97 __kernel_ulong_t st_atime; 98 __kernel_ulong_t st_atime_nsec; 99 __kernel_ulong_t st_mtime; 100 __kernel_ulong_t st_mtime_nsec; 101 __kernel_ulong_t st_ctime; 102 __kernel_ulong_t st_ctime_nsec; 103 __kernel_long_t __unused[3]; 104 }; 105 106 /* We don't need to memset the whole thing just to initialize the padding */ 107 #define INIT_STRUCT_STAT_PADDING(st) do { \ 108 st.__pad0 = 0; \ 109 st.__unused[0] = 0; \ 110 st.__unused[1] = 0; \ 111 st.__unused[2] = 0; \ 112 } while (0) 113 114 #endif 115 116 /* for 32bit emulation and 32 bit kernels */ 117 struct __old_kernel_stat { 118 unsigned short st_dev; 119 unsigned short st_ino; 120 unsigned short st_mode; 121 unsigned short st_nlink; 122 unsigned short st_uid; 123 unsigned short st_gid; 124 unsigned short st_rdev; 125 #ifdef __i386__ 126 unsigned long st_size; 127 unsigned long st_atime; 128 unsigned long st_mtime; 129 unsigned long st_ctime; 130 #else 131 unsigned int st_size; 132 unsigned int st_atime; 133 unsigned int st_mtime; 134 unsigned int st_ctime; 135 #endif 136 }; 137 138 #endif /* _ASM_X86_STAT_H */ 139