1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __XFS_DINODE_H__
19#define __XFS_DINODE_H__
20
21#define XFS_DINODE_MAGIC 0x494e
22#define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3)
23
24typedef struct xfs_timestamp {
25 __be32 t_sec;
26 __be32 t_nsec;
27} xfs_timestamp_t;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46typedef struct xfs_dinode {
47 __be16 di_magic;
48 __be16 di_mode;
49 __u8 di_version;
50 __u8 di_format;
51 __be16 di_onlink;
52 __be32 di_uid;
53 __be32 di_gid;
54 __be32 di_nlink;
55 __be16 di_projid_lo;
56 __be16 di_projid_hi;
57 __u8 di_pad[6];
58 __be16 di_flushiter;
59 xfs_timestamp_t di_atime;
60 xfs_timestamp_t di_mtime;
61 xfs_timestamp_t di_ctime;
62 __be64 di_size;
63 __be64 di_nblocks;
64 __be32 di_extsize;
65 __be32 di_nextents;
66 __be16 di_anextents;
67 __u8 di_forkoff;
68 __s8 di_aformat;
69 __be32 di_dmevmask;
70 __be16 di_dmstate;
71 __be16 di_flags;
72 __be32 di_gen;
73
74
75 __be32 di_next_unlinked;
76
77
78 __le32 di_crc;
79 __be64 di_changecount;
80 __be64 di_lsn;
81 __be64 di_flags2;
82 __u8 di_pad2[16];
83
84
85 xfs_timestamp_t di_crtime;
86 __be64 di_ino;
87 uuid_t di_uuid;
88
89
90} xfs_dinode_t;
91
92#define DI_MAX_FLUSH 0xffff
93
94
95
96
97
98static inline uint xfs_dinode_size(int version)
99{
100 if (version == 3)
101 return sizeof(struct xfs_dinode);
102 return offsetof(struct xfs_dinode, di_crc);
103}
104
105
106
107
108
109
110#define XFS_MAXLINK ((1U << 31) - 1U)
111#define XFS_MAXLINK_1 65535U
112
113
114
115
116typedef enum xfs_dinode_fmt {
117 XFS_DINODE_FMT_DEV,
118 XFS_DINODE_FMT_LOCAL,
119 XFS_DINODE_FMT_EXTENTS,
120 XFS_DINODE_FMT_BTREE,
121 XFS_DINODE_FMT_UUID
122} xfs_dinode_fmt_t;
123
124
125
126
127#define XFS_DINODE_MIN_LOG 8
128#define XFS_DINODE_MAX_LOG 11
129#define XFS_DINODE_MIN_SIZE (1 << XFS_DINODE_MIN_LOG)
130#define XFS_DINODE_MAX_SIZE (1 << XFS_DINODE_MAX_LOG)
131
132
133
134
135#define XFS_LITINO(mp, version) \
136 ((int)(((mp)->m_sb.sb_inodesize) - xfs_dinode_size(version)))
137
138
139
140
141#define XFS_DFORK_Q(dip) ((dip)->di_forkoff != 0)
142#define XFS_DFORK_BOFF(dip) ((int)((dip)->di_forkoff << 3))
143
144#define XFS_DFORK_DSIZE(dip,mp) \
145 (XFS_DFORK_Q(dip) ? \
146 XFS_DFORK_BOFF(dip) : \
147 XFS_LITINO(mp, (dip)->di_version))
148#define XFS_DFORK_ASIZE(dip,mp) \
149 (XFS_DFORK_Q(dip) ? \
150 XFS_LITINO(mp, (dip)->di_version) - XFS_DFORK_BOFF(dip) : \
151 0)
152#define XFS_DFORK_SIZE(dip,mp,w) \
153 ((w) == XFS_DATA_FORK ? \
154 XFS_DFORK_DSIZE(dip, mp) : \
155 XFS_DFORK_ASIZE(dip, mp))
156
157
158
159
160#define XFS_DFORK_DPTR(dip) \
161 ((char *)dip + xfs_dinode_size(dip->di_version))
162#define XFS_DFORK_APTR(dip) \
163 (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip))
164#define XFS_DFORK_PTR(dip,w) \
165 ((w) == XFS_DATA_FORK ? XFS_DFORK_DPTR(dip) : XFS_DFORK_APTR(dip))
166
167#define XFS_DFORK_FORMAT(dip,w) \
168 ((w) == XFS_DATA_FORK ? \
169 (dip)->di_format : \
170 (dip)->di_aformat)
171#define XFS_DFORK_NEXTENTS(dip,w) \
172 ((w) == XFS_DATA_FORK ? \
173 be32_to_cpu((dip)->di_nextents) : \
174 be16_to_cpu((dip)->di_anextents))
175
176#define XFS_BUF_TO_DINODE(bp) ((xfs_dinode_t *)((bp)->b_addr))
177
178
179
180
181
182static inline xfs_dev_t xfs_dinode_get_rdev(struct xfs_dinode *dip)
183{
184 return be32_to_cpu(*(__be32 *)XFS_DFORK_DPTR(dip));
185}
186
187static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev)
188{
189 *(__be32 *)XFS_DFORK_DPTR(dip) = cpu_to_be32(rdev);
190}
191
192
193
194
195
196
197#define XFS_DIFLAG_REALTIME_BIT 0
198#define XFS_DIFLAG_PREALLOC_BIT 1
199#define XFS_DIFLAG_NEWRTBM_BIT 2
200#define XFS_DIFLAG_IMMUTABLE_BIT 3
201#define XFS_DIFLAG_APPEND_BIT 4
202#define XFS_DIFLAG_SYNC_BIT 5
203#define XFS_DIFLAG_NOATIME_BIT 6
204#define XFS_DIFLAG_NODUMP_BIT 7
205#define XFS_DIFLAG_RTINHERIT_BIT 8
206#define XFS_DIFLAG_PROJINHERIT_BIT 9
207#define XFS_DIFLAG_NOSYMLINKS_BIT 10
208#define XFS_DIFLAG_EXTSIZE_BIT 11
209#define XFS_DIFLAG_EXTSZINHERIT_BIT 12
210#define XFS_DIFLAG_NODEFRAG_BIT 13
211#define XFS_DIFLAG_FILESTREAM_BIT 14
212#define XFS_DIFLAG_REALTIME (1 << XFS_DIFLAG_REALTIME_BIT)
213#define XFS_DIFLAG_PREALLOC (1 << XFS_DIFLAG_PREALLOC_BIT)
214#define XFS_DIFLAG_NEWRTBM (1 << XFS_DIFLAG_NEWRTBM_BIT)
215#define XFS_DIFLAG_IMMUTABLE (1 << XFS_DIFLAG_IMMUTABLE_BIT)
216#define XFS_DIFLAG_APPEND (1 << XFS_DIFLAG_APPEND_BIT)
217#define XFS_DIFLAG_SYNC (1 << XFS_DIFLAG_SYNC_BIT)
218#define XFS_DIFLAG_NOATIME (1 << XFS_DIFLAG_NOATIME_BIT)
219#define XFS_DIFLAG_NODUMP (1 << XFS_DIFLAG_NODUMP_BIT)
220#define XFS_DIFLAG_RTINHERIT (1 << XFS_DIFLAG_RTINHERIT_BIT)
221#define XFS_DIFLAG_PROJINHERIT (1 << XFS_DIFLAG_PROJINHERIT_BIT)
222#define XFS_DIFLAG_NOSYMLINKS (1 << XFS_DIFLAG_NOSYMLINKS_BIT)
223#define XFS_DIFLAG_EXTSIZE (1 << XFS_DIFLAG_EXTSIZE_BIT)
224#define XFS_DIFLAG_EXTSZINHERIT (1 << XFS_DIFLAG_EXTSZINHERIT_BIT)
225#define XFS_DIFLAG_NODEFRAG (1 << XFS_DIFLAG_NODEFRAG_BIT)
226#define XFS_DIFLAG_FILESTREAM (1 << XFS_DIFLAG_FILESTREAM_BIT)
227
228#ifdef CONFIG_XFS_RT
229#define XFS_IS_REALTIME_INODE(ip) ((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME)
230#else
231#define XFS_IS_REALTIME_INODE(ip) (0)
232#endif
233
234#define XFS_DIFLAG_ANY \
235 (XFS_DIFLAG_REALTIME | XFS_DIFLAG_PREALLOC | XFS_DIFLAG_NEWRTBM | \
236 XFS_DIFLAG_IMMUTABLE | XFS_DIFLAG_APPEND | XFS_DIFLAG_SYNC | \
237 XFS_DIFLAG_NOATIME | XFS_DIFLAG_NODUMP | XFS_DIFLAG_RTINHERIT | \
238 XFS_DIFLAG_PROJINHERIT | XFS_DIFLAG_NOSYMLINKS | XFS_DIFLAG_EXTSIZE | \
239 XFS_DIFLAG_EXTSZINHERIT | XFS_DIFLAG_NODEFRAG | XFS_DIFLAG_FILESTREAM)
240
241#endif
242