aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2024-02-12 15:21:20 +0100
committerCarlos Maiolino <cem@kernel.org>2024-02-15 12:56:43 +0100
commit1dac259cfd50ab6992c8c6d5dea1253a37827761 (patch)
treebf36bacd9b793e1379d61d08dc89890e5beba155
parenta01e6467b84585c437de831a139562937396e3e9 (diff)
downloadxfsprogs-dev-1dac259cfd50ab6992c8c6d5dea1253a37827761.tar.gz
xfs: create helpers to convert rt block numbers to rt extent numbers
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>
-rw-r--r--libxfs/xfs_bmap.c8
-rw-r--r--libxfs/xfs_rtbitmap.c4
-rw-r--r--libxfs/xfs_rtbitmap.h31
3 files changed, 37 insertions, 6 deletions
diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c
index 6e863c8a49..6d7fa88f94 100644
--- a/libxfs/xfs_bmap.c
+++ b/libxfs/xfs_bmap.c
@@ -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;
diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c
index 4085f29b64..48e709a28e 100644
--- a/libxfs/xfs_rtbitmap.c
+++ b/libxfs/xfs_rtbitmap.c
@@ -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;
diff --git a/libxfs/xfs_rtbitmap.h b/libxfs/xfs_rtbitmap.h
index e2a36fc157..9df5830834 100644
--- a/libxfs/xfs_rtbitmap.h
+++ b/libxfs/xfs_rtbitmap.h
@@ -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.
*/