]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: create helpers to convert rt block numbers to rt extent numbers
authorDarrick J. Wong <djwong@kernel.org>
Mon, 12 Feb 2024 14:21:20 +0000 (15:21 +0100)
committerCarlos Maiolino <cem@kernel.org>
Thu, 15 Feb 2024 11:56:43 +0000 (12:56 +0100)
Source kernel commit: 5dc3a80d46a450481df7f7e9fe673ba3eb4514c3

Create helpers to do unit conversions of rt block numbers to rt extent
numbers.  There are three variations -- one to compute the rt extent
number from an rt block number; one to compute the offset of an rt block
within an rt extent; and one to extract both.

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_bmap.c
libxfs/xfs_rtbitmap.c
libxfs/xfs_rtbitmap.h

index 6e863c8a49d1eef4c9bf6cdf55337809aa3bb0c1..6d7fa88f94e03f356c2fae1bf61e199082d92a42 100644 (file)
@@ -5270,7 +5270,6 @@ __xfs_bunmapi(
        int                     tmp_logflags;   /* partial logging flags */
        int                     wasdel;         /* was a delayed alloc extent */
        int                     whichfork;      /* data or attribute fork */
-       xfs_fsblock_t           sum;
        xfs_filblks_t           len = *rlen;    /* length to unmap in file */
        xfs_fileoff_t           end;
        struct xfs_iext_cursor  icur;
@@ -5365,8 +5364,8 @@ __xfs_bunmapi(
                if (!isrt)
                        goto delete;
 
-               sum = del.br_startblock + del.br_blockcount;
-               div_u64_rem(sum, mp->m_sb.sb_rextsize, &mod);
+               mod = xfs_rtb_to_rtxoff(mp,
+                               del.br_startblock + del.br_blockcount);
                if (mod) {
                        /*
                         * Realtime extent not lined up at the end.
@@ -5413,7 +5412,8 @@ __xfs_bunmapi(
                                goto error0;
                        goto nodelete;
                }
-               div_u64_rem(del.br_startblock, mp->m_sb.sb_rextsize, &mod);
+
+               mod = xfs_rtb_to_rtxoff(mp, del.br_startblock);
                if (mod) {
                        xfs_extlen_t off = mp->m_sb.sb_rextsize - mod;
 
index 4085f29b64181d02b18ea72d2ec24eaf3cb25be3..48e709a28e76aa4d2ffed8df66cccd9ad7f14166 100644 (file)
@@ -1022,13 +1022,13 @@ xfs_rtfree_blocks(
 
        ASSERT(rtlen <= XFS_MAX_BMBT_EXTLEN);
 
-       len = div_u64_rem(rtlen, mp->m_sb.sb_rextsize, &mod);
+       len = xfs_rtb_to_rtxrem(mp, rtlen, &mod);
        if (mod) {
                ASSERT(mod == 0);
                return -EIO;
        }
 
-       start = div_u64_rem(rtbno, mp->m_sb.sb_rextsize, &mod);
+       start = xfs_rtb_to_rtxrem(mp, rtbno, &mod);
        if (mod) {
                ASSERT(mod == 0);
                return -EIO;
index e2a36fc157c4c465f4e1609f620ba8dc4a12fbb1..9df583083407b2f08f81e4a7518212cf6c79eca5 100644 (file)
@@ -39,6 +39,37 @@ xfs_extlen_to_rtxlen(
        return len / mp->m_sb.sb_rextsize;
 }
 
+/* Convert an rt block number into an rt extent number. */
+static inline xfs_rtxnum_t
+xfs_rtb_to_rtx(
+       struct xfs_mount        *mp,
+       xfs_rtblock_t           rtbno)
+{
+       return div_u64(rtbno, mp->m_sb.sb_rextsize);
+}
+
+/* Return the offset of an rt block number within an rt extent. */
+static inline xfs_extlen_t
+xfs_rtb_to_rtxoff(
+       struct xfs_mount        *mp,
+       xfs_rtblock_t           rtbno)
+{
+       return do_div(rtbno, mp->m_sb.sb_rextsize);
+}
+
+/*
+ * Crack an rt block number into an rt extent number and an offset within that
+ * rt extent.  Returns the rt extent number directly and the offset in @off.
+ */
+static inline xfs_rtxnum_t
+xfs_rtb_to_rtxrem(
+       struct xfs_mount        *mp,
+       xfs_rtblock_t           rtbno,
+       xfs_extlen_t            *off)
+{
+       return div_u64_rem(rtbno, mp->m_sb.sb_rextsize, off);
+}
+
 /*
  * Functions for walking free space rtextents in the realtime bitmap.
  */