@@ -1944,10 +1944,14 @@ init(
inodata[c] = xcalloc(inodata_hash_size, sizeof(**inodata));
}
if (rt) {
+ unsigned long long words;
+
dbmap[c] = xcalloc(mp->m_sb.sb_rblocks, sizeof(**dbmap));
inomap[c] = xcalloc(mp->m_sb.sb_rblocks, sizeof(**inomap));
- sumfile = xcalloc(mp->m_rsumsize, 1);
- sumcompute = xcalloc(mp->m_rsumsize, 1);
+ words = libxfs_rtsummary_wordcount(mp, mp->m_rsumlevels,
+ mp->m_sb.sb_rbmblocks);
+ sumfile = xcalloc(words, sizeof(xfs_suminfo_t));
+ sumcompute = xcalloc(words, sizeof(xfs_suminfo_t));
}
nflag = sflag = tflag = verbose = optind = 0;
while ((c = getopt(argc, argv, "b:i:npstv")) != EOF) {
@@ -284,6 +284,7 @@ rtmount_init(
{
struct xfs_buf *bp; /* buffer for last block of subvolume */
xfs_daddr_t d; /* address of last block of subvolume */
+ unsigned int rsumblocks;
int error;
if (mp->m_sb.sb_rblocks == 0)
@@ -309,10 +310,9 @@ rtmount_init(
return -1;
}
mp->m_rsumlevels = mp->m_sb.sb_rextslog + 1;
- mp->m_rsumsize =
- (uint)sizeof(xfs_suminfo_t) * mp->m_rsumlevels *
- mp->m_sb.sb_rbmblocks;
- mp->m_rsumsize = roundup(mp->m_rsumsize, mp->m_sb.sb_blocksize);
+ rsumblocks = xfs_rtsummary_blockcount(mp, mp->m_rsumlevels,
+ mp->m_sb.sb_rbmblocks);
+ mp->m_rsumsize = XFS_FSB_TO_B(mp, rsumblocks);
mp->m_rbmip = mp->m_rsumip = NULL;
/*
@@ -179,6 +179,8 @@
#define xfs_rtbitmap_setword libxfs_rtbitmap_setword
#define xfs_rtbitmap_wordcount libxfs_rtbitmap_wordcount
+#define xfs_rtsummary_wordcount libxfs_rtsummary_wordcount
+
#define xfs_rtfree_extent libxfs_rtfree_extent
#define xfs_rtfree_blocks libxfs_rtfree_blocks
#define xfs_sb_from_disk libxfs_sb_from_disk
@@ -34,7 +34,10 @@ rtinit(xfs_mount_t *mp)
do_error(
_("couldn't allocate memory for incore realtime bitmap.\n"));
- if ((sumcompute = calloc(mp->m_rsumsize, 1)) == NULL)
+ wordcnt = libxfs_rtsummary_wordcount(mp, mp->m_rsumlevels,
+ mp->m_sb.sb_rbmblocks);
+ sumcompute = calloc(wordcnt, sizeof(xfs_suminfo_t));
+ if (!sumcompute)
do_error(
_("couldn't allocate memory for incore realtime summary info.\n"));
}