xfs_rtword_t *words;
bitsperblock = mp->m_sb.sb_blocksize * NBBY;
+ words = malloc(mp->m_blockwsize << XFS_WORDLOG);
+ if (!words) {
+ dbprintf(_("could not allocate rtwords buffer\n"));
+ error++;
+ return;
+ }
bit = extno = prevbit = start_bmbno = start_bit = 0;
bmbno = NULLFILEOFF;
while ((bmbno = blkmap_next_off(blkmap, bmbno, &t)) != NULLFILEOFF) {
struct xfs_rtalloc_args args = {
.mp = mp,
};
+ xfs_rtword_t *incore = words;
+ unsigned int i;
bno = blkmap_get(blkmap, bmbno);
if (bno == NULLFSBLOCK) {
}
args.rbmbp = iocur_top->bp;
- words = (xfs_rtword_t *)xfs_rbmblock_wordptr(&args, 0);
+ for (i = 0; i < mp->m_blockwsize; i++, incore++)
+ *incore = libxfs_rtbitmap_getword(&args, i);
+
for (bit = 0;
bit < bitsperblock && extno < mp->m_sb.sb_rextents;
bit++, extno++) {
offs = xfs_rtsumoffs(mp, log, start_bmbno);
sumcompute[offs]++;
}
+ free(words);
}
static void
#define xfs_rmap_lookup_le_range libxfs_rmap_lookup_le_range
#define xfs_rmap_query_range libxfs_rmap_query_range
+#define xfs_rtbitmap_getword libxfs_rtbitmap_getword
+#define xfs_rtbitmap_setword libxfs_rtbitmap_setword
#define xfs_rtbitmap_wordcount libxfs_rtbitmap_wordcount
#define xfs_rtfree_extent libxfs_rtfree_extent
/* realtime info */
-xfs_rtword_t *btmcompute;
+union xfs_rtword_raw *btmcompute;
xfs_suminfo_t *sumcompute;
/* inode tree records have full or partial backptr fields ? */
/* realtime info */
-extern xfs_rtword_t *btmcompute;
+extern union xfs_rtword_raw *btmcompute;
extern xfs_suminfo_t *sumcompute;
/* inode tree records have full or partial backptr fields ? */
struct xfs_buf *bp;
xfs_trans_t *tp;
xfs_inode_t *ip;
- xfs_rtword_t *bmp;
+ union xfs_rtword_raw *bmp;
int nmap;
int error;
xfs_fileoff_t bno;
* handled by incore_init()
*/
wordcnt = libxfs_rtbitmap_wordcount(mp, mp->m_sb.sb_rextents);
- btmcompute = calloc(wordcnt, sizeof(xfs_rtword_t));
+ btmcompute = calloc(wordcnt, sizeof(union xfs_rtword_raw));
if (!btmcompute)
do_error(
_("couldn't allocate memory for incore realtime bitmap.\n"));
_("couldn't allocate memory for incore realtime summary info.\n"));
}
+static inline void
+set_rtword(
+ struct xfs_mount *mp,
+ union xfs_rtword_raw *word,
+ xfs_rtword_t value)
+{
+ word->old = value;
+}
+
/*
* generate the real-time bitmap and summary info based on the
* incore realtime extent map.
*/
int
-generate_rtinfo(xfs_mount_t *mp,
- xfs_rtword_t *words,
- xfs_suminfo_t *sumcompute)
+generate_rtinfo(
+ struct xfs_mount *mp,
+ union xfs_rtword_raw *words,
+ xfs_suminfo_t *sumcompute)
{
xfs_rtxnum_t extno;
xfs_rtxnum_t start_ext;
*/
while (extno < mp->m_sb.sb_rextents) {
freebit = 1;
- *words = 0;
+ set_rtword(mp, words, 0);
bits = 0;
for (i = 0; i < sizeof(xfs_rtword_t) * NBBY &&
extno < mp->m_sb.sb_rextents; i++, extno++) {
freebit <<= 1;
}
- *words = bits;
+ set_rtword(mp, words, bits);
words++;
if (extno % bitsperblock == 0)
void
rtinit(xfs_mount_t *mp);
-int
-generate_rtinfo(xfs_mount_t *mp,
- xfs_rtword_t *words,
- xfs_suminfo_t *sumcompute);
+int generate_rtinfo(struct xfs_mount *mp, union xfs_rtword_raw *words,
+ xfs_suminfo_t *sumcompute);
void check_rtbitmap(struct xfs_mount *mp);
void check_rtsummary(struct xfs_mount *mp);