]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: use accessor functions for summary info words
authorDarrick J. Wong <djwong@kernel.org>
Mon, 16 Oct 2023 16:51:16 +0000 (09:51 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 18 Oct 2023 23:53:00 +0000 (16:53 -0700)
Create get and set functions for rtsummary words so that we can redefine
the ondisk format with a specific endianness.  Note that this requires
the definition of a distinct type for ondisk summary info words so that
the compiler can perform proper typechecking.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_format.h
fs/xfs/libxfs/xfs_rtbitmap.c
fs/xfs/libxfs/xfs_rtbitmap.h
fs/xfs/scrub/rtsummary.c
fs/xfs/scrub/trace.c
fs/xfs/scrub/trace.h
fs/xfs/xfs_ondisk.h

index 2af891d5d171125d3a1deb76f4724d094aa39057..9a88aba1589f87b45c470c8a8ec9a3a559a4c86d 100644 (file)
@@ -698,6 +698,14 @@ union xfs_rtword_raw {
        __u32           old;
 };
 
+/*
+ * Realtime summary counts are accessed by the word, which is currently
+ * stored in host-endian format.
+ */
+union xfs_suminfo_raw {
+       __u32           old;
+};
+
 /*
  * XFS Timestamps
  * ==============
index fb05ea0177ec3111b0d3c0bb623c418851a33af1..4221f539615f503bc8eb4f442329f3fe7902d8bc 100644 (file)
@@ -451,7 +451,6 @@ xfs_rtmodify_summary_int(
        int             error;          /* error value */
        xfs_fileoff_t   sb;             /* summary fsblock */
        xfs_rtsumoff_t  so;             /* index into the summary file */
-       xfs_suminfo_t   *sp;            /* pointer to returned data */
        unsigned int    infoword;
 
        /*
@@ -490,19 +489,21 @@ xfs_rtmodify_summary_int(
         * Point to the summary information, modify/log it, and/or copy it out.
         */
        infoword = xfs_rtsumoffs_to_infoword(mp, so);
-       sp = xfs_rsumblock_infoptr(bp, infoword);
        if (delta) {
-               *sp += delta;
+               xfs_suminfo_t   val = xfs_suminfo_add(bp, infoword, delta);
+
                if (mp->m_rsum_cache) {
-                       if (*sp == 0 && log == mp->m_rsum_cache[bbno])
+                       if (val == 0 && log == mp->m_rsum_cache[bbno])
                                mp->m_rsum_cache[bbno]++;
-                       if (*sp != 0 && log < mp->m_rsum_cache[bbno])
+                       if (val != 0 && log < mp->m_rsum_cache[bbno])
                                mp->m_rsum_cache[bbno] = log;
                }
                xfs_trans_log_rtsummary(tp, bp, infoword);
+               if (sum)
+                       *sum = val;
+       } else if (sum) {
+               *sum = xfs_suminfo_get(bp, infoword);
        }
-       if (sum)
-               *sum = *sp;
        return 0;
 }
 
index a3e8288bedea12d2eaa29a38f90fd1ea4b49070d..fdfa98e0ee52f7f6bca537a05e5ef27a80b61463 100644 (file)
@@ -232,16 +232,40 @@ xfs_rtsumoffs_to_infoword(
 }
 
 /* Return a pointer to a summary info word within a rt summary block. */
-static inline xfs_suminfo_t *
+static inline union xfs_suminfo_raw *
 xfs_rsumblock_infoptr(
        struct xfs_buf          *bp,
        unsigned int            index)
 {
-       xfs_suminfo_t           *info = bp->b_addr;
+       union xfs_suminfo_raw   *info = bp->b_addr;
 
        return info + index;
 }
 
+/* Get the current value of a summary counter. */
+static inline xfs_suminfo_t
+xfs_suminfo_get(
+       struct xfs_buf          *bp,
+       unsigned int            index)
+{
+       union xfs_suminfo_raw   *info = xfs_rsumblock_infoptr(bp, index);
+
+       return info->old;
+}
+
+/* Add to the current value of a summary counter and return the new value. */
+static inline xfs_suminfo_t
+xfs_suminfo_add(
+       struct xfs_buf          *bp,
+       unsigned int            index,
+       int                     delta)
+{
+       union xfs_suminfo_raw   *info = xfs_rsumblock_infoptr(bp, index);
+
+       info->old += delta;
+       return info->old;
+}
+
 /*
  * Functions for walking free space rtextents in the realtime bitmap.
  */
