3.2. AG Free Space Management
The XFS filesystem tracks free space in an allocation group using two B+trees. One B+tree tracks space by block number, the second by the size of the free space block. This scheme allows XFS to quickly find free space near a given block or of a given size.
3.2.1. AG Free Space Block
The second sector in an AG contains the information about the two free space B+trees and associated free space information for the AG. The "AG Free Space Block", also knows as the AGF, uses the following structure:
typedef struct xfs_agf {
__be32 agf_magicnum;
__be32 agf_versionnum;
__be32 agf_seqno;
__be32 agf_length;
__be32 agf_roots[XFS_BTNUM_AGF];
__be32 agf_spare0;
__be32 agf_levels[XFS_BTNUM_AGF];
__be32 agf_spare1;
__be32 agf_flfirst;
__be32 agf_fllast;
__be32 agf_flcount;
__be32 agf_freeblks;
__be32 agf_longest;
__be32 agf_btreeblks;
} xfs_agf_t;
The rest of the bytes in the sector are zeroed. XFS_BTNUM_AGF
is set to 2, index 0 for the count B+tree and index 1 for the size B+tree.
- agf_magicnum
Specifies the magic number for the AGF sector: "XAGF" (0x58414746).
- agf_versionnum
Set to XFS_AGF_VERSION
which is currently 1.
- agf_seqno
Specifies the AG number for the sector.
- agf_length
Specifies the size of the AG in filesystem blocks. For all AGs except the last, this must be equal to the superblock's sb_agblocks
value. For the last AG, this could be less than the sb_agblocks
value. It is this value that should be used to determine the size of the AG.
- agf_roots
Specifies the block number for the root of the two free space B+trees.
- agf_levels
Specifies the level or depth of the two free space B+trees. For a fresh AG, this will be one, and the "roots" will point to a single leaf of level 0.
- agf_flfirst
Specifies the index of the first "free list" block. Free lists are covered in more detail later on.
- agf_fllast
Specifies the index of the last "free list" block.
- agf_flcount
Specifies the number of blocks in the "free list".
- agf_freeblks
Specifies the current number of free blocks in the AG.
- agf_longest
Specifies the number of blocks of longest contiguous free space in the AG.
- agf_btreeblks
Specifies the number of blocks used for the free space B+trees. This is only used if the XFS_SB_VERSION2_LAZYSBCOUNTBIT
bit is set in sb_features2
.