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