1 |
1275 |
phoenix |
/*
|
2 |
|
|
* Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved.
|
3 |
|
|
*
|
4 |
|
|
* This program is free software; you can redistribute it and/or modify it
|
5 |
|
|
* under the terms of version 2 of the GNU General Public License as
|
6 |
|
|
* published by the Free Software Foundation.
|
7 |
|
|
*
|
8 |
|
|
* This program is distributed in the hope that it would be useful, but
|
9 |
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
10 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
11 |
|
|
*
|
12 |
|
|
* Further, this software is distributed without any warranty that it is
|
13 |
|
|
* free of the rightful claim of any third person regarding infringement
|
14 |
|
|
* or the like. Any license provided herein, whether implied or
|
15 |
|
|
* otherwise, applies only to this software file. Patent licenses, if
|
16 |
|
|
* any, provided herein do not apply to combinations of this program with
|
17 |
|
|
* other software, or any other product whatsoever.
|
18 |
|
|
*
|
19 |
|
|
* You should have received a copy of the GNU General Public License along
|
20 |
|
|
* with this program; if not, write the Free Software Foundation, Inc., 59
|
21 |
|
|
* Temple Place - Suite 330, Boston MA 02111-1307, USA.
|
22 |
|
|
*
|
23 |
|
|
* Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
|
24 |
|
|
* Mountain View, CA 94043, or:
|
25 |
|
|
*
|
26 |
|
|
* http://www.sgi.com
|
27 |
|
|
*
|
28 |
|
|
* For further information regarding this notice, see:
|
29 |
|
|
*
|
30 |
|
|
* http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
|
31 |
|
|
*/
|
32 |
|
|
#ifndef __XFS_SB_H__
|
33 |
|
|
#define __XFS_SB_H__
|
34 |
|
|
|
35 |
|
|
/*
|
36 |
|
|
* Super block
|
37 |
|
|
* Fits into a sector-sized buffer at address 0 of each allocation group.
|
38 |
|
|
* Only the first of these is ever updated except during growfs.
|
39 |
|
|
*/
|
40 |
|
|
|
41 |
|
|
struct xfs_buf;
|
42 |
|
|
struct xfs_mount;
|
43 |
|
|
|
44 |
|
|
#define XFS_SB_MAGIC 0x58465342 /* 'XFSB' */
|
45 |
|
|
#define XFS_SB_VERSION_1 1 /* 5.3, 6.0.1, 6.1 */
|
46 |
|
|
#define XFS_SB_VERSION_2 2 /* 6.2 - attributes */
|
47 |
|
|
#define XFS_SB_VERSION_3 3 /* 6.2 - new inode version */
|
48 |
|
|
#define XFS_SB_VERSION_4 4 /* 6.2+ - bitmask version */
|
49 |
|
|
#define XFS_SB_VERSION_NUMBITS 0x000f
|
50 |
|
|
#define XFS_SB_VERSION_ALLFBITS 0xfff0
|
51 |
|
|
#define XFS_SB_VERSION_SASHFBITS 0xf000
|
52 |
|
|
#define XFS_SB_VERSION_REALFBITS 0x0ff0
|
53 |
|
|
#define XFS_SB_VERSION_ATTRBIT 0x0010
|
54 |
|
|
#define XFS_SB_VERSION_NLINKBIT 0x0020
|
55 |
|
|
#define XFS_SB_VERSION_QUOTABIT 0x0040
|
56 |
|
|
#define XFS_SB_VERSION_ALIGNBIT 0x0080
|
57 |
|
|
#define XFS_SB_VERSION_DALIGNBIT 0x0100
|
58 |
|
|
#define XFS_SB_VERSION_SHAREDBIT 0x0200
|
59 |
|
|
#define XFS_SB_VERSION_LOGV2BIT 0x0400
|
60 |
|
|
#define XFS_SB_VERSION_SECTORBIT 0x0800
|
61 |
|
|
#define XFS_SB_VERSION_EXTFLGBIT 0x1000
|
62 |
|
|
#define XFS_SB_VERSION_DIRV2BIT 0x2000
|
63 |
|
|
#define XFS_SB_VERSION_OKSASHFBITS \
|
64 |
|
|
(XFS_SB_VERSION_EXTFLGBIT | \
|
65 |
|
|
XFS_SB_VERSION_DIRV2BIT)
|
66 |
|
|
#define XFS_SB_VERSION_OKREALFBITS \
|
67 |
|
|
(XFS_SB_VERSION_ATTRBIT | \
|
68 |
|
|
XFS_SB_VERSION_NLINKBIT | \
|
69 |
|
|
XFS_SB_VERSION_QUOTABIT | \
|
70 |
|
|
XFS_SB_VERSION_ALIGNBIT | \
|
71 |
|
|
XFS_SB_VERSION_DALIGNBIT | \
|
72 |
|
|
XFS_SB_VERSION_SHAREDBIT | \
|
73 |
|
|
XFS_SB_VERSION_LOGV2BIT | \
|
74 |
|
|
XFS_SB_VERSION_SECTORBIT)
|
75 |
|
|
#define XFS_SB_VERSION_OKSASHBITS \
|
76 |
|
|
(XFS_SB_VERSION_NUMBITS | \
|
77 |
|
|
XFS_SB_VERSION_REALFBITS | \
|
78 |
|
|
XFS_SB_VERSION_OKSASHFBITS)
|
79 |
|
|
#define XFS_SB_VERSION_OKREALBITS \
|
80 |
|
|
(XFS_SB_VERSION_NUMBITS | \
|
81 |
|
|
XFS_SB_VERSION_OKREALFBITS | \
|
82 |
|
|
XFS_SB_VERSION_OKSASHFBITS)
|
83 |
|
|
#define XFS_SB_VERSION_MKFS(ia,dia,extflag,dirv2,na,sflag) \
|
84 |
|
|
(((ia) || (dia) || (extflag) || (dirv2) || (na) || (sflag)) ? \
|
85 |
|
|
(XFS_SB_VERSION_4 | \
|
86 |
|
|
((ia) ? XFS_SB_VERSION_ALIGNBIT : 0) | \
|
87 |
|
|
((dia) ? XFS_SB_VERSION_DALIGNBIT : 0) | \
|
88 |
|
|
((extflag) ? XFS_SB_VERSION_EXTFLGBIT : 0) | \
|
89 |
|
|
((dirv2) ? XFS_SB_VERSION_DIRV2BIT : 0) | \
|
90 |
|
|
((na) ? XFS_SB_VERSION_LOGV2BIT : 0) | \
|
91 |
|
|
((sflag) ? XFS_SB_VERSION_SECTORBIT : 0)) : \
|
92 |
|
|
XFS_SB_VERSION_1)
|
93 |
|
|
|
94 |
|
|
typedef struct xfs_sb
|
95 |
|
|
{
|
96 |
|
|
__uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */
|
97 |
|
|
__uint32_t sb_blocksize; /* logical block size, bytes */
|
98 |
|
|
xfs_drfsbno_t sb_dblocks; /* number of data blocks */
|
99 |
|
|
xfs_drfsbno_t sb_rblocks; /* number of realtime blocks */
|
100 |
|
|
xfs_drtbno_t sb_rextents; /* number of realtime extents */
|
101 |
|
|
uuid_t sb_uuid; /* file system unique id */
|
102 |
|
|
xfs_dfsbno_t sb_logstart; /* starting block of log if internal */
|
103 |
|
|
xfs_ino_t sb_rootino; /* root inode number */
|
104 |
|
|
xfs_ino_t sb_rbmino; /* bitmap inode for realtime extents */
|
105 |
|
|
xfs_ino_t sb_rsumino; /* summary inode for rt bitmap */
|
106 |
|
|
xfs_agblock_t sb_rextsize; /* realtime extent size, blocks */
|
107 |
|
|
xfs_agblock_t sb_agblocks; /* size of an allocation group */
|
108 |
|
|
xfs_agnumber_t sb_agcount; /* number of allocation groups */
|
109 |
|
|
xfs_extlen_t sb_rbmblocks; /* number of rt bitmap blocks */
|
110 |
|
|
xfs_extlen_t sb_logblocks; /* number of log blocks */
|
111 |
|
|
__uint16_t sb_versionnum; /* header version == XFS_SB_VERSION */
|
112 |
|
|
__uint16_t sb_sectsize; /* volume sector size, bytes */
|
113 |
|
|
__uint16_t sb_inodesize; /* inode size, bytes */
|
114 |
|
|
__uint16_t sb_inopblock; /* inodes per block */
|
115 |
|
|
char sb_fname[12]; /* file system name */
|
116 |
|
|
__uint8_t sb_blocklog; /* log2 of sb_blocksize */
|
117 |
|
|
__uint8_t sb_sectlog; /* log2 of sb_sectsize */
|
118 |
|
|
__uint8_t sb_inodelog; /* log2 of sb_inodesize */
|
119 |
|
|
__uint8_t sb_inopblog; /* log2 of sb_inopblock */
|
120 |
|
|
__uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */
|
121 |
|
|
__uint8_t sb_rextslog; /* log2 of sb_rextents */
|
122 |
|
|
__uint8_t sb_inprogress; /* mkfs is in progress, don't mount */
|
123 |
|
|
__uint8_t sb_imax_pct; /* max % of fs for inode space */
|
124 |
|
|
/* statistics */
|
125 |
|
|
/*
|
126 |
|
|
* These fields must remain contiguous. If you really
|
127 |
|
|
* want to change their layout, make sure you fix the
|
128 |
|
|
* code in xfs_trans_apply_sb_deltas().
|
129 |
|
|
*/
|
130 |
|
|
__uint64_t sb_icount; /* allocated inodes */
|
131 |
|
|
__uint64_t sb_ifree; /* free inodes */
|
132 |
|
|
__uint64_t sb_fdblocks; /* free data blocks */
|
133 |
|
|
__uint64_t sb_frextents; /* free realtime extents */
|
134 |
|
|
/*
|
135 |
|
|
* End contiguous fields.
|
136 |
|
|
*/
|
137 |
|
|
xfs_ino_t sb_uquotino; /* user quota inode */
|
138 |
|
|
xfs_ino_t sb_gquotino; /* group quota inode */
|
139 |
|
|
__uint16_t sb_qflags; /* quota flags */
|
140 |
|
|
__uint8_t sb_flags; /* misc. flags */
|
141 |
|
|
__uint8_t sb_shared_vn; /* shared version number */
|
142 |
|
|
xfs_extlen_t sb_inoalignmt; /* inode chunk alignment, fsblocks */
|
143 |
|
|
__uint32_t sb_unit; /* stripe or raid unit */
|
144 |
|
|
__uint32_t sb_width; /* stripe or raid width */
|
145 |
|
|
__uint8_t sb_dirblklog; /* log2 of dir block size (fsbs) */
|
146 |
|
|
__uint8_t sb_logsectlog; /* log2 of the log sector size */
|
147 |
|
|
__uint16_t sb_logsectsize; /* sector size for the log, bytes */
|
148 |
|
|
__uint32_t sb_logsunit; /* stripe unit size for the log */
|
149 |
|
|
} xfs_sb_t;
|
150 |
|
|
|
151 |
|
|
/*
|
152 |
|
|
* Sequence number values for the fields.
|
153 |
|
|
*/
|
154 |
|
|
typedef enum {
|
155 |
|
|
XFS_SBS_MAGICNUM, XFS_SBS_BLOCKSIZE, XFS_SBS_DBLOCKS, XFS_SBS_RBLOCKS,
|
156 |
|
|
XFS_SBS_REXTENTS, XFS_SBS_UUID, XFS_SBS_LOGSTART, XFS_SBS_ROOTINO,
|
157 |
|
|
XFS_SBS_RBMINO, XFS_SBS_RSUMINO, XFS_SBS_REXTSIZE, XFS_SBS_AGBLOCKS,
|
158 |
|
|
XFS_SBS_AGCOUNT, XFS_SBS_RBMBLOCKS, XFS_SBS_LOGBLOCKS,
|
159 |
|
|
XFS_SBS_VERSIONNUM, XFS_SBS_SECTSIZE, XFS_SBS_INODESIZE,
|
160 |
|
|
XFS_SBS_INOPBLOCK, XFS_SBS_FNAME, XFS_SBS_BLOCKLOG,
|
161 |
|
|
XFS_SBS_SECTLOG, XFS_SBS_INODELOG, XFS_SBS_INOPBLOG, XFS_SBS_AGBLKLOG,
|
162 |
|
|
XFS_SBS_REXTSLOG, XFS_SBS_INPROGRESS, XFS_SBS_IMAX_PCT, XFS_SBS_ICOUNT,
|
163 |
|
|
XFS_SBS_IFREE, XFS_SBS_FDBLOCKS, XFS_SBS_FREXTENTS, XFS_SBS_UQUOTINO,
|
164 |
|
|
XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN,
|
165 |
|
|
XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG,
|
166 |
|
|
XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT,
|
167 |
|
|
XFS_SBS_FIELDCOUNT
|
168 |
|
|
} xfs_sb_field_t;
|
169 |
|
|
|
170 |
|
|
/*
|
171 |
|
|
* Mask values, defined based on the xfs_sb_field_t values.
|
172 |
|
|
* Only define the ones we're using.
|
173 |
|
|
*/
|
174 |
|
|
#define XFS_SB_MVAL(x) (1LL << XFS_SBS_ ## x)
|
175 |
|
|
#define XFS_SB_UUID XFS_SB_MVAL(UUID)
|
176 |
|
|
#define XFS_SB_FNAME XFS_SB_MVAL(FNAME)
|
177 |
|
|
#define XFS_SB_ROOTINO XFS_SB_MVAL(ROOTINO)
|
178 |
|
|
#define XFS_SB_RBMINO XFS_SB_MVAL(RBMINO)
|
179 |
|
|
#define XFS_SB_RSUMINO XFS_SB_MVAL(RSUMINO)
|
180 |
|
|
#define XFS_SB_VERSIONNUM XFS_SB_MVAL(VERSIONNUM)
|
181 |
|
|
#define XFS_SB_UQUOTINO XFS_SB_MVAL(UQUOTINO)
|
182 |
|
|
#define XFS_SB_GQUOTINO XFS_SB_MVAL(GQUOTINO)
|
183 |
|
|
#define XFS_SB_QFLAGS XFS_SB_MVAL(QFLAGS)
|
184 |
|
|
#define XFS_SB_SHARED_VN XFS_SB_MVAL(SHARED_VN)
|
185 |
|
|
#define XFS_SB_UNIT XFS_SB_MVAL(UNIT)
|
186 |
|
|
#define XFS_SB_WIDTH XFS_SB_MVAL(WIDTH)
|
187 |
|
|
#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT)
|
188 |
|
|
#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1)
|
189 |
|
|
#define XFS_SB_MOD_BITS \
|
190 |
|
|
(XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \
|
191 |
|
|
XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \
|
192 |
|
|
XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH)
|
193 |
|
|
|
194 |
|
|
/*
|
195 |
|
|
* Misc. Flags - warning - these will be cleared by xfs_repair unless
|
196 |
|
|
* a feature bit is set when the flag is used.
|
197 |
|
|
*/
|
198 |
|
|
#define XFS_SBF_NOFLAGS 0x00 /* no flags set */
|
199 |
|
|
#define XFS_SBF_READONLY 0x01 /* only read-only mounts allowed */
|
200 |
|
|
|
201 |
|
|
/*
|
202 |
|
|
* define max. shared version we can interoperate with
|
203 |
|
|
*/
|
204 |
|
|
#define XFS_SB_MAX_SHARED_VN 0
|
205 |
|
|
|
206 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_NUM)
|
207 |
|
|
int xfs_sb_version_num(xfs_sb_t *sbp);
|
208 |
|
|
#define XFS_SB_VERSION_NUM(sbp) xfs_sb_version_num(sbp)
|
209 |
|
|
#else
|
210 |
|
|
#define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS)
|
211 |
|
|
#endif
|
212 |
|
|
|
213 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_GOOD_VERSION)
|
214 |
|
|
int xfs_sb_good_version(xfs_sb_t *sbp);
|
215 |
|
|
#define XFS_SB_GOOD_VERSION(sbp) xfs_sb_good_version(sbp)
|
216 |
|
|
#else
|
217 |
|
|
#define XFS_SB_GOOD_VERSION_INT(sbp) \
|
218 |
|
|
((((sbp)->sb_versionnum >= XFS_SB_VERSION_1) && \
|
219 |
|
|
((sbp)->sb_versionnum <= XFS_SB_VERSION_3)) || \
|
220 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
221 |
|
|
!((sbp)->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS)
|
222 |
|
|
#ifdef __KERNEL__
|
223 |
|
|
#define XFS_SB_GOOD_VERSION(sbp) \
|
224 |
|
|
(XFS_SB_GOOD_VERSION_INT(sbp) && \
|
225 |
|
|
(sbp)->sb_shared_vn <= XFS_SB_MAX_SHARED_VN) ))
|
226 |
|
|
#else
|
227 |
|
|
/*
|
228 |
|
|
* extra 2 paren's here (( to unconfuse paren-matching editors
|
229 |
|
|
* like vi because XFS_SB_GOOD_VERSION_INT is a partial expression
|
230 |
|
|
* and the two XFS_SB_GOOD_VERSION's each 2 more close paren's to
|
231 |
|
|
* complete the expression.
|
232 |
|
|
*/
|
233 |
|
|
#define XFS_SB_GOOD_VERSION(sbp) \
|
234 |
|
|
(XFS_SB_GOOD_VERSION_INT(sbp) && \
|
235 |
|
|
(!((sbp)->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) || \
|
236 |
|
|
(sbp)->sb_shared_vn <= XFS_SB_MAX_SHARED_VN)) ))
|
237 |
|
|
#endif /* __KERNEL__ */
|
238 |
|
|
#endif
|
239 |
|
|
|
240 |
|
|
#define XFS_SB_GOOD_SASH_VERSION(sbp) \
|
241 |
|
|
((((sbp)->sb_versionnum >= XFS_SB_VERSION_1) && \
|
242 |
|
|
((sbp)->sb_versionnum <= XFS_SB_VERSION_3)) || \
|
243 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
244 |
|
|
!((sbp)->sb_versionnum & ~XFS_SB_VERSION_OKSASHBITS)))
|
245 |
|
|
|
246 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_TONEW)
|
247 |
|
|
unsigned xfs_sb_version_tonew(unsigned v);
|
248 |
|
|
#define XFS_SB_VERSION_TONEW(v) xfs_sb_version_tonew(v)
|
249 |
|
|
#else
|
250 |
|
|
#define XFS_SB_VERSION_TONEW(v) \
|
251 |
|
|
((((v) == XFS_SB_VERSION_1) ? \
|
252 |
|
|
|
253 |
|
|
(((v) == XFS_SB_VERSION_2) ? \
|
254 |
|
|
XFS_SB_VERSION_ATTRBIT : \
|
255 |
|
|
(XFS_SB_VERSION_ATTRBIT | XFS_SB_VERSION_NLINKBIT))) | \
|
256 |
|
|
XFS_SB_VERSION_4)
|
257 |
|
|
#endif
|
258 |
|
|
|
259 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_TOOLD)
|
260 |
|
|
unsigned xfs_sb_version_toold(unsigned v);
|
261 |
|
|
#define XFS_SB_VERSION_TOOLD(v) xfs_sb_version_toold(v)
|
262 |
|
|
#else
|
263 |
|
|
#define XFS_SB_VERSION_TOOLD(v) \
|
264 |
|
|
(((v) & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) ? \
|
265 |
|
|
|
266 |
|
|
(((v) & XFS_SB_VERSION_NLINKBIT) ? \
|
267 |
|
|
XFS_SB_VERSION_3 : \
|
268 |
|
|
(((v) & XFS_SB_VERSION_ATTRBIT) ? \
|
269 |
|
|
XFS_SB_VERSION_2 : \
|
270 |
|
|
XFS_SB_VERSION_1)))
|
271 |
|
|
#endif
|
272 |
|
|
|
273 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASATTR)
|
274 |
|
|
int xfs_sb_version_hasattr(xfs_sb_t *sbp);
|
275 |
|
|
#define XFS_SB_VERSION_HASATTR(sbp) xfs_sb_version_hasattr(sbp)
|
276 |
|
|
#else
|
277 |
|
|
#define XFS_SB_VERSION_HASATTR(sbp) \
|
278 |
|
|
(((sbp)->sb_versionnum == XFS_SB_VERSION_2) || \
|
279 |
|
|
((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \
|
280 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
281 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_ATTRBIT)))
|
282 |
|
|
#endif
|
283 |
|
|
|
284 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_ADDATTR)
|
285 |
|
|
void xfs_sb_version_addattr(xfs_sb_t *sbp);
|
286 |
|
|
#define XFS_SB_VERSION_ADDATTR(sbp) xfs_sb_version_addattr(sbp)
|
287 |
|
|
#else
|
288 |
|
|
#define XFS_SB_VERSION_ADDATTR(sbp) \
|
289 |
|
|
((sbp)->sb_versionnum = \
|
290 |
|
|
(((sbp)->sb_versionnum == XFS_SB_VERSION_1) ? \
|
291 |
|
|
XFS_SB_VERSION_2 : \
|
292 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) ? \
|
293 |
|
|
((sbp)->sb_versionnum | XFS_SB_VERSION_ATTRBIT) : \
|
294 |
|
|
(XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT))))
|
295 |
|
|
#endif
|
296 |
|
|
|
297 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASNLINK)
|
298 |
|
|
int xfs_sb_version_hasnlink(xfs_sb_t *sbp);
|
299 |
|
|
#define XFS_SB_VERSION_HASNLINK(sbp) xfs_sb_version_hasnlink(sbp)
|
300 |
|
|
#else
|
301 |
|
|
#define XFS_SB_VERSION_HASNLINK(sbp) \
|
302 |
|
|
(((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \
|
303 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
304 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_NLINKBIT)))
|
305 |
|
|
#endif
|
306 |
|
|
|
307 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_ADDNLINK)
|
308 |
|
|
void xfs_sb_version_addnlink(xfs_sb_t *sbp);
|
309 |
|
|
#define XFS_SB_VERSION_ADDNLINK(sbp) xfs_sb_version_addnlink(sbp)
|
310 |
|
|
#else
|
311 |
|
|
#define XFS_SB_VERSION_ADDNLINK(sbp) \
|
312 |
|
|
((sbp)->sb_versionnum = \
|
313 |
|
|
((sbp)->sb_versionnum <= XFS_SB_VERSION_2 ? \
|
314 |
|
|
XFS_SB_VERSION_3 : \
|
315 |
|
|
((sbp)->sb_versionnum | XFS_SB_VERSION_NLINKBIT)))
|
316 |
|
|
#endif
|
317 |
|
|
|
318 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASQUOTA)
|
319 |
|
|
int xfs_sb_version_hasquota(xfs_sb_t *sbp);
|
320 |
|
|
#define XFS_SB_VERSION_HASQUOTA(sbp) xfs_sb_version_hasquota(sbp)
|
321 |
|
|
#else
|
322 |
|
|
#define XFS_SB_VERSION_HASQUOTA(sbp) \
|
323 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
324 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_QUOTABIT))
|
325 |
|
|
#endif
|
326 |
|
|
|
327 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_ADDQUOTA)
|
328 |
|
|
void xfs_sb_version_addquota(xfs_sb_t *sbp);
|
329 |
|
|
#define XFS_SB_VERSION_ADDQUOTA(sbp) xfs_sb_version_addquota(sbp)
|
330 |
|
|
#else
|
331 |
|
|
#define XFS_SB_VERSION_ADDQUOTA(sbp) \
|
332 |
|
|
((sbp)->sb_versionnum = \
|
333 |
|
|
(XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 ? \
|
334 |
|
|
((sbp)->sb_versionnum | XFS_SB_VERSION_QUOTABIT) : \
|
335 |
|
|
(XFS_SB_VERSION_TONEW((sbp)->sb_versionnum) | \
|
336 |
|
|
XFS_SB_VERSION_QUOTABIT)))
|
337 |
|
|
#endif
|
338 |
|
|
|
339 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASALIGN)
|
340 |
|
|
int xfs_sb_version_hasalign(xfs_sb_t *sbp);
|
341 |
|
|
#define XFS_SB_VERSION_HASALIGN(sbp) xfs_sb_version_hasalign(sbp)
|
342 |
|
|
#else
|
343 |
|
|
#define XFS_SB_VERSION_HASALIGN(sbp) \
|
344 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
345 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_ALIGNBIT))
|
346 |
|
|
#endif
|
347 |
|
|
|
348 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_SUBALIGN)
|
349 |
|
|
void xfs_sb_version_subalign(xfs_sb_t *sbp);
|
350 |
|
|
#define XFS_SB_VERSION_SUBALIGN(sbp) xfs_sb_version_subalign(sbp)
|
351 |
|
|
#else
|
352 |
|
|
#define XFS_SB_VERSION_SUBALIGN(sbp) \
|
353 |
|
|
((sbp)->sb_versionnum = \
|
354 |
|
|
XFS_SB_VERSION_TOOLD((sbp)->sb_versionnum & ~XFS_SB_VERSION_ALIGNBIT))
|
355 |
|
|
#endif
|
356 |
|
|
|
357 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASDALIGN)
|
358 |
|
|
int xfs_sb_version_hasdalign(xfs_sb_t *sbp);
|
359 |
|
|
#define XFS_SB_VERSION_HASDALIGN(sbp) xfs_sb_version_hasdalign(sbp)
|
360 |
|
|
#else
|
361 |
|
|
#define XFS_SB_VERSION_HASDALIGN(sbp) \
|
362 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
363 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_DALIGNBIT))
|
364 |
|
|
#endif
|
365 |
|
|
|
366 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_ADDDALIGN)
|
367 |
|
|
int xfs_sb_version_adddalign(xfs_sb_t *sbp);
|
368 |
|
|
#define XFS_SB_VERSION_ADDDALIGN(sbp) xfs_sb_version_adddalign(sbp)
|
369 |
|
|
#else
|
370 |
|
|
#define XFS_SB_VERSION_ADDDALIGN(sbp) \
|
371 |
|
|
((sbp)->sb_versionnum = \
|
372 |
|
|
((sbp)->sb_versionnum | XFS_SB_VERSION_DALIGNBIT))
|
373 |
|
|
#endif
|
374 |
|
|
|
375 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASSHARED)
|
376 |
|
|
int xfs_sb_version_hasshared(xfs_sb_t *sbp);
|
377 |
|
|
#define XFS_SB_VERSION_HASSHARED(sbp) xfs_sb_version_hasshared(sbp)
|
378 |
|
|
#else
|
379 |
|
|
#define XFS_SB_VERSION_HASSHARED(sbp) \
|
380 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
381 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_SHAREDBIT))
|
382 |
|
|
#endif
|
383 |
|
|
|
384 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_ADDSHARED)
|
385 |
|
|
int xfs_sb_version_addshared(xfs_sb_t *sbp);
|
386 |
|
|
#define XFS_SB_VERSION_ADDSHARED(sbp) xfs_sb_version_addshared(sbp)
|
387 |
|
|
#else
|
388 |
|
|
#define XFS_SB_VERSION_ADDSHARED(sbp) \
|
389 |
|
|
((sbp)->sb_versionnum = \
|
390 |
|
|
((sbp)->sb_versionnum | XFS_SB_VERSION_SHAREDBIT))
|
391 |
|
|
#endif
|
392 |
|
|
|
393 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_SUBSHARED)
|
394 |
|
|
int xfs_sb_version_subshared(xfs_sb_t *sbp);
|
395 |
|
|
#define XFS_SB_VERSION_SUBSHARED(sbp) xfs_sb_version_subshared(sbp)
|
396 |
|
|
#else
|
397 |
|
|
#define XFS_SB_VERSION_SUBSHARED(sbp) \
|
398 |
|
|
((sbp)->sb_versionnum = \
|
399 |
|
|
((sbp)->sb_versionnum & ~XFS_SB_VERSION_SHAREDBIT))
|
400 |
|
|
#endif
|
401 |
|
|
|
402 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASDIRV2)
|
403 |
|
|
int xfs_sb_version_hasdirv2(xfs_sb_t *sbp);
|
404 |
|
|
#define XFS_SB_VERSION_HASDIRV2(sbp) xfs_sb_version_hasdirv2(sbp)
|
405 |
|
|
#else
|
406 |
|
|
#define XFS_SB_VERSION_HASDIRV2(sbp) \
|
407 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
408 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_DIRV2BIT))
|
409 |
|
|
#endif
|
410 |
|
|
|
411 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASLOGV2)
|
412 |
|
|
int xfs_sb_version_haslogv2(xfs_sb_t *sbp);
|
413 |
|
|
#define XFS_SB_VERSION_HASLOGV2(sbp) xfs_sb_version_haslogv2(sbp)
|
414 |
|
|
#else
|
415 |
|
|
#define XFS_SB_VERSION_HASLOGV2(sbp) \
|
416 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
417 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_LOGV2BIT))
|
418 |
|
|
#endif
|
419 |
|
|
|
420 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASEXTFLGBIT)
|
421 |
|
|
int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp);
|
422 |
|
|
#define XFS_SB_VERSION_HASEXTFLGBIT(sbp) xfs_sb_version_hasextflgbit(sbp)
|
423 |
|
|
#else
|
424 |
|
|
#define XFS_SB_VERSION_HASEXTFLGBIT(sbp) \
|
425 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
426 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT))
|
427 |
|
|
#endif
|
428 |
|
|
|
429 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_ADDEXTFLGBIT)
|
430 |
|
|
int xfs_sb_version_addextflgbit(xfs_sb_t *sbp);
|
431 |
|
|
#define XFS_SB_VERSION_ADDEXTFLGBIT(sbp) xfs_sb_version_addextflgbit(sbp)
|
432 |
|
|
#else
|
433 |
|
|
#define XFS_SB_VERSION_ADDEXTFLGBIT(sbp) \
|
434 |
|
|
((sbp)->sb_versionnum = \
|
435 |
|
|
((sbp)->sb_versionnum | XFS_SB_VERSION_EXTFLGBIT))
|
436 |
|
|
#endif
|
437 |
|
|
|
438 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_SUBEXTFLGBIT)
|
439 |
|
|
int xfs_sb_version_subextflgbit(xfs_sb_t *sbp);
|
440 |
|
|
#define XFS_SB_VERSION_SUBEXTFLGBIT(sbp) xfs_sb_version_subextflgbit(sbp)
|
441 |
|
|
#else
|
442 |
|
|
#define XFS_SB_VERSION_SUBEXTFLGBIT(sbp) \
|
443 |
|
|
((sbp)->sb_versionnum = \
|
444 |
|
|
((sbp)->sb_versionnum & ~XFS_SB_VERSION_EXTFLGBIT))
|
445 |
|
|
#endif
|
446 |
|
|
|
447 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_VERSION_HASSECTOR)
|
448 |
|
|
int xfs_sb_version_hassector(xfs_sb_t *sbp);
|
449 |
|
|
#define XFS_SB_VERSION_HASSECTOR(sbp) xfs_sb_version_hassector(sbp)
|
450 |
|
|
#else
|
451 |
|
|
#define XFS_SB_VERSION_HASSECTOR(sbp) \
|
452 |
|
|
((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \
|
453 |
|
|
((sbp)->sb_versionnum & XFS_SB_VERSION_SECTORBIT))
|
454 |
|
|
#endif
|
455 |
|
|
|
456 |
|
|
/*
|
457 |
|
|
* end of superblock version macros
|
458 |
|
|
*/
|
459 |
|
|
|
460 |
|
|
#define XFS_SB_DADDR ((xfs_daddr_t)0) /* daddr in filesystem/ag */
|
461 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_SB_BLOCK)
|
462 |
|
|
xfs_agblock_t xfs_sb_block(struct xfs_mount *mp);
|
463 |
|
|
#define XFS_SB_BLOCK(mp) xfs_sb_block(mp)
|
464 |
|
|
#else
|
465 |
|
|
#define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR)
|
466 |
|
|
#endif
|
467 |
|
|
|
468 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_HDR_BLOCK)
|
469 |
|
|
xfs_agblock_t xfs_hdr_block(struct xfs_mount *mp, xfs_daddr_t d);
|
470 |
|
|
#define XFS_HDR_BLOCK(mp,d) xfs_hdr_block(mp,d)
|
471 |
|
|
#else
|
472 |
|
|
#define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp,d)))
|
473 |
|
|
#endif
|
474 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DADDR_TO_FSB)
|
475 |
|
|
xfs_fsblock_t xfs_daddr_to_fsb(struct xfs_mount *mp, xfs_daddr_t d);
|
476 |
|
|
#define XFS_DADDR_TO_FSB(mp,d) xfs_daddr_to_fsb(mp,d)
|
477 |
|
|
#else
|
478 |
|
|
#define XFS_DADDR_TO_FSB(mp,d) \
|
479 |
|
|
XFS_AGB_TO_FSB(mp, XFS_DADDR_TO_AGNO(mp,d), XFS_DADDR_TO_AGBNO(mp,d))
|
480 |
|
|
#endif
|
481 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_FSB_TO_DADDR)
|
482 |
|
|
xfs_daddr_t xfs_fsb_to_daddr(struct xfs_mount *mp, xfs_fsblock_t fsbno);
|
483 |
|
|
#define XFS_FSB_TO_DADDR(mp,fsbno) xfs_fsb_to_daddr(mp,fsbno)
|
484 |
|
|
#else
|
485 |
|
|
#define XFS_FSB_TO_DADDR(mp,fsbno) \
|
486 |
|
|
XFS_AGB_TO_DADDR(mp, XFS_FSB_TO_AGNO(mp,fsbno), \
|
487 |
|
|
XFS_FSB_TO_AGBNO(mp,fsbno))
|
488 |
|
|
#endif
|
489 |
|
|
|
490 |
|
|
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BUF_TO_SBP)
|
491 |
|
|
xfs_sb_t *xfs_buf_to_sbp(struct xfs_buf *bp);
|
492 |
|
|
#define XFS_BUF_TO_SBP(bp) xfs_buf_to_sbp(bp)
|
493 |
|
|
#else
|
494 |
|
|
#define XFS_BUF_TO_SBP(bp) ((xfs_sb_t *)XFS_BUF_PTR(bp))
|
495 |
|
|
#endif
|
496 |
|
|
|
497 |
|
|
/*
|
498 |
|
|
* File system sector to basic block conversions.
|
499 |
|
|
*/
|
500 |
|
|
#define XFS_FSS_TO_BB(mp,sec) ((sec) << (mp)->m_sectbb_log)
|
501 |
|
|
#define XFS_BB_TO_FSS(mp,bb) \
|
502 |
|
|
(((bb) + (XFS_FSS_TO_BB(mp,1) - 1)) >> (mp)->m_sectbb_log)
|
503 |
|
|
#define XFS_BB_TO_FSST(mp,bb) ((bb) >> (mp)->m_sectbb_log)
|
504 |
|
|
|
505 |
|
|
/*
|
506 |
|
|
* File system sector to byte conversions.
|
507 |
|
|
*/
|
508 |
|
|
#define XFS_FSS_TO_B(mp,sectno) ((xfs_fsize_t)(sectno) << (mp)->m_sb.sb_sectlog)
|
509 |
|
|
#define XFS_B_TO_FSST(mp,b) (((__uint64_t)(b)) >> (mp)->m_sb.sb_sectlog)
|
510 |
|
|
|
511 |
|
|
/*
|
512 |
|
|
* File system block to basic block conversions.
|
513 |
|
|
*/
|
514 |
|
|
#define XFS_FSB_TO_BB(mp,fsbno) ((fsbno) << (mp)->m_blkbb_log)
|
515 |
|
|
#define XFS_BB_TO_FSB(mp,bb) \
|
516 |
|
|
(((bb) + (XFS_FSB_TO_BB(mp,1) - 1)) >> (mp)->m_blkbb_log)
|
517 |
|
|
#define XFS_BB_TO_FSBT(mp,bb) ((bb) >> (mp)->m_blkbb_log)
|
518 |
|
|
#define XFS_BB_FSB_OFFSET(mp,bb) ((bb) & ((mp)->m_bsize - 1))
|
519 |
|
|
|
520 |
|
|
/*
|
521 |
|
|
* File system block to byte conversions.
|
522 |
|
|
*/
|
523 |
|
|
#define XFS_FSB_TO_B(mp,fsbno) ((xfs_fsize_t)(fsbno) << (mp)->m_sb.sb_blocklog)
|
524 |
|
|
#define XFS_B_TO_FSB(mp,b) \
|
525 |
|
|
((((__uint64_t)(b)) + (mp)->m_blockmask) >> (mp)->m_sb.sb_blocklog)
|
526 |
|
|
#define XFS_B_TO_FSBT(mp,b) (((__uint64_t)(b)) >> (mp)->m_sb.sb_blocklog)
|
527 |
|
|
#define XFS_B_FSB_OFFSET(mp,b) ((b) & (mp)->m_blockmask)
|
528 |
|
|
|
529 |
|
|
#endif /* __XFS_SB_H__ */
|