]> www.infradead.org Git - users/hch/xfs.git/commit
xfs: implement zoned garbage collection
authorChristoph Hellwig <hch@lst.de>
Sat, 15 Feb 2025 18:37:19 +0000 (19:37 +0100)
committerChristoph Hellwig <hch@lst.de>
Wed, 26 Feb 2025 01:19:37 +0000 (17:19 -0800)
commitd39ae84f673a7614cc3b57c7325d2d2f12585da1
tree8e0d008f4f2406809f99cbde710e2dcbdd1b1442
parentefded90ac8eb6034bd9857f9f93d26d02c42ff36
xfs: implement zoned garbage collection

RT groups on a zoned file system need to be completely empty before their
space can be reused.  This means that partially empty groups need to be
emptied entirely to free up space if no entirely free groups are
available.

Add a garbage collection thread that moves all data out of the least used
zone when not enough free zones are available, and which resets all zones
that have been emptied.  To find empty zone a simple set of 10 buckets
based on the amount of space used in the zone is used.  To empty zones,
the rmap is walked to find the owners and the data is read and then
written to the new place.

To automatically defragment files the rmap records are sorted by inode
and logical offset.  This means defragmentation of parallel writes into
a single zone happens automatically when performing garbage collection.
Because holding the iolock over the entire GC cycle would inject very
noticeable latency for other accesses to the inodes, the iolock is not
taken while performing I/O.  Instead the I/O completion handler checks
that the mapping hasn't changed over the one recorded at the start of
the GC cycle and doesn't update the mapping if it change.

Co-developed-by: Hans Holmberg <hans.holmberg@wdc.com>
Signed-off-by: Hans Holmberg <hans.holmberg@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
13 files changed:
fs/xfs/Makefile
fs/xfs/libxfs/xfs_group.h
fs/xfs/libxfs/xfs_rtgroup.h
fs/xfs/xfs_extent_busy.c
fs/xfs/xfs_mount.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_super.c
fs/xfs/xfs_trace.h
fs/xfs/xfs_zone_alloc.c
fs/xfs/xfs_zone_alloc.h
fs/xfs/xfs_zone_gc.c [new file with mode: 0644]
fs/xfs/xfs_zone_priv.h
fs/xfs/xfs_zone_space_resv.c