1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __XFS_SB_H__
19#define __XFS_SB_H__
20
21
22
23
24
25
26
27struct xfs_buf;
28struct xfs_mount;
29
30#define XFS_SB_MAGIC 0x58465342
31#define XFS_SB_VERSION_1 1
32#define XFS_SB_VERSION_2 2
33#define XFS_SB_VERSION_3 3
34#define XFS_SB_VERSION_4 4
35#define XFS_SB_VERSION_NUMBITS 0x000f
36#define XFS_SB_VERSION_ALLFBITS 0xfff0
37#define XFS_SB_VERSION_SASHFBITS 0xf000
38#define XFS_SB_VERSION_REALFBITS 0x0ff0
39#define XFS_SB_VERSION_ATTRBIT 0x0010
40#define XFS_SB_VERSION_NLINKBIT 0x0020
41#define XFS_SB_VERSION_QUOTABIT 0x0040
42#define XFS_SB_VERSION_ALIGNBIT 0x0080
43#define XFS_SB_VERSION_DALIGNBIT 0x0100
44#define XFS_SB_VERSION_SHAREDBIT 0x0200
45#define XFS_SB_VERSION_LOGV2BIT 0x0400
46#define XFS_SB_VERSION_SECTORBIT 0x0800
47#define XFS_SB_VERSION_EXTFLGBIT 0x1000
48#define XFS_SB_VERSION_DIRV2BIT 0x2000
49#define XFS_SB_VERSION_BORGBIT 0x4000
50#define XFS_SB_VERSION_MOREBITSBIT 0x8000
51#define XFS_SB_VERSION_OKSASHFBITS \
52 (XFS_SB_VERSION_EXTFLGBIT | \
53 XFS_SB_VERSION_DIRV2BIT | \
54 XFS_SB_VERSION_BORGBIT)
55#define XFS_SB_VERSION_OKREALFBITS \
56 (XFS_SB_VERSION_ATTRBIT | \
57 XFS_SB_VERSION_NLINKBIT | \
58 XFS_SB_VERSION_QUOTABIT | \
59 XFS_SB_VERSION_ALIGNBIT | \
60 XFS_SB_VERSION_DALIGNBIT | \
61 XFS_SB_VERSION_SHAREDBIT | \
62 XFS_SB_VERSION_LOGV2BIT | \
63 XFS_SB_VERSION_SECTORBIT | \
64 XFS_SB_VERSION_MOREBITSBIT)
65#define XFS_SB_VERSION_OKREALBITS \
66 (XFS_SB_VERSION_NUMBITS | \
67 XFS_SB_VERSION_OKREALFBITS | \
68 XFS_SB_VERSION_OKSASHFBITS)
69
70
71
72
73
74
75
76
77#define XFS_SB_VERSION2_REALFBITS 0x00ffffff
78#define XFS_SB_VERSION2_RESERVED1BIT 0x00000001
79#define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002
80#define XFS_SB_VERSION2_RESERVED4BIT 0x00000004
81#define XFS_SB_VERSION2_ATTR2BIT 0x00000008
82
83#define XFS_SB_VERSION2_OKREALFBITS \
84 (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \
85 XFS_SB_VERSION2_ATTR2BIT)
86#define XFS_SB_VERSION2_OKSASHFBITS \
87 (0)
88#define XFS_SB_VERSION2_OKREALBITS \
89 (XFS_SB_VERSION2_OKREALFBITS | \
90 XFS_SB_VERSION2_OKSASHFBITS )
91
92
93
94
95
96typedef struct xfs_sb {
97 __uint32_t sb_magicnum;
98 __uint32_t sb_blocksize;
99 xfs_drfsbno_t sb_dblocks;
100 xfs_drfsbno_t sb_rblocks;
101 xfs_drtbno_t sb_rextents;
102 uuid_t sb_uuid;
103 xfs_dfsbno_t sb_logstart;
104 xfs_ino_t sb_rootino;
105 xfs_ino_t sb_rbmino;
106 xfs_ino_t sb_rsumino;
107 xfs_agblock_t sb_rextsize;
108 xfs_agblock_t sb_agblocks;
109 xfs_agnumber_t sb_agcount;
110 xfs_extlen_t sb_rbmblocks;
111 xfs_extlen_t sb_logblocks;
112 __uint16_t sb_versionnum;
113 __uint16_t sb_sectsize;
114 __uint16_t sb_inodesize;
115 __uint16_t sb_inopblock;
116 char sb_fname[12];
117 __uint8_t sb_blocklog;
118 __uint8_t sb_sectlog;
119 __uint8_t sb_inodelog;
120 __uint8_t sb_inopblog;
121 __uint8_t sb_agblklog;
122 __uint8_t sb_rextslog;
123 __uint8_t sb_inprogress;
124 __uint8_t sb_imax_pct;
125
126
127
128
129
130
131 __uint64_t sb_icount;
132 __uint64_t sb_ifree;
133 __uint64_t sb_fdblocks;
134 __uint64_t sb_frextents;
135
136
137
138 xfs_ino_t sb_uquotino;
139 xfs_ino_t sb_gquotino;
140 __uint16_t sb_qflags;
141 __uint8_t sb_flags;
142 __uint8_t sb_shared_vn;
143 xfs_extlen_t sb_inoalignmt;
144 __uint32_t sb_unit;
145 __uint32_t sb_width;
146 __uint8_t sb_dirblklog;
147 __uint8_t sb_logsectlog;
148 __uint16_t sb_logsectsize;
149 __uint32_t sb_logsunit;
150 __uint32_t sb_features2;
151
152
153
154
155
156
157
158 __uint32_t sb_bad_features2;
159
160
161} xfs_sb_t;
162
163
164
165
166
167typedef struct xfs_dsb {
168 __be32 sb_magicnum;
169 __be32 sb_blocksize;
170 __be64 sb_dblocks;
171 __be64 sb_rblocks;
172 __be64 sb_rextents;
173 uuid_t sb_uuid;
174 __be64 sb_logstart;
175 __be64 sb_rootino;
176 __be64 sb_rbmino;
177 __be64 sb_rsumino;
178 __be32 sb_rextsize;
179 __be32 sb_agblocks;
180 __be32 sb_agcount;
181 __be32 sb_rbmblocks;
182 __be32 sb_logblocks;
183 __be16 sb_versionnum;
184 __be16 sb_sectsize;
185 __be16 sb_inodesize;
186 __be16 sb_inopblock;
187 char sb_fname[12];
188 __u8 sb_blocklog;
189 __u8 sb_sectlog;
190 __u8 sb_inodelog;
191 __u8 sb_inopblog;
192 __u8 sb_agblklog;
193 __u8 sb_rextslog;
194 __u8 sb_inprogress;
195 __u8 sb_imax_pct;
196
197
198
199
200
201
202 __be64 sb_icount;
203 __be64 sb_ifree;
204 __be64 sb_fdblocks;
205 __be64 sb_frextents;
206
207
208
209 __be64 sb_uquotino;
210 __be64 sb_gquotino;
211 __be16 sb_qflags;
212 __u8 sb_flags;
213 __u8 sb_shared_vn;
214 __be32 sb_inoalignmt;
215 __be32 sb_unit;
216 __be32 sb_width;
217 __u8 sb_dirblklog;
218 __u8 sb_logsectlog;
219 __be16 sb_logsectsize;
220 __be32 sb_logsunit;
221 __be32 sb_features2;
222
223
224
225
226
227
228 __be32 sb_bad_features2;
229
230
231} xfs_dsb_t;
232
233
234
235
236typedef enum {
237 XFS_SBS_MAGICNUM, XFS_SBS_BLOCKSIZE, XFS_SBS_DBLOCKS, XFS_SBS_RBLOCKS,
238 XFS_SBS_REXTENTS, XFS_SBS_UUID, XFS_SBS_LOGSTART, XFS_SBS_ROOTINO,
239 XFS_SBS_RBMINO, XFS_SBS_RSUMINO, XFS_SBS_REXTSIZE, XFS_SBS_AGBLOCKS,
240 XFS_SBS_AGCOUNT, XFS_SBS_RBMBLOCKS, XFS_SBS_LOGBLOCKS,
241 XFS_SBS_VERSIONNUM, XFS_SBS_SECTSIZE, XFS_SBS_INODESIZE,
242 XFS_SBS_INOPBLOCK, XFS_SBS_FNAME, XFS_SBS_BLOCKLOG,
243 XFS_SBS_SECTLOG, XFS_SBS_INODELOG, XFS_SBS_INOPBLOG, XFS_SBS_AGBLKLOG,
244 XFS_SBS_REXTSLOG, XFS_SBS_INPROGRESS, XFS_SBS_IMAX_PCT, XFS_SBS_ICOUNT,
245 XFS_SBS_IFREE, XFS_SBS_FDBLOCKS, XFS_SBS_FREXTENTS, XFS_SBS_UQUOTINO,
246 XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN,
247 XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG,
248 XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT,
249 XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2,
250 XFS_SBS_FIELDCOUNT
251} xfs_sb_field_t;
252
253
254
255
256
257#define XFS_SB_MVAL(x) (1LL << XFS_SBS_ ## x)
258#define XFS_SB_UUID XFS_SB_MVAL(UUID)
259#define XFS_SB_FNAME XFS_SB_MVAL(FNAME)
260#define XFS_SB_ROOTINO XFS_SB_MVAL(ROOTINO)
261#define XFS_SB_RBMINO XFS_SB_MVAL(RBMINO)
262#define XFS_SB_RSUMINO XFS_SB_MVAL(RSUMINO)
263#define XFS_SB_VERSIONNUM XFS_SB_MVAL(VERSIONNUM)
264#define XFS_SB_UQUOTINO XFS_SB_MVAL(UQUOTINO)
265#define XFS_SB_GQUOTINO XFS_SB_MVAL(GQUOTINO)
266#define XFS_SB_QFLAGS XFS_SB_MVAL(QFLAGS)
267#define XFS_SB_SHARED_VN XFS_SB_MVAL(SHARED_VN)
268#define XFS_SB_UNIT XFS_SB_MVAL(UNIT)
269#define XFS_SB_WIDTH XFS_SB_MVAL(WIDTH)
270#define XFS_SB_ICOUNT XFS_SB_MVAL(ICOUNT)
271#define XFS_SB_IFREE XFS_SB_MVAL(IFREE)
272#define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS)
273#define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2)
274#define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2)
275#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT)
276#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1)
277#define XFS_SB_MOD_BITS \
278 (XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \
279 XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \
280 XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \
281 XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \
282 XFS_SB_BAD_FEATURES2)
283
284
285
286
287
288
289#define XFS_SBF_NOFLAGS 0x00
290#define XFS_SBF_READONLY 0x01
291
292
293
294
295#define XFS_SB_MAX_SHARED_VN 0
296
297#define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS)
298
299#ifdef __KERNEL__
300static inline int xfs_sb_good_version(xfs_sb_t *sbp)
301{
302 return (((sbp->sb_versionnum >= XFS_SB_VERSION_1) && \
303 (sbp->sb_versionnum <= XFS_SB_VERSION_3)) || \
304 ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
305 !((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || \
306 ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && \
307 (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) && \
308 (sbp->sb_shared_vn <= XFS_SB_MAX_SHARED_VN)));
309}
310#else
311static inline int xfs_sb_good_version(xfs_sb_t *sbp)
312{
313 return (((sbp->sb_versionnum >= XFS_SB_VERSION_1) && \
314 (sbp->sb_versionnum <= XFS_SB_VERSION_3)) || \
315 ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
316 !((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || \
317 ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && \
318 (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) && \
319 (!(sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) || \
320 (sbp->sb_shared_vn <= XFS_SB_MAX_SHARED_VN))));
321}
322#endif
323
324
325
326
327
328static inline int xfs_sb_has_mismatched_features2(xfs_sb_t *sbp)
329{
330 return (sbp->sb_bad_features2 != sbp->sb_features2);
331}
332
333static inline unsigned xfs_sb_version_tonew(unsigned v)
334{
335 return ((((v) == XFS_SB_VERSION_1) ? \
336 0 : \
337 (((v) == XFS_SB_VERSION_2) ? \
338 XFS_SB_VERSION_ATTRBIT : \
339 (XFS_SB_VERSION_ATTRBIT | XFS_SB_VERSION_NLINKBIT))) | \
340 XFS_SB_VERSION_4);
341}
342
343static inline unsigned xfs_sb_version_toold(unsigned v)
344{
345 return (((v) & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) ? \
346 0 : \
347 (((v) & XFS_SB_VERSION_NLINKBIT) ? \
348 XFS_SB_VERSION_3 : \
349 (((v) & XFS_SB_VERSION_ATTRBIT) ? \
350 XFS_SB_VERSION_2 : \
351 XFS_SB_VERSION_1)));
352}
353
354static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp)
355{
356 return ((sbp)->sb_versionnum == XFS_SB_VERSION_2) || \
357 ((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \
358 ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
359 ((sbp)->sb_versionnum & XFS_SB_VERSION_ATTRBIT));
360}
361
362static inline void xfs_sb_version_addattr(xfs_sb_t *sbp)
363{
364 (sbp)->sb_versionnum = (((sbp)->sb_versionnum == XFS_SB_VERSION_1) ? \
365 XFS_SB_VERSION_2 : \
366 ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) ? \
367 ((sbp)->sb_versionnum | XFS_SB_VERSION_ATTRBIT) : \
368 (XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT)));
369}
370
371static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp)
372{
373 return ((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \
374 ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
375 ((sbp)->sb_versionnum & XFS_SB_VERSION_NLINKBIT));
376}
377
378static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp)
379{
380 (sbp)->sb_versionnum = ((sbp)->sb_versionnum <= XFS_SB_VERSION_2 ? \
381 XFS_SB_VERSION_3 : \
382 ((sbp)->sb_versionnum | XFS_SB_VERSION_NLINKBIT));
383}
384
385static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp)
386{
387 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
388 ((sbp)->sb_versionnum & XFS_SB_VERSION_QUOTABIT);
389}
390
391static inline void xfs_sb_version_addquota(xfs_sb_t *sbp)
392{
393 (sbp)->sb_versionnum = \
394 (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 ? \
395 ((sbp)->sb_versionnum | XFS_SB_VERSION_QUOTABIT) : \
396 (xfs_sb_version_tonew((sbp)->sb_versionnum) | \
397 XFS_SB_VERSION_QUOTABIT));
398}
399
400static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp)
401{
402 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
403 ((sbp)->sb_versionnum & XFS_SB_VERSION_ALIGNBIT);
404}
405
406static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp)
407{
408 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
409 ((sbp)->sb_versionnum & XFS_SB_VERSION_DALIGNBIT);
410}
411
412static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp)
413{
414 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
415 ((sbp)->sb_versionnum & XFS_SB_VERSION_SHAREDBIT);
416}
417
418static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp)
419{
420 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
421 ((sbp)->sb_versionnum & XFS_SB_VERSION_DIRV2BIT);
422}
423
424static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp)
425{
426 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
427 ((sbp)->sb_versionnum & XFS_SB_VERSION_LOGV2BIT);
428}
429
430static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp)
431{
432 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
433 ((sbp)->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT);
434}
435
436static inline int xfs_sb_version_hassector(xfs_sb_t *sbp)
437{
438 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
439 ((sbp)->sb_versionnum & XFS_SB_VERSION_SECTORBIT);
440}
441
442static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp)
443{
444 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
445 (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT);
446}
447
448static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp)
449{
450 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
451 ((sbp)->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT);
452}
453
454
455
456
457
458
459
460
461
462
463
464static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp)
465{
466 return (xfs_sb_version_hasmorebits(sbp) && \
467 ((sbp)->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT));
468}
469
470static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp)
471{
472 return (xfs_sb_version_hasmorebits(sbp)) && \
473 ((sbp)->sb_features2 & XFS_SB_VERSION2_ATTR2BIT);
474}
475
476static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp)
477{
478 ((sbp)->sb_versionnum = \
479 ((sbp)->sb_versionnum | XFS_SB_VERSION_MOREBITSBIT), \
480 ((sbp)->sb_features2 = \
481 ((sbp)->sb_features2 | XFS_SB_VERSION2_ATTR2BIT)));
482}
483
484static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp)
485{
486 sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT;
487 if (!sbp->sb_features2)
488 sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT;
489}
490
491
492
493
494
495#define XFS_SB_DADDR ((xfs_daddr_t)0)
496#define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR)
497#define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)XFS_BUF_PTR(bp))
498
499#define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d))
500#define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \
501 XFS_DADDR_TO_AGNO(mp,d), XFS_DADDR_TO_AGBNO(mp,d))
502#define XFS_FSB_TO_DADDR(mp,fsbno) XFS_AGB_TO_DADDR(mp, \
503 XFS_FSB_TO_AGNO(mp,fsbno), XFS_FSB_TO_AGBNO(mp,fsbno))
504
505
506
507
508#define XFS_FSS_TO_BB(mp,sec) ((sec) << (mp)->m_sectbb_log)
509
510
511
512
513#define XFS_FSB_TO_BB(mp,fsbno) ((fsbno) << (mp)->m_blkbb_log)
514#define XFS_BB_TO_FSB(mp,bb) \
515 (((bb) + (XFS_FSB_TO_BB(mp,1) - 1)) >> (mp)->m_blkbb_log)
516#define XFS_BB_TO_FSBT(mp,bb) ((bb) >> (mp)->m_blkbb_log)
517#define XFS_BB_FSB_OFFSET(mp,bb) ((bb) & ((mp)->m_bsize - 1))
518
519
520
521
522#define XFS_FSB_TO_B(mp,fsbno) ((xfs_fsize_t)(fsbno) << (mp)->m_sb.sb_blocklog)
523#define XFS_B_TO_FSB(mp,b) \
524 ((((__uint64_t)(b)) + (mp)->m_blockmask) >> (mp)->m_sb.sb_blocklog)
525#define XFS_B_TO_FSBT(mp,b) (((__uint64_t)(b)) >> (mp)->m_sb.sb_blocklog)
526#define XFS_B_FSB_OFFSET(mp,b) ((b) & (mp)->m_blockmask)
527
528#endif
529