summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2023-12-03 09:19:44 -0800
committerDarrick J. Wong <djwong@kernel.org>2023-12-06 18:45:17 -0800
commitcf8f0e6c1429be7652869059ea44696b72d5b726 (patch)
treeb1fb05f56e2f57cb10e9abdc6305a10ce34bafc0
parenta6a38f309afc4a7ede01242b603f36c433997780 (diff)
downloadlinux-stable-cf8f0e6c1429be7652869059ea44696b72d5b726.tar.gz
linux-stable-cf8f0e6c1429be7652869059ea44696b72d5b726.tar.bz2
linux-stable-cf8f0e6c1429be7652869059ea44696b72d5b726.zip
xfs: fix 32-bit truncation in xfs_compute_rextslog
It's quite reasonable that some customer somewhere will want to configure a realtime volume with more than 2^32 extents. If they try to do this, the highbit32() call will truncate the upper bits of the xfs_rtbxlen_t and produce the wrong value for rextslog. This in turn causes the rsumlevels to be wrong, which results in a realtime summary file that is the wrong length. Fix that. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
-rw-r--r--fs/xfs/libxfs/xfs_rtbitmap.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
index 1c9fed76a356..30a2844f62e3 100644
--- a/fs/xfs/libxfs/xfs_rtbitmap.c
+++ b/fs/xfs/libxfs/xfs_rtbitmap.c
@@ -1132,14 +1132,16 @@ xfs_rtbitmap_blockcount(
/*
* Compute the maximum level number of the realtime summary file, as defined by
- * mkfs. The use of highbit32 on a 64-bit quantity is a historic artifact that
- * prohibits correct use of rt volumes with more than 2^32 extents.
+ * mkfs. The historic use of highbit32 on a 64-bit quantity prohibited correct
+ * use of rt volumes with more than 2^32 extents.
*/
uint8_t
xfs_compute_rextslog(
xfs_rtbxlen_t rtextents)
{
- return rtextents ? xfs_highbit32(rtextents) : 0;
+ if (!rtextents)
+ return 0;
+ return xfs_highbit64(rtextents);
}
/*