[PATCHSET v5.0 4/9] xfs: create incore rt allocation groups

Darrick J. Wong
2024-10-11T00:34:18Z

Hi all,

Add in-memory data structures for sharding the realtime volume into
independent allocation groups. For existing filesystems, the entire rt
volume is modelled as having a single large group, with (potentially) a
number of rt extents exceeding 2^32 blocks, though these are not likely
to exist because the codebase has been a bit broken for decades. The
next series fills in the ondisk format and other supporting structures.

If you're going to start using this code, I strongly recommend pulling
from my git trees, which are linked below.

This has been running on the djcloud for months with no problems. Enjoy!
Comments and questions are, as always, welcome.

--D

kernel git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/xfs-linux.git/log/?h=incore-rtgroups

xfsprogs git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=incore-rtgroups
---
Commits in this patchset:
* xfs: clean up xfs_getfsmap_helper arguments
* xfs: create incore realtime group structures
* xfs: define locking primitives for realtime groups
* xfs: add a lockdep class key for rtgroup inodes
* xfs: support caching rtgroup metadata inodes
* xfs: add rtgroup-based realtime scrubbing context management
* xfs: add a xfs_bmap_free_rtblocks helper
* xfs: add a xfs_qm_unmount_rt helper
* xfs: factor out a xfs_growfs_rt_alloc_blocks helper
* xfs: cleanup xfs_getfsmap_rtdev_rtbitmap
* xfs: split xfs_trim_rtdev_extents
* xfs: move RT bitmap and summary information to the rtgroup
* xfs: support creating per-RTG files in growfs
* xfs: remove XFS_ILOCK_RT*
* xfs: calculate RT bitmap and summary blocks based on sb_rextents
* xfs: factor out a xfs_growfs_rt_alloc_fake_mount helper
* xfs: use xfs_growfs_rt_alloc_fake_mount in xfs_growfs_rt_alloc_blocks
* xfs: factor out a xfs_growfs_check_rtgeom helper
* xfs: refactor xfs_rtbitmap_blockcount
* xfs: refactor xfs_rtsummary_blockcount
* xfs: make RT extent numbers relative to the rtgroup
---
fs/xfs/Makefile | 1
fs/xfs/libxfs/xfs_bmap.c | 46 ++-
fs/xfs/libxfs/xfs_format.h | 3
fs/xfs/libxfs/xfs_group.c | 8 +
fs/xfs/libxfs/xfs_rtbitmap.c | 199 ++++++++-------
fs/xfs/libxfs/xfs_rtbitmap.h | 147 ++++++-----
fs/xfs/libxfs/xfs_rtgroup.c | 462 +++++++++++++++++++++++++++++++++++
fs/xfs/libxfs/xfs_rtgroup.h | 265 ++++++++++++++++++++
fs/xfs/libxfs/xfs_sb.c | 7 +
fs/xfs/libxfs/xfs_trans_resv.c | 2
fs/xfs/libxfs/xfs_types.h | 8 +
fs/xfs/scrub/bmap.c | 13 +
fs/xfs/scrub/common.c | 78 ++++++
fs/xfs/scrub/common.h | 30 ++
fs/xfs/scrub/fscounters.c | 25 +-
fs/xfs/scrub/repair.c | 24 ++
fs/xfs/scrub/repair.h | 7 +
fs/xfs/scrub/rtbitmap.c | 54 ++--
fs/xfs/scrub/rtsummary.c | 111 ++++----
fs/xfs/scrub/rtsummary_repair.c | 7 -
fs/xfs/scrub/scrub.c | 33 ++
fs/xfs/scrub/scrub.h | 13 +
fs/xfs/xfs_bmap_util.c | 3
fs/xfs/xfs_discard.c | 100 +++++---
fs/xfs/xfs_fsmap.c | 329 ++++++++++++++-----------
fs/xfs/xfs_fsmap.h | 15 +
fs/xfs/xfs_inode.c | 3
fs/xfs/xfs_inode.h | 13 -
fs/xfs/xfs_iomap.c | 4
fs/xfs/xfs_log_recover.c | 15 +
fs/xfs/xfs_mount.c | 15 +
fs/xfs/xfs_mount.h | 26 +-
fs/xfs/xfs_qm.c | 27 ++
fs/xfs/xfs_rtalloc.c | 518 ++++++++++++++++++++++++---------------
fs/xfs/xfs_super.c | 4
fs/xfs/xfs_trace.c | 1
fs/xfs/xfs_trace.h | 74 ++++--
37 files changed, 1980 insertions(+), 710 deletions(-)
create mode 100644 fs/xfs/libxfs/xfs_rtgroup.c
create mode 100644 fs/xfs/libxfs/xfs_rtgroup.h