1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __XFS_AG_H__
19#define __XFS_AG_H__
20
21
22
23
24
25
26
27struct xfs_buf;
28struct xfs_mount;
29struct xfs_trans;
30
31#define XFS_AGF_MAGIC 0x58414746
32#define XFS_AGI_MAGIC 0x58414749
33#define XFS_AGF_VERSION 1
34#define XFS_AGI_VERSION 1
35
36#define XFS_AGF_GOOD_VERSION(v) ((v) == XFS_AGF_VERSION)
37#define XFS_AGI_GOOD_VERSION(v) ((v) == XFS_AGI_VERSION)
38
39
40
41
42
43#define XFS_BTNUM_AGF ((int)XFS_BTNUM_CNTi + 1)
44
45
46
47
48
49
50
51typedef struct xfs_agf {
52
53
54
55 __be32 agf_magicnum;
56 __be32 agf_versionnum;
57 __be32 agf_seqno;
58 __be32 agf_length;
59
60
61
62 __be32 agf_roots[XFS_BTNUM_AGF];
63 __be32 agf_spare0;
64 __be32 agf_levels[XFS_BTNUM_AGF];
65 __be32 agf_spare1;
66 __be32 agf_flfirst;
67 __be32 agf_fllast;
68 __be32 agf_flcount;
69 __be32 agf_freeblks;
70 __be32 agf_longest;
71 __be32 agf_btreeblks;
72} xfs_agf_t;
73
74#define XFS_AGF_MAGICNUM 0x00000001
75#define XFS_AGF_VERSIONNUM 0x00000002
76#define XFS_AGF_SEQNO 0x00000004
77#define XFS_AGF_LENGTH 0x00000008
78#define XFS_AGF_ROOTS 0x00000010
79#define XFS_AGF_LEVELS 0x00000020
80#define XFS_AGF_FLFIRST 0x00000040
81#define XFS_AGF_FLLAST 0x00000080
82#define XFS_AGF_FLCOUNT 0x00000100
83#define XFS_AGF_FREEBLKS 0x00000200
84#define XFS_AGF_LONGEST 0x00000400
85#define XFS_AGF_BTREEBLKS 0x00000800
86#define XFS_AGF_NUM_BITS 12
87#define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1)
88
89#define XFS_AGF_FLAGS \
90 { XFS_AGF_MAGICNUM, "MAGICNUM" }, \
91 { XFS_AGF_VERSIONNUM, "VERSIONNUM" }, \
92 { XFS_AGF_SEQNO, "SEQNO" }, \
93 { XFS_AGF_LENGTH, "LENGTH" }, \
94 { XFS_AGF_ROOTS, "ROOTS" }, \
95 { XFS_AGF_LEVELS, "LEVELS" }, \
96 { XFS_AGF_FLFIRST, "FLFIRST" }, \
97 { XFS_AGF_FLLAST, "FLLAST" }, \
98 { XFS_AGF_FLCOUNT, "FLCOUNT" }, \
99 { XFS_AGF_FREEBLKS, "FREEBLKS" }, \
100 { XFS_AGF_LONGEST, "LONGEST" }, \
101 { XFS_AGF_BTREEBLKS, "BTREEBLKS" }
102
103
104#define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log))
105#define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp))
106#define XFS_BUF_TO_AGF(bp) ((xfs_agf_t *)((bp)->b_addr))
107
108extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp,
109 xfs_agnumber_t agno, int flags, struct xfs_buf **bpp);
110
111
112
113
114#define XFS_AGI_UNLINKED_BUCKETS 64
115
116typedef struct xfs_agi {
117
118
119
120 __be32 agi_magicnum;
121 __be32 agi_versionnum;
122 __be32 agi_seqno;
123 __be32 agi_length;
124
125
126
127
128
129 __be32 agi_count;
130 __be32 agi_root;
131 __be32 agi_level;
132 __be32 agi_freecount;
133 __be32 agi_newino;
134 __be32 agi_dirino;
135
136
137
138
139 __be32 agi_unlinked[XFS_AGI_UNLINKED_BUCKETS];
140} xfs_agi_t;
141
142#define XFS_AGI_MAGICNUM 0x00000001
143#define XFS_AGI_VERSIONNUM 0x00000002
144#define XFS_AGI_SEQNO 0x00000004
145#define XFS_AGI_LENGTH 0x00000008
146#define XFS_AGI_COUNT 0x00000010
147#define XFS_AGI_ROOT 0x00000020
148#define XFS_AGI_LEVEL 0x00000040
149#define XFS_AGI_FREECOUNT 0x00000080
150#define XFS_AGI_NEWINO 0x00000100
151#define XFS_AGI_DIRINO 0x00000200
152#define XFS_AGI_UNLINKED 0x00000400
153#define XFS_AGI_NUM_BITS 11
154#define XFS_AGI_ALL_BITS ((1 << XFS_AGI_NUM_BITS) - 1)
155
156
157#define XFS_AGI_DADDR(mp) ((xfs_daddr_t)(2 << (mp)->m_sectbb_log))
158#define XFS_AGI_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp))
159#define XFS_BUF_TO_AGI(bp) ((xfs_agi_t *)((bp)->b_addr))
160
161extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp,
162 xfs_agnumber_t agno, struct xfs_buf **bpp);
163
164
165
166
167
168#define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log))
169#define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp))
170#define XFS_AGFL_SIZE(mp) ((mp)->m_sb.sb_sectsize / sizeof(xfs_agblock_t))
171#define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)((bp)->b_addr))
172
173typedef struct xfs_agfl {
174 __be32 agfl_bno[1];
175} xfs_agfl_t;
176
177
178
179
180
181
182
183
184struct xfs_busy_extent {
185 struct rb_node rb_node;
186 struct list_head list;
187 xfs_agnumber_t agno;
188 xfs_agblock_t bno;
189 xfs_extlen_t length;
190 unsigned int flags;
191#define XFS_ALLOC_BUSY_DISCARDED 0x01
192#define XFS_ALLOC_BUSY_SKIP_DISCARD 0x02
193};
194
195
196
197
198
199#define XFS_PAGB_NUM_SLOTS 128
200
201typedef struct xfs_perag {
202 struct xfs_mount *pag_mount;
203 xfs_agnumber_t pag_agno;
204 atomic_t pag_ref;
205 char pagf_init;
206 char pagi_init;
207 char pagf_metadata;
208 char pagi_inodeok;
209 __uint8_t pagf_levels[XFS_BTNUM_AGF];
210
211 __uint32_t pagf_flcount;
212 xfs_extlen_t pagf_freeblks;
213 xfs_extlen_t pagf_longest;
214 __uint32_t pagf_btreeblks;
215 xfs_agino_t pagi_freecount;
216 xfs_agino_t pagi_count;
217
218
219
220
221
222
223 xfs_agino_t pagl_pagino;
224 xfs_agino_t pagl_leftrec;
225 xfs_agino_t pagl_rightrec;
226#ifdef __KERNEL__
227 spinlock_t pagb_lock;
228 struct rb_root pagb_tree;
229
230 atomic_t pagf_fstrms;
231
232 spinlock_t pag_ici_lock;
233 struct radix_tree_root pag_ici_root;
234 int pag_ici_reclaimable;
235 struct mutex pag_ici_reclaim_lock;
236 unsigned long pag_ici_reclaim_cursor;
237
238
239 spinlock_t pag_buf_lock;
240 struct rb_root pag_buf_tree;
241
242
243 struct rcu_head rcu_head;
244#endif
245 int pagb_count;
246} xfs_perag_t;
247
248
249
250
251#define XFS_ICI_NO_TAG (-1)
252
253#define XFS_ICI_RECLAIM_TAG 0
254
255#define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels)
256#define XFS_MIN_FREELIST_RAW(bl,cl,mp) \
257 (MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp)))
258#define XFS_MIN_FREELIST(a,mp) \
259 (XFS_MIN_FREELIST_RAW( \
260 be32_to_cpu((a)->agf_levels[XFS_BTNUM_BNOi]), \
261 be32_to_cpu((a)->agf_levels[XFS_BTNUM_CNTi]), mp))
262#define XFS_MIN_FREELIST_PAG(pag,mp) \
263 (XFS_MIN_FREELIST_RAW( \
264 (unsigned int)(pag)->pagf_levels[XFS_BTNUM_BNOi], \
265 (unsigned int)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp))
266
267#define XFS_AGB_TO_FSB(mp,agno,agbno) \
268 (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno))
269#define XFS_FSB_TO_AGNO(mp,fsbno) \
270 ((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog))
271#define XFS_FSB_TO_AGBNO(mp,fsbno) \
272 ((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog)))
273#define XFS_AGB_TO_DADDR(mp,agno,agbno) \
274 ((xfs_daddr_t)XFS_FSB_TO_BB(mp, \
275 (xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno)))
276#define XFS_AG_DADDR(mp,agno,d) (XFS_AGB_TO_DADDR(mp, agno, 0) + (d))
277
278
279
280
281
282#define XFS_AG_CHECK_DADDR(mp,d,len) \
283 ((len) == 1 ? \
284 ASSERT((d) == XFS_SB_DADDR || \
285 xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \
286 ASSERT(xfs_daddr_to_agno(mp, d) == \
287 xfs_daddr_to_agno(mp, (d) + (len) - 1)))
288
289#endif
290