Hi all, Right now, the realtime section uses a single pair of metadata inodes to store the free space information. This presents a scalability problem since every thread trying to allocate or free rt extents have to lock these files. It would be very useful if we could begin to tackle these problems by sharding the realtime section, so create the notion of realtime groups, which are similar to allocation groups on the data section. While we're at it, define a superblock to be stamped into the start of each rt section. This enables utilities such as blkid to identify block devices containing realtime sections, and helpfully avoids the situation where a file extent can cross an rtgroup boundary. The best advantage for rtgroups will become evident later when we get to adding rmap and reflink to the realtime volume, since the geometry constraints are the same for rt groups and AGs. Hence we can reuse all that code directly. If you're going to start using this mess, you probably ought to just pull from my git trees, which are linked below. This is an extraordinary way to destroy everything. 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=realtime-groups xfsprogs git tree: https://git.kernel.org/cgit/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=realtime-groups fstests git tree: https://git.kernel.org/cgit/linux/kernel/git/djwong/xfstests-dev.git/log/?h=realtime-groups --- db/Makefile | 2 db/bit.c | 24 ++ db/bit.h | 1 db/check.c | 58 ++++- db/command.c | 2 db/convert.c | 46 +++- db/field.c | 18 + db/field.h | 11 + db/fprint.c | 11 + db/inode.c | 9 + db/metadump.c | 51 ++++ db/rtgroup.c | 169 ++++++++++++++ db/rtgroup.h | 21 ++ db/sb.c | 136 ++++++++++- db/type.c | 16 + db/type.h | 32 ++- db/xfs_metadump.sh | 5 include/libxfs.h | 1 include/xfs_arch.h | 6 include/xfs_mount.h | 12 + include/xfs_trace.h | 5 include/xfs_trans.h | 1 io/Makefile | 2 io/aginfo.c | 215 ++++++++++++++++++ io/bmap.c | 30 ++ io/fsmap.c | 23 ++ io/init.c | 1 io/io.h | 1 io/scrub.c | 15 + libfrog/div64.h | 6 libfrog/fsgeom.c | 24 ++ libfrog/fsgeom.h | 23 ++ libfrog/scrub.c | 10 + libfrog/scrub.h | 1 libfrog/util.c | 26 ++ libfrog/util.h | 3 libxfs/Makefile | 2 libxfs/defer_item.c | 17 + libxfs/init.c | 21 ++ libxfs/libxfs_api_defs.h | 6 libxfs/libxfs_io.h | 1 libxfs/libxfs_priv.h | 25 ++ libxfs/rdwr.c | 17 + libxfs/topology.c | 42 +++ libxfs/topology.h | 3 libxfs/trans.c | 29 ++ libxfs/util.c | 7 + libxfs/xfs_bmap.h | 5 libxfs/xfs_format.h | 94 ++++++++ libxfs/xfs_fs.h | 24 ++ libxfs/xfs_health.h | 30 ++ libxfs/xfs_rtbitmap.c | 126 +++++++++- libxfs/xfs_rtbitmap.h | 46 ++++ libxfs/xfs_rtgroup.c | 545 +++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_rtgroup.h | 241 ++++++++++++++++++++ libxfs/xfs_sb.c | 124 ++++++++++ libxfs/xfs_shared.h | 4 libxfs/xfs_types.c | 46 ++++ libxfs/xfs_types.h | 4 man/man8/mkfs.xfs.8.in | 44 ++++ man/man8/xfs_db.8 | 17 + man/man8/xfs_io.8 | 23 ++ man/man8/xfs_mdrestore.8 | 7 + man/man8/xfs_metadump.8 | 12 + man/man8/xfs_spaceman.8 | 5 mdrestore/xfs_mdrestore.c | 30 ++ mkfs/proto.c | 104 +++++++++ mkfs/xfs_mkfs.c | 279 +++++++++++++++++++++++ repair/agheader.c | 2 repair/incore.c | 22 ++ repair/phase3.c | 3 repair/phase6.c | 39 +++ repair/rt.c | 153 ++++++++++++- repair/rt.h | 3 repair/sb.c | 46 ++++ repair/xfs_repair.c | 11 + scrub/phase2.c | 97 ++++++++ scrub/phase8.c | 46 ++++ scrub/repair.c | 2 scrub/scrub.c | 4 scrub/scrub.h | 9 + spaceman/health.c | 59 +++++ 82 files changed, 3361 insertions(+), 132 deletions(-) create mode 100644 db/rtgroup.c create mode 100644 db/rtgroup.h create mode 100644 io/aginfo.c create mode 100644 libxfs/xfs_rtgroup.c create mode 100644 libxfs/xfs_rtgroup.h