]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: create a helper to handle logging parts of rt bitmap/summary blocks
authorDarrick J. Wong <djwong@kernel.org>
Thu, 15 Feb 2024 08:25:47 +0000 (09:25 +0100)
committerCarlos Maiolino <cem@kernel.org>
Thu, 15 Feb 2024 11:56:43 +0000 (12:56 +0100)
Source kernel commit: 312d61021b8947446aa9ec80b78b9230e8cb3691

Create an explicit helper function to log parts of rt bitmap and summary
blocks.  While we're at it, fix an off-by-one error in two of the
rtbitmap logging calls that led to unnecessarily large log items but was
otherwise benign.

Note that the upcoming rtgroups patchset will add block headers to the
rtbitmap and rtsummary files.  The helpers in this and the next few
patches take a less than direct route through xfs_rbmblock_wordptr and
xfs_rsumblock_infoptr to avoid helper churn in that patchset.

Suggested-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
libxfs/xfs_rtbitmap.c

index 92473d4a557d8039fcc2ab8e09ce8aee9473a102..562b40a1ac3010a7703a78f45a8371bf899c69cd 100644 (file)
@@ -430,6 +430,21 @@ xfs_rtfind_forw(
        return 0;
 }
 
+/* Log rtsummary counter at @infoword. */
+static inline void
+xfs_trans_log_rtsummary(
+       struct xfs_trans        *tp,
+       struct xfs_buf          *bp,
+       unsigned int            infoword)
+{
+       size_t                  first, last;
+
+       first = (void *)xfs_rsumblock_infoptr(bp, infoword) - bp->b_addr;
+       last = first + sizeof(xfs_suminfo_t) - 1;
+
+       xfs_trans_log_buf(tp, bp, first, last);
+}
+
 /*
  * Read and/or modify the summary information for a given extent size,
  * bitmap block combination.
@@ -495,8 +510,6 @@ xfs_rtmodify_summary_int(
        infoword = xfs_rtsumoffs_to_infoword(mp, so);
        sp = xfs_rsumblock_infoptr(bp, infoword);
        if (delta) {
-               uint first = (uint)((char *)sp - (char *)bp->b_addr);
-
                *sp += delta;
                if (mp->m_rsum_cache) {
                        if (*sp == 0 && log == mp->m_rsum_cache[bbno])
@@ -504,7 +517,7 @@ xfs_rtmodify_summary_int(
                        if (*sp != 0 && log < mp->m_rsum_cache[bbno])
                                mp->m_rsum_cache[bbno] = log;
                }
-               xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
+               xfs_trans_log_rtsummary(tp, bp, infoword);
        }
        if (sum)
                *sum = *sp;
@@ -525,6 +538,22 @@ xfs_rtmodify_summary(
                                        delta, rbpp, rsb, NULL);
 }
 
+/* Log rtbitmap block from the word @from to the byte before @next. */
+static inline void
+xfs_trans_log_rtbitmap(
+       struct xfs_trans        *tp,
+       struct xfs_buf          *bp,
+       unsigned int            from,
+       unsigned int            next)
+{
+       size_t                  first, last;
+
+       first = (void *)xfs_rbmblock_wordptr(bp, from) - bp->b_addr;
+       last = ((void *)xfs_rbmblock_wordptr(bp, next) - 1) - bp->b_addr;
+
+       xfs_trans_log_buf(tp, bp, first, last);
+}
+
 /*
  * Set the given range of bitmap bits to the given value.
  * Do whatever I/O and logging is required.
@@ -546,6 +575,7 @@ xfs_rtmodify_range(
        int             i;              /* current bit number rel. to start */
        int             lastbit;        /* last useful bit in word */
        xfs_rtword_t    mask;           /* mask o frelevant bits for value */
+       unsigned int    firstword;      /* first word used in the buffer */
        unsigned int    word;           /* word number in the buffer */
 
        /*
@@ -563,7 +593,7 @@ xfs_rtmodify_range(
        /*
         * Compute the starting word's address, and starting bit.
         */
-       word = xfs_rtx_to_rbmword(mp, start);
+       firstword = word = xfs_rtx_to_rbmword(mp, start);
        first = b = xfs_rbmblock_wordptr(bp, word);
        bit = (int)(start & (XFS_NBWORD - 1));
        /*
@@ -597,15 +627,13 @@ xfs_rtmodify_range(
                         * Log the changed part of this block.
                         * Get the next one.
                         */
-                       xfs_trans_log_buf(tp, bp,
-                               (uint)((char *)first - (char *)bp->b_addr),
-                               (uint)((char *)b - (char *)bp->b_addr));
+                       xfs_trans_log_rtbitmap(tp, bp, firstword, word);
                        error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp);
                        if (error) {
                                return error;
                        }
 
-                       word = 0;
+                       firstword = word = 0;
                        first = b = xfs_rbmblock_wordptr(bp, word);
                } else {
                        /*
@@ -638,15 +666,13 @@ xfs_rtmodify_range(
                         * Log the changed part of this block.
                         * Get the next one.
                         */
-                       xfs_trans_log_buf(tp, bp,
-                               (uint)((char *)first - (char *)bp->b_addr),
-                               (uint)((char *)b - (char *)bp->b_addr));
+                       xfs_trans_log_rtbitmap(tp, bp, firstword, word);
                        error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp);
                        if (error) {
                                return error;
                        }
 
-                       word = 0;
+                       firstword = word = 0;
                        first = b = xfs_rbmblock_wordptr(bp, word);
                } else {
                        /*
@@ -671,15 +697,14 @@ xfs_rtmodify_range(
                        *b |= mask;
                else
                        *b &= ~mask;
+               word++;
                b++;
        }
        /*
         * Log any remaining changed bytes.
         */
        if (b > first)
-               xfs_trans_log_buf(tp, bp,
-                       (uint)((char *)first - (char *)bp->b_addr),
-                       (uint)((char *)b - (char *)bp->b_addr - 1));
+               xfs_trans_log_rtbitmap(tp, bp, firstword, word);
        return 0;
 }