xref: /linux/fs/xfs/libxfs/xfs_zones.h (revision 6f7e6393d1ce636bb7ec77a7fe7b77458fddf701)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LIBXFS_ZONES_H
3 #define _LIBXFS_ZONES_H
4 
5 struct xfs_rtgroup;
6 struct blk_zone;
7 
8 /*
9  * In order to guarantee forward progress for GC we need to reserve at least
10  * two zones:  one that will be used for moving data into and one spare zone
11  * making sure that we have enough space to relocate a nearly-full zone.
12  * To allow for slightly sloppy accounting for when we need to reserve the
13  * second zone, we actually reserve three as that is easier than doing fully
14  * accurate bookkeeping.
15  */
16 #define XFS_GC_ZONES		3U
17 
18 /*
19  * In addition we need two zones for user writes, one open zone for writing
20  * and one to still have available blocks without resetting the open zone
21  * when data in the open zone has been freed.
22  */
23 #define XFS_RESERVED_ZONES	(XFS_GC_ZONES + 1)
24 #define XFS_MIN_ZONES		(XFS_RESERVED_ZONES + 1)
25 
26 /*
27  * Always keep one zone out of the general open zone pool to allow for GC to
28  * happen while other writers are waiting for free space.
29  */
30 #define XFS_OPEN_GC_ZONES	1U
31 #define XFS_MIN_OPEN_ZONES	(XFS_OPEN_GC_ZONES + 1U)
32 
33 /*
34  * For zoned devices that do not have a limit on the number of open zones, and
35  * for regular devices using the zoned allocator, use the most common SMR disks
36  * limit (128) as the default limit on the number of open zones.
37  */
38 #define XFS_DEFAULT_MAX_OPEN_ZONES	128
39 
40 bool xfs_validate_blk_zone(struct xfs_mount *mp, struct blk_zone *zone,
41 	unsigned int zone_no, uint32_t expected_size,
42 	uint32_t expected_capacity, xfs_rgblock_t *write_pointer);
43 
44 #endif /* _LIBXFS_ZONES_H */
45