• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #ifndef __XFS_AG_H__
19 #define	__XFS_AG_H__
20 
21 /*
22  * Allocation group header
23  * This is divided into three structures, placed in sequential 512-byte
24  * buffers after a copy of the superblock (also in a 512-byte buffer).
25  */
26 
27 struct xfs_buf;
28 struct xfs_mount;
29 struct xfs_trans;
30 
31 #define	XFS_AGF_MAGIC	0x58414746	/* 'XAGF' */
32 #define	XFS_AGI_MAGIC	0x58414749	/* 'XAGI' */
33 #define	XFS_AGFL_MAGIC	0x5841464c	/* 'XAFL' */
34 #define	XFS_AGF_VERSION	1
35 #define	XFS_AGI_VERSION	1
36 
37 #define	XFS_AGF_GOOD_VERSION(v)	((v) == XFS_AGF_VERSION)
38 #define	XFS_AGI_GOOD_VERSION(v)	((v) == XFS_AGI_VERSION)
39 
40 /*
41  * Btree number 0 is bno, 1 is cnt.  This value gives the size of the
42  * arrays below.
43  */
44 #define	XFS_BTNUM_AGF	((int)XFS_BTNUM_CNTi + 1)
45 
46 /*
47  * The second word of agf_levels in the first a.g. overlaps the EFS
48  * superblock's magic number.  Since the magic numbers valid for EFS
49  * are > 64k, our value cannot be confused for an EFS superblock's.
50  */
51 
52 typedef struct xfs_agf {
53 	/*
54 	 * Common allocation group header information
55 	 */
56 	__be32		agf_magicnum;	/* magic number == XFS_AGF_MAGIC */
57 	__be32		agf_versionnum;	/* header version == XFS_AGF_VERSION */
58 	__be32		agf_seqno;	/* sequence # starting from 0 */
59 	__be32		agf_length;	/* size in blocks of a.g. */
60 	/*
61 	 * Freespace information
62 	 */
63 	__be32		agf_roots[XFS_BTNUM_AGF];	/* root blocks */
64 	__be32		agf_spare0;	/* spare field */
65 	__be32		agf_levels[XFS_BTNUM_AGF];	/* btree levels */
66 	__be32		agf_spare1;	/* spare field */
67 
68 	__be32		agf_flfirst;	/* first freelist block's index */
69 	__be32		agf_fllast;	/* last freelist block's index */
70 	__be32		agf_flcount;	/* count of blocks in freelist */
71 	__be32		agf_freeblks;	/* total free blocks */
72 
73 	__be32		agf_longest;	/* longest free space */
74 	__be32		agf_btreeblks;	/* # of blocks held in AGF btrees */
75 	uuid_t		agf_uuid;	/* uuid of filesystem */
76 
77 	/*
78 	 * reserve some contiguous space for future logged fields before we add
79 	 * the unlogged fields. This makes the range logging via flags and
80 	 * structure offsets much simpler.
81 	 */
82 	__be64		agf_spare64[16];
83 
84 	/* unlogged fields, written during buffer writeback. */
85 	__be64		agf_lsn;	/* last write sequence */
86 	__be32		agf_crc;	/* crc of agf sector */
87 	__be32		agf_spare2;
88 
89 	/* structure must be padded to 64 bit alignment */
90 } xfs_agf_t;
91 
92 #define XFS_AGF_CRC_OFF		offsetof(struct xfs_agf, agf_crc)
93 
94 #define	XFS_AGF_MAGICNUM	0x00000001
95 #define	XFS_AGF_VERSIONNUM	0x00000002
96 #define	XFS_AGF_SEQNO		0x00000004
97 #define	XFS_AGF_LENGTH		0x00000008
98 #define	XFS_AGF_ROOTS		0x00000010
99 #define	XFS_AGF_LEVELS		0x00000020
100 #define	XFS_AGF_FLFIRST		0x00000040
101 #define	XFS_AGF_FLLAST		0x00000080
102 #define	XFS_AGF_FLCOUNT		0x00000100
103 #define	XFS_AGF_FREEBLKS	0x00000200
104 #define	XFS_AGF_LONGEST		0x00000400
105 #define	XFS_AGF_BTREEBLKS	0x00000800
106 #define	XFS_AGF_UUID		0x00001000
107 #define	XFS_AGF_NUM_BITS	13
108 #define	XFS_AGF_ALL_BITS	((1 << XFS_AGF_NUM_BITS) - 1)
109 
110 #define XFS_AGF_FLAGS \
111 	{ XFS_AGF_MAGICNUM,	"MAGICNUM" }, \
112 	{ XFS_AGF_VERSIONNUM,	"VERSIONNUM" }, \
113 	{ XFS_AGF_SEQNO,	"SEQNO" }, \
114 	{ XFS_AGF_LENGTH,	"LENGTH" }, \
115 	{ XFS_AGF_ROOTS,	"ROOTS" }, \
116 	{ XFS_AGF_LEVELS,	"LEVELS" }, \
117 	{ XFS_AGF_FLFIRST,	"FLFIRST" }, \
118 	{ XFS_AGF_FLLAST,	"FLLAST" }, \
119 	{ XFS_AGF_FLCOUNT,	"FLCOUNT" }, \
120 	{ XFS_AGF_FREEBLKS,	"FREEBLKS" }, \
121 	{ XFS_AGF_LONGEST,	"LONGEST" }, \
122 	{ XFS_AGF_BTREEBLKS,	"BTREEBLKS" }, \
123 	{ XFS_AGF_UUID,		"UUID" }
124 
125 /* disk block (xfs_daddr_t) in the AG */
126 #define XFS_AGF_DADDR(mp)	((xfs_daddr_t)(1 << (mp)->m_sectbb_log))
127 #define	XFS_AGF_BLOCK(mp)	XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp))
128 #define	XFS_BUF_TO_AGF(bp)	((xfs_agf_t *)((bp)->b_addr))
129 
130 extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp,
131 			xfs_agnumber_t agno, int flags, struct xfs_buf **bpp);
132 
133 /*
134  * Size of the unlinked inode hash table in the agi.
135  */
136 #define	XFS_AGI_UNLINKED_BUCKETS	64
137 
138 typedef struct xfs_agi {
139 	/*
140 	 * Common allocation group header information
141 	 */
142 	__be32		agi_magicnum;	/* magic number == XFS_AGI_MAGIC */
143 	__be32		agi_versionnum;	/* header version == XFS_AGI_VERSION */
144 	__be32		agi_seqno;	/* sequence # starting from 0 */
145 	__be32		agi_length;	/* size in blocks of a.g. */
146 	/*
147 	 * Inode information
148 	 * Inodes are mapped by interpreting the inode number, so no
149 	 * mapping data is needed here.
150 	 */
151 	__be32		agi_count;	/* count of allocated inodes */
152 	__be32		agi_root;	/* root of inode btree */
153 	__be32		agi_level;	/* levels in inode btree */
154 	__be32		agi_freecount;	/* number of free inodes */
155 
156 	__be32		agi_newino;	/* new inode just allocated */
157 	__be32		agi_dirino;	/* last directory inode chunk */
158 	/*
159 	 * Hash table of inodes which have been unlinked but are
160 	 * still being referenced.
161 	 */
162 	__be32		agi_unlinked[XFS_AGI_UNLINKED_BUCKETS];
163 	/*
164 	 * This marks the end of logging region 1 and start of logging region 2.
165 	 */
166 	uuid_t		agi_uuid;	/* uuid of filesystem */
167 	__be32		agi_crc;	/* crc of agi sector */
168 	__be32		agi_pad32;
169 	__be64		agi_lsn;	/* last write sequence */
170 
171 	__be32		agi_free_root; /* root of the free inode btree */
172 	__be32		agi_free_level;/* levels in free inode btree */
173 
174 	/* structure must be padded to 64 bit alignment */
175 } xfs_agi_t;
176 
177 #define XFS_AGI_CRC_OFF		offsetof(struct xfs_agi, agi_crc)
178 
179 #define	XFS_AGI_MAGICNUM	(1 << 0)
180 #define	XFS_AGI_VERSIONNUM	(1 << 1)
181 #define	XFS_AGI_SEQNO		(1 << 2)
182 #define	XFS_AGI_LENGTH		(1 << 3)
183 #define	XFS_AGI_COUNT		(1 << 4)
184 #define	XFS_AGI_ROOT		(1 << 5)
185 #define	XFS_AGI_LEVEL		(1 << 6)
186 #define	XFS_AGI_FREECOUNT	(1 << 7)
187 #define	XFS_AGI_NEWINO		(1 << 8)
188 #define	XFS_AGI_DIRINO		(1 << 9)
189 #define	XFS_AGI_UNLINKED	(1 << 10)
190 #define	XFS_AGI_NUM_BITS_R1	11	/* end of the 1st agi logging region */
191 #define	XFS_AGI_ALL_BITS_R1	((1 << XFS_AGI_NUM_BITS_R1) - 1)
192 #define	XFS_AGI_FREE_ROOT	(1 << 11)
193 #define	XFS_AGI_FREE_LEVEL	(1 << 12)
194 #define	XFS_AGI_NUM_BITS_R2	13
195 
196 /* disk block (xfs_daddr_t) in the AG */
197 #define XFS_AGI_DADDR(mp)	((xfs_daddr_t)(2 << (mp)->m_sectbb_log))
198 #define	XFS_AGI_BLOCK(mp)	XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp))
199 #define	XFS_BUF_TO_AGI(bp)	((xfs_agi_t *)((bp)->b_addr))
200 
201 extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp,
202 				xfs_agnumber_t agno, struct xfs_buf **bpp);
203 
204 /*
205  * The third a.g. block contains the a.g. freelist, an array
206  * of block pointers to blocks owned by the allocation btree code.
207  */
208 #define XFS_AGFL_DADDR(mp)	((xfs_daddr_t)(3 << (mp)->m_sectbb_log))
209 #define	XFS_AGFL_BLOCK(mp)	XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp))
210 #define	XFS_BUF_TO_AGFL(bp)	((xfs_agfl_t *)((bp)->b_addr))
211 
212 #define XFS_BUF_TO_AGFL_BNO(mp, bp) \
213 	(xfs_sb_version_hascrc(&((mp)->m_sb)) ? \
214 		&(XFS_BUF_TO_AGFL(bp)->agfl_bno[0]) : \
215 		(__be32 *)(bp)->b_addr)
216 
217 /*
218  * Size of the AGFL.  For CRC-enabled filesystes we steal a couple of
219  * slots in the beginning of the block for a proper header with the
220  * location information and CRC.
221  */
222 #define XFS_AGFL_SIZE(mp) \
223 	(((mp)->m_sb.sb_sectsize - \
224 	 (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \
225 		sizeof(struct xfs_agfl) : 0)) / \
226 	  sizeof(xfs_agblock_t))
227 
228 typedef struct xfs_agfl {
229 	__be32		agfl_magicnum;
230 	__be32		agfl_seqno;
231 	uuid_t		agfl_uuid;
232 	__be64		agfl_lsn;
233 	__be32		agfl_crc;
234 	__be32		agfl_bno[];	/* actually XFS_AGFL_SIZE(mp) */
235 } xfs_agfl_t;
236 
237 #define XFS_AGFL_CRC_OFF	offsetof(struct xfs_agfl, agfl_crc)
238 
239 /*
240  * tags for inode radix tree
241  */
242 #define XFS_ICI_NO_TAG		(-1)	/* special flag for an untagged lookup
243 					   in xfs_inode_ag_iterator */
244 #define XFS_ICI_RECLAIM_TAG	0	/* inode is to be reclaimed */
245 #define XFS_ICI_EOFBLOCKS_TAG	1	/* inode has blocks beyond EOF */
246 
247 #define	XFS_AG_MAXLEVELS(mp)		((mp)->m_ag_maxlevels)
248 #define	XFS_MIN_FREELIST_RAW(bl,cl,mp)	\
249 	(MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp)))
250 #define	XFS_MIN_FREELIST(a,mp)		\
251 	(XFS_MIN_FREELIST_RAW(		\
252 		be32_to_cpu((a)->agf_levels[XFS_BTNUM_BNOi]), \
253 		be32_to_cpu((a)->agf_levels[XFS_BTNUM_CNTi]), mp))
254 #define	XFS_MIN_FREELIST_PAG(pag,mp)	\
255 	(XFS_MIN_FREELIST_RAW(		\
256 		(unsigned int)(pag)->pagf_levels[XFS_BTNUM_BNOi], \
257 		(unsigned int)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp))
258 
259 #define XFS_AGB_TO_FSB(mp,agno,agbno)	\
260 	(((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno))
261 #define	XFS_FSB_TO_AGNO(mp,fsbno)	\
262 	((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog))
263 #define	XFS_FSB_TO_AGBNO(mp,fsbno)	\
264 	((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog)))
265 #define	XFS_AGB_TO_DADDR(mp,agno,agbno)	\
266 	((xfs_daddr_t)XFS_FSB_TO_BB(mp, \
267 		(xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno)))
268 #define	XFS_AG_DADDR(mp,agno,d)		(XFS_AGB_TO_DADDR(mp, agno, 0) + (d))
269 
270 /*
271  * For checking for bad ranges of xfs_daddr_t's, covering multiple
272  * allocation groups or a single xfs_daddr_t that's a superblock copy.
273  */
274 #define	XFS_AG_CHECK_DADDR(mp,d,len)	\
275 	((len) == 1 ? \
276 	    ASSERT((d) == XFS_SB_DADDR || \
277 		   xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \
278 	    ASSERT(xfs_daddr_to_agno(mp, d) == \
279 		   xfs_daddr_to_agno(mp, (d) + (len) - 1)))
280 
281 #endif	/* __XFS_AG_H__ */
282