| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
| Nathan Scott | 7b71876 | 2005-11-02 14:58:39 +1100 | [diff] [blame] | 2 | * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. | 
|  | 3 | * All Rights Reserved. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 4 | * | 
| Nathan Scott | 7b71876 | 2005-11-02 14:58:39 +1100 | [diff] [blame] | 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 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 7 | * published by the Free Software Foundation. | 
|  | 8 | * | 
| Nathan Scott | 7b71876 | 2005-11-02 14:58:39 +1100 | [diff] [blame] | 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. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 13 | * | 
| Nathan Scott | 7b71876 | 2005-11-02 14:58:39 +1100 | [diff] [blame] | 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 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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_AGF_VERSION	1 | 
|  | 34 | #define	XFS_AGI_VERSION	1 | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 35 |  | 
|  | 36 | #define	XFS_AGF_GOOD_VERSION(v)	((v) == XFS_AGF_VERSION) | 
|  | 37 | #define	XFS_AGI_GOOD_VERSION(v)	((v) == XFS_AGI_VERSION) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 38 |  | 
|  | 39 | /* | 
|  | 40 | * Btree number 0 is bno, 1 is cnt.  This value gives the size of the | 
|  | 41 | * arrays below. | 
|  | 42 | */ | 
|  | 43 | #define	XFS_BTNUM_AGF	((int)XFS_BTNUM_CNTi + 1) | 
|  | 44 |  | 
|  | 45 | /* | 
|  | 46 | * The second word of agf_levels in the first a.g. overlaps the EFS | 
|  | 47 | * superblock's magic number.  Since the magic numbers valid for EFS | 
|  | 48 | * are > 64k, our value cannot be confused for an EFS superblock's. | 
|  | 49 | */ | 
|  | 50 |  | 
| Christoph Hellwig | 16259e7 | 2005-11-02 15:11:25 +1100 | [diff] [blame] | 51 | typedef struct xfs_agf { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 52 | /* | 
|  | 53 | * Common allocation group header information | 
|  | 54 | */ | 
| Christoph Hellwig | 16259e7 | 2005-11-02 15:11:25 +1100 | [diff] [blame] | 55 | __be32		agf_magicnum;	/* magic number == XFS_AGF_MAGIC */ | 
|  | 56 | __be32		agf_versionnum;	/* header version == XFS_AGF_VERSION */ | 
|  | 57 | __be32		agf_seqno;	/* sequence # starting from 0 */ | 
|  | 58 | __be32		agf_length;	/* size in blocks of a.g. */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 59 | /* | 
|  | 60 | * Freespace information | 
|  | 61 | */ | 
| Christoph Hellwig | 16259e7 | 2005-11-02 15:11:25 +1100 | [diff] [blame] | 62 | __be32		agf_roots[XFS_BTNUM_AGF];	/* root blocks */ | 
|  | 63 | __be32		agf_spare0;	/* spare field */ | 
|  | 64 | __be32		agf_levels[XFS_BTNUM_AGF];	/* btree levels */ | 
|  | 65 | __be32		agf_spare1;	/* spare field */ | 
|  | 66 | __be32		agf_flfirst;	/* first freelist block's index */ | 
|  | 67 | __be32		agf_fllast;	/* last freelist block's index */ | 
|  | 68 | __be32		agf_flcount;	/* count of blocks in freelist */ | 
|  | 69 | __be32		agf_freeblks;	/* total free blocks */ | 
|  | 70 | __be32		agf_longest;	/* longest free space */ | 
| David Chinner | 92821e2 | 2007-05-24 15:26:31 +1000 | [diff] [blame] | 71 | __be32		agf_btreeblks;	/* # of blocks held in AGF btrees */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | 
| David Chinner | 92821e2 | 2007-05-24 15:26:31 +1000 | [diff] [blame] | 85 | #define	XFS_AGF_BTREEBLKS	0x00000800 | 
|  | 86 | #define	XFS_AGF_NUM_BITS	12 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 87 | #define	XFS_AGF_ALL_BITS	((1 << XFS_AGF_NUM_BITS) - 1) | 
|  | 88 |  | 
| Christoph Hellwig | 0b1b213 | 2009-12-14 23:14:59 +0000 | [diff] [blame] | 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 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 103 | /* disk block (xfs_daddr_t) in the AG */ | 
|  | 104 | #define XFS_AGF_DADDR(mp)	((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 105 | #define	XFS_AGF_BLOCK(mp)	XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp)) | 
|  | 106 | #define	XFS_BUF_TO_AGF(bp)	((xfs_agf_t *)XFS_BUF_PTR(bp)) | 
|  | 107 |  | 
| Eric Sandeen | fef1111 | 2009-07-02 21:35:43 -0500 | [diff] [blame] | 108 | extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, | 
|  | 109 | xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); | 
|  | 110 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 111 | /* | 
|  | 112 | * Size of the unlinked inode hash table in the agi. | 
|  | 113 | */ | 
|  | 114 | #define	XFS_AGI_UNLINKED_BUCKETS	64 | 
|  | 115 |  | 
| Christoph Hellwig | 16259e7 | 2005-11-02 15:11:25 +1100 | [diff] [blame] | 116 | typedef struct xfs_agi { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 117 | /* | 
|  | 118 | * Common allocation group header information | 
|  | 119 | */ | 
| Christoph Hellwig | 16259e7 | 2005-11-02 15:11:25 +1100 | [diff] [blame] | 120 | __be32		agi_magicnum;	/* magic number == XFS_AGI_MAGIC */ | 
|  | 121 | __be32		agi_versionnum;	/* header version == XFS_AGI_VERSION */ | 
|  | 122 | __be32		agi_seqno;	/* sequence # starting from 0 */ | 
|  | 123 | __be32		agi_length;	/* size in blocks of a.g. */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 124 | /* | 
|  | 125 | * Inode information | 
|  | 126 | * Inodes are mapped by interpreting the inode number, so no | 
|  | 127 | * mapping data is needed here. | 
|  | 128 | */ | 
| Christoph Hellwig | 16259e7 | 2005-11-02 15:11:25 +1100 | [diff] [blame] | 129 | __be32		agi_count;	/* count of allocated inodes */ | 
|  | 130 | __be32		agi_root;	/* root of inode btree */ | 
|  | 131 | __be32		agi_level;	/* levels in inode btree */ | 
|  | 132 | __be32		agi_freecount;	/* number of free inodes */ | 
|  | 133 | __be32		agi_newino;	/* new inode just allocated */ | 
|  | 134 | __be32		agi_dirino;	/* last directory inode chunk */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 135 | /* | 
|  | 136 | * Hash table of inodes which have been unlinked but are | 
|  | 137 | * still being referenced. | 
|  | 138 | */ | 
| Christoph Hellwig | 16259e7 | 2005-11-02 15:11:25 +1100 | [diff] [blame] | 139 | __be32		agi_unlinked[XFS_AGI_UNLINKED_BUCKETS]; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | /* disk block (xfs_daddr_t) in the AG */ | 
|  | 157 | #define XFS_AGI_DADDR(mp)	((xfs_daddr_t)(2 << (mp)->m_sectbb_log)) | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 158 | #define	XFS_AGI_BLOCK(mp)	XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp)) | 
|  | 159 | #define	XFS_BUF_TO_AGI(bp)	((xfs_agi_t *)XFS_BUF_PTR(bp)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 160 |  | 
| Christoph Hellwig | 5e1be0f | 2008-11-28 14:23:37 +1100 | [diff] [blame] | 161 | extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, | 
|  | 162 | xfs_agnumber_t agno, struct xfs_buf **bpp); | 
|  | 163 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 164 | /* | 
|  | 165 | * The third a.g. block contains the a.g. freelist, an array | 
|  | 166 | * of block pointers to blocks owned by the allocation btree code. | 
|  | 167 | */ | 
|  | 168 | #define XFS_AGFL_DADDR(mp)	((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 169 | #define	XFS_AGFL_BLOCK(mp)	XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 170 | #define XFS_AGFL_SIZE(mp)	((mp)->m_sb.sb_sectsize / sizeof(xfs_agblock_t)) | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 171 | #define	XFS_BUF_TO_AGFL(bp)	((xfs_agfl_t *)XFS_BUF_PTR(bp)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 172 |  | 
|  | 173 | typedef struct xfs_agfl { | 
| Christoph Hellwig | e210100 | 2006-09-28 10:56:51 +1000 | [diff] [blame] | 174 | __be32		agfl_bno[1];	/* actually XFS_AGFL_SIZE(mp) */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 175 | } xfs_agfl_t; | 
|  | 176 |  | 
|  | 177 | /* | 
| Dave Chinner | ed3b4d6 | 2010-05-21 12:07:08 +1000 | [diff] [blame] | 178 | * Busy block/extent entry.  Indexed by a rbtree in perag to mark blocks that | 
|  | 179 | * have been freed but whose transactions aren't committed to disk yet. | 
|  | 180 | * | 
|  | 181 | * Note that we use the transaction ID to record the transaction, not the | 
|  | 182 | * transaction structure itself. See xfs_alloc_busy_insert() for details. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 183 | */ | 
| Dave Chinner | ed3b4d6 | 2010-05-21 12:07:08 +1000 | [diff] [blame] | 184 | struct xfs_busy_extent { | 
|  | 185 | struct rb_node	rb_node;	/* ag by-bno indexed search tree */ | 
|  | 186 | struct list_head list;		/* transaction busy extent list */ | 
|  | 187 | xfs_agnumber_t	agno; | 
|  | 188 | xfs_agblock_t	bno; | 
|  | 189 | xfs_extlen_t	length; | 
|  | 190 | xlog_tid_t	tid;		/* transaction that created this */ | 
|  | 191 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 192 |  | 
|  | 193 | /* | 
|  | 194 | * Per-ag incore structure, copies of information in agf and agi, | 
|  | 195 | * to improve the performance of allocation group selection. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 196 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 197 | #define XFS_PAGB_NUM_SLOTS	128 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 198 |  | 
| Dave Chinner | aed3bb9 | 2010-01-11 11:47:45 +0000 | [diff] [blame] | 199 | typedef struct xfs_perag { | 
| Dave Chinner | 0fa800f | 2010-01-11 11:47:46 +0000 | [diff] [blame] | 200 | struct xfs_mount *pag_mount;	/* owner filesystem */ | 
|  | 201 | xfs_agnumber_t	pag_agno;	/* AG this structure belongs to */ | 
| Dave Chinner | aed3bb9 | 2010-01-11 11:47:45 +0000 | [diff] [blame] | 202 | atomic_t	pag_ref;	/* perag reference count */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 203 | char		pagf_init;	/* this agf's entry is initialized */ | 
|  | 204 | char		pagi_init;	/* this agi's entry is initialized */ | 
| Nathan Scott | c41564b | 2006-03-29 08:55:14 +1000 | [diff] [blame] | 205 | char		pagf_metadata;	/* the agf is preferred to be metadata */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 206 | char		pagi_inodeok;	/* The agi is ok for inodes */ | 
|  | 207 | __uint8_t	pagf_levels[XFS_BTNUM_AGF]; | 
|  | 208 | /* # of levels in bno & cnt btree */ | 
|  | 209 | __uint32_t	pagf_flcount;	/* count of blocks in freelist */ | 
|  | 210 | xfs_extlen_t	pagf_freeblks;	/* total free blocks */ | 
|  | 211 | xfs_extlen_t	pagf_longest;	/* longest free space */ | 
| David Chinner | 92821e2 | 2007-05-24 15:26:31 +1000 | [diff] [blame] | 212 | __uint32_t	pagf_btreeblks;	/* # of blocks held in AGF btrees */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 213 | xfs_agino_t	pagi_freecount;	/* number of free inodes */ | 
| David Chinner | 92821e2 | 2007-05-24 15:26:31 +1000 | [diff] [blame] | 214 | xfs_agino_t	pagi_count;	/* number of allocated inodes */ | 
| Dave Chinner | bd16956 | 2009-08-31 20:58:28 -0300 | [diff] [blame] | 215 |  | 
|  | 216 | /* | 
|  | 217 | * Inode allocation search lookup optimisation. | 
|  | 218 | * If the pagino matches, the search for new inodes | 
|  | 219 | * doesn't need to search the near ones again straight away | 
|  | 220 | */ | 
|  | 221 | xfs_agino_t	pagl_pagino; | 
|  | 222 | xfs_agino_t	pagl_leftrec; | 
|  | 223 | xfs_agino_t	pagl_rightrec; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 224 | #ifdef __KERNEL__ | 
| Dave Chinner | ed3b4d6 | 2010-05-21 12:07:08 +1000 | [diff] [blame] | 225 | spinlock_t	pagb_lock;	/* lock for pagb_tree */ | 
|  | 226 | struct rb_root	pagb_tree;	/* ordered tree of busy extents */ | 
| Barry Naujok | 847fff5 | 2008-10-30 17:05:38 +1100 | [diff] [blame] | 227 |  | 
| David Chinner | 2a82b8b | 2007-07-11 11:09:12 +1000 | [diff] [blame] | 228 | atomic_t        pagf_fstrms;    /* # of filestreams active in this AG */ | 
| David Chinner | da353b0 | 2007-08-28 14:00:13 +1000 | [diff] [blame] | 229 |  | 
| David Chinner | da353b0 | 2007-08-28 14:00:13 +1000 | [diff] [blame] | 230 | rwlock_t	pag_ici_lock;	/* incore inode lock */ | 
|  | 231 | struct radix_tree_root pag_ici_root;	/* incore inode cache root */ | 
| Dave Chinner | 9bf729c | 2010-04-29 09:55:50 +1000 | [diff] [blame] | 232 | int		pag_ici_reclaimable;	/* reclaimable inodes */ | 
| Barry Naujok | 847fff5 | 2008-10-30 17:05:38 +1100 | [diff] [blame] | 233 | #endif | 
| Dave Chinner | e57336f | 2010-01-11 11:47:49 +0000 | [diff] [blame] | 234 | int		pagb_count;	/* pagb slots in use */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 235 | } xfs_perag_t; | 
|  | 236 |  | 
| David Chinner | 396beb8 | 2008-10-30 17:37:26 +1100 | [diff] [blame] | 237 | /* | 
|  | 238 | * tags for inode radix tree | 
|  | 239 | */ | 
| Dave Chinner | 75f3cb1 | 2009-06-08 15:35:14 +0200 | [diff] [blame] | 240 | #define XFS_ICI_NO_TAG		(-1)	/* special flag for an untagged lookup | 
|  | 241 | in xfs_inode_ag_iterator */ | 
| David Chinner | 396beb8 | 2008-10-30 17:37:26 +1100 | [diff] [blame] | 242 | #define XFS_ICI_RECLAIM_TAG	0	/* inode is to be reclaimed */ | 
|  | 243 |  | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 244 | #define	XFS_AG_MAXLEVELS(mp)		((mp)->m_ag_maxlevels) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 245 | #define	XFS_MIN_FREELIST_RAW(bl,cl,mp)	\ | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 246 | (MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp))) | 
|  | 247 | #define	XFS_MIN_FREELIST(a,mp)		\ | 
|  | 248 | (XFS_MIN_FREELIST_RAW(		\ | 
| Christoph Hellwig | 16259e7 | 2005-11-02 15:11:25 +1100 | [diff] [blame] | 249 | be32_to_cpu((a)->agf_levels[XFS_BTNUM_BNOi]), \ | 
|  | 250 | be32_to_cpu((a)->agf_levels[XFS_BTNUM_CNTi]), mp)) | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 251 | #define	XFS_MIN_FREELIST_PAG(pag,mp)	\ | 
|  | 252 | (XFS_MIN_FREELIST_RAW(		\ | 
| Christoph Hellwig | a568778 | 2009-02-09 08:37:39 +0100 | [diff] [blame] | 253 | (unsigned int)(pag)->pagf_levels[XFS_BTNUM_BNOi], \ | 
|  | 254 | (unsigned int)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 255 |  | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 256 | #define XFS_AGB_TO_FSB(mp,agno,agbno)	\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 257 | (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno)) | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 258 | #define	XFS_FSB_TO_AGNO(mp,fsbno)	\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 259 | ((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog)) | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 260 | #define	XFS_FSB_TO_AGBNO(mp,fsbno)	\ | 
| Eric Sandeen | fb82557 | 2009-01-09 15:53:54 +1100 | [diff] [blame] | 261 | ((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog))) | 
| Nathan Scott | a844f45 | 2005-11-02 14:38:42 +1100 | [diff] [blame] | 262 | #define	XFS_AGB_TO_DADDR(mp,agno,agbno)	\ | 
|  | 263 | ((xfs_daddr_t)XFS_FSB_TO_BB(mp, \ | 
|  | 264 | (xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno))) | 
|  | 265 | #define	XFS_AG_DADDR(mp,agno,d)		(XFS_AGB_TO_DADDR(mp, agno, 0) + (d)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 266 |  | 
|  | 267 | /* | 
|  | 268 | * For checking for bad ranges of xfs_daddr_t's, covering multiple | 
|  | 269 | * allocation groups or a single xfs_daddr_t that's a superblock copy. | 
|  | 270 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 271 | #define	XFS_AG_CHECK_DADDR(mp,d,len)	\ | 
|  | 272 | ((len) == 1 ? \ | 
|  | 273 | ASSERT((d) == XFS_SB_DADDR || \ | 
| Eric Sandeen | 9d87c31 | 2009-01-14 23:22:07 -0600 | [diff] [blame] | 274 | xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \ | 
|  | 275 | ASSERT(xfs_daddr_to_agno(mp, d) == \ | 
|  | 276 | xfs_daddr_to_agno(mp, (d) + (len) - 1))) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 277 |  | 
|  | 278 | #endif	/* __XFS_AG_H__ */ |