void init_bm_cursor(bmap_cursor_t *cursor, int num_level);
+/*
+ * On-disk inobt record helpers. The sparse inode record format has a single
+ * byte freecount. The older format has a 32-bit freecount and thus byte
+ * conversion is necessary.
+ */
+
+static inline int
+inorec_get_freecount(
+ struct xfs_mount *mp,
+ struct xfs_inobt_rec *rp)
+{
+ if (xfs_sb_version_hassparseinodes(&mp->m_sb))
+ return rp->ir_u.sp.ir_freecount;
+ return be32_to_cpu(rp->ir_u.f.ir_freecount);
+}
+
+static inline void
+inorec_set_freecount(
+ struct xfs_mount *mp,
+ struct xfs_inobt_rec *rp,
+ int freecount)
+{
+ if (xfs_sb_version_hassparseinodes(&mp->m_sb))
+ rp->ir_u.sp.ir_freecount = freecount;
+ else
+ rp->ir_u.f.ir_freecount = cpu_to_be32(freecount);
+}
+
#endif /* XFS_REPAIR_INCORE_H */
inocnt++;
}
- if (!xfs_sb_version_hassparseinodes(&mp->m_sb)) {
- bt_rec[j].ir_u.f.ir_freecount =
- cpu_to_be32(finocnt);
+ /*
+ * Set the freecount and check whether we need to update
+ * the sparse format fields. Otherwise, skip to the next
+ * record.
+ */
+ inorec_set_freecount(mp, &bt_rec[j], finocnt);
+ if (!xfs_sb_version_hassparseinodes(&mp->m_sb))
goto nextrec;
- }
/*
* Convert the 64-bit in-core sparse inode state to the
sparse >>= XFS_INODES_PER_HOLEMASK_BIT;
}
- bt_rec[j].ir_u.sp.ir_freecount = finocnt;
bt_rec[j].ir_u.sp.ir_count = inocnt;
bt_rec[j].ir_u.sp.ir_holemask = cpu_to_be16(holemask);
off = XFS_AGINO_TO_OFFSET(mp, ino);
agbno = XFS_AGINO_TO_AGBNO(mp, ino);
lino = XFS_AGINO_TO_INO(mp, agno, ino);
- if (xfs_sb_version_hassparseinodes(&mp->m_sb))
- freecount = rp->ir_u.sp.ir_freecount;
- else
- freecount = be32_to_cpu(rp->ir_u.f.ir_freecount);
+ freecount = inorec_get_freecount(mp, rp);
/*
* on multi-block block chunks, all chunks start
off = XFS_AGINO_TO_OFFSET(mp, ino);
agbno = XFS_AGINO_TO_AGBNO(mp, ino);
lino = XFS_AGINO_TO_INO(mp, agno, ino);
- if (xfs_sb_version_hassparseinodes(&mp->m_sb))
- freecount = rp->ir_u.sp.ir_freecount;
- else
- freecount = be32_to_cpu(rp->ir_u.f.ir_freecount);
+ freecount = inorec_get_freecount(mp, rp);
/*
* on multi-block block chunks, all chunks start at the beginning of the
* the block. skip processing of bogus records.
*/
for (i = 0; i < numrecs; i++) {
- if (xfs_sb_version_hassparseinodes(&mp->m_sb))
- freecount = rp[i].ir_u.sp.ir_freecount;
- else
- freecount = be32_to_cpu(rp[i].ir_u.f.ir_freecount);
+ freecount = inorec_get_freecount(mp, &rp[i]);
if (magic == XFS_IBT_MAGIC ||
magic == XFS_IBT_CRC_MAGIC) {