]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: add realtime refcount btree inode to metadata directory
authorDarrick J. Wong <djwong@kernel.org>
Mon, 24 Feb 2025 18:21:52 +0000 (10:21 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 25 Feb 2025 17:15:59 +0000 (09:15 -0800)
Source kernel commit: eaed472c40527e526217aff3737816b44b08b363

Add a metadir path to select the realtime refcount btree inode and load
it at mount time.  The rtrefcountbt inode will have a unique extent format
code, which means that we also have to update the inode validation and
flush routines to look for it.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
libxfs/xfs_format.h
libxfs/xfs_inode_buf.c
libxfs/xfs_inode_fork.c
libxfs/xfs_rtgroup.c
libxfs/xfs_rtgroup.h
libxfs/xfs_rtrefcount_btree.c

index 17f7c0d1aaa45208a877712547d4108b5d0e34ab..b6828f92c131fb1dd7d9a35ecce0a6bd10e7afbf 100644 (file)
@@ -858,6 +858,7 @@ enum xfs_metafile_type {
        XFS_METAFILE_RTBITMAP,          /* rt bitmap */
        XFS_METAFILE_RTSUMMARY,         /* rt summary */
        XFS_METAFILE_RTRMAP,            /* rt rmap */
+       XFS_METAFILE_RTREFCOUNT,        /* rt refcount */
 
        XFS_METAFILE_MAX
 } __packed;
@@ -870,7 +871,8 @@ enum xfs_metafile_type {
        { XFS_METAFILE_PRJQUOTA,        "prjquota" }, \
        { XFS_METAFILE_RTBITMAP,        "rtbitmap" }, \
        { XFS_METAFILE_RTSUMMARY,       "rtsummary" }, \
-       { XFS_METAFILE_RTRMAP,          "rtrmap" }
+       { XFS_METAFILE_RTRMAP,          "rtrmap" }, \
+       { XFS_METAFILE_RTREFCOUNT,      "rtrefcount" }
 
 /*
  * On-disk inode structure.
index 0278fbb63797011e3d4b56937855c309068a281f..0be0625857002c6554f931090a178e124152c5ce 100644 (file)
@@ -453,6 +453,11 @@ xfs_dinode_verify_fork(
                        if (!xfs_has_rmapbt(mp))
                                return __this_address;
                        break;
+               case XFS_METAFILE_RTREFCOUNT:
+                       /* same comment about growfs and rmap inodes applies */
+                       if (!xfs_has_reflink(mp))
+                               return __this_address;
+                       break;
                default:
                        return __this_address;
                }
index e4f866969bf1b61c027095cf989f21abab219ebf..f690c746805fad4cf20403001144d1728825c109 100644 (file)
@@ -270,6 +270,9 @@ xfs_iformat_data_fork(
                        switch (ip->i_metatype) {
                        case XFS_METAFILE_RTRMAP:
                                return xfs_iformat_rtrmap(ip, dip);
+                       case XFS_METAFILE_RTREFCOUNT:
+                               ASSERT(0); /* to be implemented later */
+                               return -EFSCORRUPTED;
                        default:
                                break;
                        }
@@ -618,6 +621,9 @@ xfs_iflush_fork(
                case XFS_METAFILE_RTRMAP:
                        xfs_iflush_rtrmap(ip, dip);
                        break;
+               case XFS_METAFILE_RTREFCOUNT:
+                       ASSERT(0); /* to be implemented later */
+                       break;
                default:
                        ASSERT(0);
                        break;
index 7e69b6bf96f1ac411b212173448bd22d8b0aef33..f7bacce8500c0c1fdae46d253d5d00b2f0a35843 100644 (file)
@@ -364,6 +364,13 @@ static const struct xfs_rtginode_ops xfs_rtginode_ops[XFS_RTGI_MAX] = {
                .enabled        = xfs_has_rmapbt,
                .create         = xfs_rtrmapbt_create,
        },
+       [XFS_RTGI_REFCOUNT] = {
+               .name           = "refcount",
+               .metafile_type  = XFS_METAFILE_RTREFCOUNT,
+               .fmt_mask       = 1U << XFS_DINODE_FMT_META_BTREE,
+               /* same comment about growfs and rmap inodes applies here */
+               .enabled        = xfs_has_reflink,
+       },
 };
 
 /* Return the shortname of this rtgroup inode. */
index 6ff222a053674dc63528bbf6a00e82232bf4e921..2663f2d849e295e491a284f8ebd8166b8eedd5ab 100644 (file)
@@ -15,6 +15,7 @@ enum xfs_rtg_inodes {
        XFS_RTGI_BITMAP,        /* allocation bitmap */
        XFS_RTGI_SUMMARY,       /* allocation summary */
        XFS_RTGI_RMAP,          /* rmap btree inode */
+       XFS_RTGI_REFCOUNT,      /* refcount btree inode */
 
        XFS_RTGI_MAX,
 };
@@ -80,6 +81,11 @@ static inline struct xfs_inode *rtg_rmap(const struct xfs_rtgroup *rtg)
        return rtg->rtg_inodes[XFS_RTGI_RMAP];
 }
 
+static inline struct xfs_inode *rtg_refcount(const struct xfs_rtgroup *rtg)
+{
+       return rtg->rtg_inodes[XFS_RTGI_REFCOUNT];
+}
+
 /* Passive rtgroup references */
 static inline struct xfs_rtgroup *
 xfs_rtgroup_get(
index ea05b1a48eab625146f9e2c37fbbaa3b5105aeb5..46c62bd63458f4cf466dd12781d2b7356cd35a09 100644 (file)
@@ -24,6 +24,7 @@
 #include "xfs_cksum.h"
 #include "xfs_rtgroup.h"
 #include "xfs_rtbitmap.h"
+#include "xfs_metafile.h"
 
 static struct kmem_cache       *xfs_rtrefcountbt_cur_cache;
 
@@ -279,12 +280,10 @@ xfs_rtrefcountbt_init_cursor(
        struct xfs_trans        *tp,
        struct xfs_rtgroup      *rtg)
 {
-       struct xfs_inode        *ip = NULL;
+       struct xfs_inode        *ip = rtg_refcount(rtg);
        struct xfs_mount        *mp = rtg_mount(rtg);
        struct xfs_btree_cur    *cur;
 
-       return NULL; /* XXX */
-
        xfs_assert_ilocked(ip, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL);
 
        cur = xfs_btree_alloc_cursor(mp, tp, &xfs_rtrefcountbt_ops,
@@ -314,6 +313,7 @@ xfs_rtrefcountbt_commit_staged_btree(
        int                     flags = XFS_ILOG_CORE | XFS_ILOG_DBROOT;
 
        ASSERT(cur->bc_flags & XFS_BTREE_STAGING);
+       ASSERT(ifake->if_fork->if_format == XFS_DINODE_FMT_META_BTREE);
 
        /*
         * Free any resources hanging off the real fork, then shallow-copy the