• 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_MAGICNUM	0x00000001
93 #define	XFS_AGF_VERSIONNUM	0x00000002
94 #define	XFS_AGF_SEQNO		0x00000004
95 #define	XFS_AGF_LENGTH		0x00000008
96 #define	XFS_AGF_ROOTS		0x00000010
97 #define	XFS_AGF_LEVELS		0x00000020
98 #define	XFS_AGF_FLFIRST		0x00000040
99 #define	XFS_AGF_FLLAST		0x00000080
100 #define	XFS_AGF_FLCOUNT		0x00000100
101 #define	XFS_AGF_FREEBLKS	0x00000200
102 #define	XFS_AGF_LONGEST		0x00000400
103 #define	XFS_AGF_BTREEBLKS	0x00000800
104 #define	XFS_AGF_UUID		0x00001000
105 #define	XFS_AGF_NUM_BITS	13
106 #define	XFS_AGF_ALL_BITS	((1 << XFS_AGF_NUM_BITS) - 1)
107 
108 #define XFS_AGF_FLAGS \
109 	{ XFS_AGF_MAGICNUM,	"MAGICNUM" }, \
110 	{ XFS_AGF_VERSIONNUM,	"VERSIONNUM" }, \
111 	{ XFS_AGF_SEQNO,	"SEQNO" }, \
112 	{ XFS_AGF_LENGTH,	"LENGTH" }, \
113 	{ XFS_AGF_ROOTS,	"ROOTS" }, \
114 	{ XFS_AGF_LEVELS,	"LEVELS" }, \
115 	{ XFS_AGF_FLFIRST,	"FLFIRST" }, \
116 	{ XFS_AGF_FLLAST,	"FLLAST" }, \
117 	{ XFS_AGF_FLCOUNT,	"FLCOUNT" }, \
118 	{ XFS_AGF_FREEBLKS,	"FREEBLKS" }, \
119 	{ XFS_AGF_LONGEST,	"LONGEST" }, \
120 	{ XFS_AGF_BTREEBLKS,	"BTREEBLKS" }, \
121 	{ XFS_AGF_UUID,		"UUID" }
122 
123 /* disk block (xfs_daddr_t) in the AG */
124 #define XFS_AGF_DADDR(mp)	((xfs_daddr_t)(1 << (mp)->m_sectbb_log))
125 #define	XFS_AGF_BLOCK(mp)	XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp))
126 #define	XFS_BUF_TO_AGF(bp)	((xfs_agf_t *)((bp)->b_addr))
127 
128 extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp,
129 			xfs_agnumber_t agno, int flags, struct xfs_buf **bpp);
130 
131 extern const struct xfs_buf_ops xfs_agf_buf_ops;
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 	uuid_t		agi_uuid;	/* uuid of filesystem */
165 	__be32		agi_crc;	/* crc of agi sector */
166 	__be32		agi_pad32;
167 	__be64		agi_lsn;	/* last write sequence */
168 
169 	/* structure must be padded to 64 bit alignment */
170 } xfs_agi_t;
171 
172 #define	XFS_AGI_MAGICNUM	0x00000001
173 #define	XFS_AGI_VERSIONNUM	0x00000002
174 #define	XFS_AGI_SEQNO		0x00000004
175 #define	XFS_AGI_LENGTH		0x00000008
176 #define	XFS_AGI_COUNT		0x00000010
177 #define	XFS_AGI_ROOT		0x00000020
178 #define	XFS_AGI_LEVEL		0x00000040
179 #define	XFS_AGI_FREECOUNT	0x00000080
180 #define	XFS_AGI_NEWINO		0x00000100
181 #define	XFS_AGI_DIRINO		0x00000200
182 #define	XFS_AGI_UNLINKED	0x00000400
183 #define	XFS_AGI_NUM_BITS	11
184 #define	XFS_AGI_ALL_BITS	((1 << XFS_AGI_NUM_BITS) - 1)
185 
186 /* disk block (xfs_daddr_t) in the AG */
187 #define XFS_AGI_DADDR(mp)	((xfs_daddr_t)(2 << (mp)->m_sectbb_log))
188 #define	XFS_AGI_BLOCK(mp)	XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp))
189 #define	XFS_BUF_TO_AGI(bp)	((xfs_agi_t *)((bp)->b_addr))
190 
191 extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp,
192 				xfs_agnumber_t agno, struct xfs_buf **bpp);
193 
194 extern const struct xfs_buf_ops xfs_agi_buf_ops;
195 
196 /*
197  * The third a.g. block contains the a.g. freelist, an array
198  * of block pointers to blocks owned by the allocation btree code.
199  */
200 #define XFS_AGFL_DADDR(mp)	((xfs_daddr_t)(3 << (mp)->m_sectbb_log))
201 #define	XFS_AGFL_BLOCK(mp)	XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp))
202 #define	XFS_BUF_TO_AGFL(bp)	((xfs_agfl_t *)((bp)->b_addr))
203 
204 #define XFS_BUF_TO_AGFL_BNO(mp, bp) \
205 	(xfs_sb_version_hascrc(&((mp)->m_sb)) ? \
206 		&(XFS_BUF_TO_AGFL(bp)->agfl_bno[0]) : \
207 		(__be32 *)(bp)->b_addr)
208 
209 /*
210  * Size of the AGFL.  For CRC-enabled filesystes we steal a couple of
211  * slots in the beginning of the block for a proper header with the
212  * location information and CRC.
213  */
214 #define XFS_AGFL_SIZE(mp) \
215 	(((mp)->m_sb.sb_sectsize - \
216 	 (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \
217 		sizeof(struct xfs_agfl) : 0)) / \
218 	  sizeof(xfs_agblock_t))
219 
220 typedef struct xfs_agfl {
221 	__be32		agfl_magicnum;
222 	__be32		agfl_seqno;
223 	uuid_t		agfl_uuid;
224 	__be64		agfl_lsn;
225 	__be32		agfl_crc;
226 	__be32		agfl_bno[];	/* actually XFS_AGFL_SIZE(mp) */
227 } xfs_agfl_t;
228 
229 /*
230  * Per-ag incore structure, copies of information in agf and agi,
231  * to improve the performance of allocation group selection.
232  */
233 #define XFS_PAGB_NUM_SLOTS	128
234 
235 typedef struct xfs_perag {
236 	struct xfs_mount *pag_mount;	/* owner filesystem */
237 	xfs_agnumber_t	pag_agno;	/* AG this structure belongs to */
238 	atomic_t	pag_ref;	/* perag reference count */
239 	char		pagf_init;	/* this agf's entry is initialized */
240 	char		pagi_init;	/* this agi's entry is initialized */
241 	char		pagf_metadata;	/* the agf is preferred to be metadata */
242 	char		pagi_inodeok;	/* The agi is ok for inodes */
243 	__uint8_t	pagf_levels[XFS_BTNUM_AGF];
244 					/* # of levels in bno & cnt btree */
245 	__uint32_t	pagf_flcount;	/* count of blocks in freelist */
246 	xfs_extlen_t	pagf_freeblks;	/* total free blocks */
247 	xfs_extlen_t	pagf_longest;	/* longest free space */
248 	__uint32_t	pagf_btreeblks;	/* # of blocks held in AGF btrees */
249 	xfs_agino_t	pagi_freecount;	/* number of free inodes */
250 	xfs_agino_t	pagi_count;	/* number of allocated inodes */
251 
252 	/*
253 	 * Inode allocation search lookup optimisation.
254 	 * If the pagino matches, the search for new inodes
255 	 * doesn't need to search the near ones again straight away
256 	 */
257 	xfs_agino_t	pagl_pagino;
258 	xfs_agino_t	pagl_leftrec;
259 	xfs_agino_t	pagl_rightrec;
260 #ifdef __KERNEL__
261 	spinlock_t	pagb_lock;	/* lock for pagb_tree */
262 	struct rb_root	pagb_tree;	/* ordered tree of busy extents */
263 
264 	atomic_t        pagf_fstrms;    /* # of filestreams active in this AG */
265 
266 	spinlock_t	pag_ici_lock;	/* incore inode cache lock */
267 	struct radix_tree_root pag_ici_root;	/* incore inode cache root */
268 	int		pag_ici_reclaimable;	/* reclaimable inodes */
269 	struct mutex	pag_ici_reclaim_lock;	/* serialisation point */
270 	unsigned long	pag_ici_reclaim_cursor;	/* reclaim restart point */
271 
272 	/* buffer cache index */
273 	spinlock_t	pag_buf_lock;	/* lock for pag_buf_tree */
274 	struct rb_root	pag_buf_tree;	/* ordered tree of active buffers */
275 
276 	/* for rcu-safe freeing */
277 	struct rcu_head	rcu_head;
278 #endif
279 	int		pagb_count;	/* pagb slots in use */
280 } xfs_perag_t;
281 
282 /*
283  * tags for inode radix tree
284  */
285 #define XFS_ICI_NO_TAG		(-1)	/* special flag for an untagged lookup
286 					   in xfs_inode_ag_iterator */
287 #define XFS_ICI_RECLAIM_TAG	0	/* inode is to be reclaimed */
288 #define XFS_ICI_EOFBLOCKS_TAG	1	/* inode has blocks beyond EOF */
289 
290 #define	XFS_AG_MAXLEVELS(mp)		((mp)->m_ag_maxlevels)
291 #define	XFS_MIN_FREELIST_RAW(bl,cl,mp)	\
292 	(MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp)))
293 #define	XFS_MIN_FREELIST(a,mp)		\
294 	(XFS_MIN_FREELIST_RAW(		\
295 		be32_to_cpu((a)->agf_levels[XFS_BTNUM_BNOi]), \
296 		be32_to_cpu((a)->agf_levels[XFS_BTNUM_CNTi]), mp))
297 #define	XFS_MIN_FREELIST_PAG(pag,mp)	\
298 	(XFS_MIN_FREELIST_RAW(		\
299 		(unsigned int)(pag)->pagf_levels[XFS_BTNUM_BNOi], \
300 		(unsigned int)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp))
301 
302 #define XFS_AGB_TO_FSB(mp,agno,agbno)	\
303 	(((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno))
304 #define	XFS_FSB_TO_AGNO(mp,fsbno)	\
305 	((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog))
306 #define	XFS_FSB_TO_AGBNO(mp,fsbno)	\
307 	((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog)))
308 #define	XFS_AGB_TO_DADDR(mp,agno,agbno)	\
309 	((xfs_daddr_t)XFS_FSB_TO_BB(mp, \
310 		(xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno)))
311 #define	XFS_AG_DADDR(mp,agno,d)		(XFS_AGB_TO_DADDR(mp, agno, 0) + (d))
312 
313 /*
314  * For checking for bad ranges of xfs_daddr_t's, covering multiple
315  * allocation groups or a single xfs_daddr_t that's a superblock copy.
316  */
317 #define	XFS_AG_CHECK_DADDR(mp,d,len)	\
318 	((len) == 1 ? \
319 	    ASSERT((d) == XFS_SB_DADDR || \
320 		   xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \
321 	    ASSERT(xfs_daddr_to_agno(mp, d) == \
322 		   xfs_daddr_to_agno(mp, (d) + (len) - 1)))
323 
324 #endif	/* __XFS_AG_H__ */
325