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__
10struct 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 */
42struct 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
83struct 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 */
117struct __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