xfs: fix 32-bit truncation in xfs_compute_rextslog
commit cf8f0e6c1429be7652869059ea44696b72d5b726 upstream. 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> Signed-off-by: Catherine Hoang <catherine.hoang@oracle.com> Acked-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
0a31f1e8d8
commit
89e511a745
@ -1133,13 +1133,15 @@ xfs_rtalloc_extent_is_free(
|
||||
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user