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