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