index 0971d002d906ab705d3209a16fd26407a7d2d68b..e9eac5354f19e9872915c0a20a1838370a8d49b5 100644 (file)
@@ -82,9 +82,10 @@ static inline int
 xfsum_load(
        struct xfs_scrub        *sc,
        xfs_rtsumoff_t          sumoff,
-       xfs_suminfo_t           *info)
+       union xfs_suminfo_raw   *rawinfo)
 {
-       return xfile_obj_load(sc->xfile, info, sizeof(xfs_suminfo_t),
+       return xfile_obj_load(sc->xfile, rawinfo,
+                       sizeof(union xfs_suminfo_raw),
                        sumoff << XFS_WORDLOG);
 }
 
@@ -92,9 +93,10 @@ static inline int
 xfsum_store(
        struct xfs_scrub        *sc,
        xfs_rtsumoff_t          sumoff,
-       const xfs_suminfo_t     info)
+       const union xfs_suminfo_raw rawinfo)
 {
-       return xfile_obj_store(sc->xfile, &info, sizeof(xfs_suminfo_t),
+       return xfile_obj_store(sc->xfile, &rawinfo,
+                       sizeof(union xfs_suminfo_raw),
                        sumoff << XFS_WORDLOG);
 }
 
@@ -102,13 +104,22 @@ static inline int
 xfsum_copyout(
        struct xfs_scrub        *sc,
        xfs_rtsumoff_t          sumoff,
-       xfs_suminfo_t           *info,
+       union xfs_suminfo_raw   *rawinfo,
        unsigned int            nr_words)
 {
-       return xfile_obj_load(sc->xfile, info, nr_words << XFS_WORDLOG,
+       return xfile_obj_load(sc->xfile, rawinfo, nr_words << XFS_WORDLOG,
                        sumoff << XFS_WORDLOG);
 }
 
+static inline xfs_suminfo_t
+xchk_rtsum_inc(
+       struct xfs_mount        *mp,
+       union xfs_suminfo_raw   *v)
+{
+       v->old += 1;
+       return v->old;
+}
+
 /* Update the summary file to reflect the free extent that we've accumulated. */
 STATIC int
 xchk_rtsum_record_free(
@@ -123,7 +134,8 @@ xchk_rtsum_record_free(
        xfs_filblks_t                   rtlen;
        xfs_rtsumoff_t                  offs;
        unsigned int                    lenlog;
-       xfs_suminfo_t                   v = 0;
+       union xfs_suminfo_raw           v;
+       xfs_suminfo_t                   value;
        int                             error = 0;
 
        if (xchk_should_terminate(sc, &error))
@@ -147,9 +159,9 @@ xchk_rtsum_record_free(
        if (error)
                return error;
 
-       v++;
+       value = xchk_rtsum_inc(sc->mp, &v);
        trace_xchk_rtsum_record_free(mp, rec->ar_startext, rec->ar_extcount,
-                       lenlog, offs, v);
+                       lenlog, offs, value);
 
        return xfsum_store(sc, offs, v);
 }
@@ -184,7 +196,7 @@ xchk_rtsum_compare(
        int                     nmap;
 
        for (off = 0; off < XFS_B_TO_FSB(mp, mp->m_rsumsize); off++) {
-               xfs_suminfo_t   *ondisk_info;
+               union xfs_suminfo_raw *ondisk_info;
                int             error = 0;
 
                if (xchk_should_terminate(sc, &error))
index 46249e7b17e09f66b6266758b159a537ab5f66d5..29afa48512355e08be55b2e13392ab1522ebf796 100644 (file)
@@ -13,6 +13,7 @@
 #include "xfs_inode.h"
 #include "xfs_btree.h"
 #include "xfs_ag.h"
+#include "xfs_rtbitmap.h"
 #include "scrub/scrub.h"
 #include "scrub/xfile.h"
 #include "scrub/xfarray.h"
index b0cf6757444f1db72119243486f82cdf29d6c208..4a8bc6f3c8f2eaf6f270ce56b7a8dec5fd3a46c1 100644 (file)
@@ -1038,8 +1038,8 @@ TRACE_EVENT(xfarray_sort_stats,
 TRACE_EVENT(xchk_rtsum_record_free,
        TP_PROTO(struct xfs_mount *mp, xfs_rtxnum_t start,
                 xfs_rtbxlen_t len, unsigned int log, loff_t pos,
-                xfs_suminfo_t v),
-       TP_ARGS(mp, start, len, log, pos, v),
+                xfs_suminfo_t value),
+       TP_ARGS(mp, start, len, log, pos, value),
        TP_STRUCT__entry(
                __field(dev_t, dev)
                __field(dev_t, rtdev)
@@ -1047,7 +1047,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
                __field(unsigned long long, len)
                __field(unsigned int, log)
                __field(loff_t, pos)
-               __field(xfs_suminfo_t, v)
+               __field(xfs_suminfo_t, value)
        ),
        TP_fast_assign(
                __entry->dev = mp->m_super->s_dev;
@@ -1056,7 +1056,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
                __entry->len = len;
                __entry->log = log;
                __entry->pos = pos;
-               __entry->v = v;
+               __entry->value = value;
        ),
        TP_printk("dev %d:%d rtdev %d:%d rtx 0x%llx rtxcount 0x%llx log %u rsumpos 0x%llx sumcount %u",
                  MAJOR(__entry->dev), MINOR(__entry->dev),
@@ -1065,7 +1065,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
                  __entry->len,
                  __entry->log,
                  __entry->pos,
-                 __entry->v)
+                 __entry->value)
 );
 #endif /* CONFIG_XFS_RT */
 
index 14d455f768d3f8f8b97dd3e4faca61187885e0c9..21a7e350b4c58ee9b9e1cd164a73ee9a23cb7b7d 100644 (file)
@@ -74,6 +74,7 @@ xfs_check_ondisk_structs(void)
 
        /* realtime structures */
        XFS_CHECK_STRUCT_SIZE(union xfs_rtword_raw,             4);
+       XFS_CHECK_STRUCT_SIZE(union xfs_suminfo_raw,            4);
 
        /*
         * m68k has problems with xfs_attr_leaf_name_remote_t, but we pad it to