XFS_DINODE_FMT_EXTENTS, /* struct xfs_bmbt_rec */
XFS_DINODE_FMT_BTREE, /* struct xfs_bmdr_block */
XFS_DINODE_FMT_UUID, /* added long ago, but never used */
- XFS_DINODE_FMT_RMAP, /* reverse mapping btree */
- XFS_DINODE_FMT_REFCOUNT, /* reference count btree */
+ XFS_DINODE_FMT_META_BTREE, /* metadata btree */
};
#define XFS_INODE_FORMAT_STR \
{ XFS_DINODE_FMT_EXTENTS, "extent" }, \
{ XFS_DINODE_FMT_BTREE, "btree" }, \
{ XFS_DINODE_FMT_UUID, "uuid" }, \
- { XFS_DINODE_FMT_RMAP, "rmap" }, \
- { XFS_DINODE_FMT_REFCOUNT, "refcount" }
+ { XFS_DINODE_FMT_META_BTREE, "meta_btree" }
/*
* Max values for extnum and aextnum.
if (di_nextents > max_extents)
return __this_address;
break;
- case XFS_DINODE_FMT_RMAP:
+ case XFS_DINODE_FMT_META_BTREE:
/*
- * growfs must create the rtrmap inodes before adding a
- * realtime volume to the filesystem, so we cannot use the
- * rtrmapbt predicate here.
+ * XXX: do we need a finer grained check here?
*/
- if (!xfs_has_rmapbt(mp))
- return __this_address;
- if (!(dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADATA)))
- return __this_address;
- break;
- case XFS_DINODE_FMT_REFCOUNT:
- /* same comment about growfs and rmap inodes applies here */
- if (!xfs_has_reflink(mp))
+ if (!xfs_has_metadir(mp))
return __this_address;
if (!(dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADATA)))
return __this_address;
if (dip->di_forkoff != (roundup(sizeof(xfs_dev_t), 8) >> 3))
return __this_address;
break;
- case XFS_DINODE_FMT_RMAP:
- case XFS_DINODE_FMT_REFCOUNT:
- if (!(xfs_has_metadir(mp) && xfs_has_parent(mp)))
+ case XFS_DINODE_FMT_META_BTREE:
+ if (!xfs_has_metadir(mp) || !xfs_has_parent(mp))
return __this_address;
fallthrough;
case XFS_DINODE_FMT_LOCAL: /* fall through ... */
}
/* metadata inodes containing btrees always have zero extent count */
- if (flags2 & XFS_DIFLAG2_METADATA) {
- switch (XFS_DFORK_FORMAT(dip, XFS_DATA_FORK)) {
- case XFS_DINODE_FMT_RMAP:
- case XFS_DINODE_FMT_REFCOUNT:
- break;
- default:
- if (nextents + naextents == 0 && nblocks != 0)
- return __this_address;
- break;
- }
- } else if (nextents + naextents == 0 && nblocks != 0)
- return __this_address;
+ if (XFS_DFORK_FORMAT(dip, XFS_DATA_FORK) != XFS_DINODE_FMT_META_BTREE) {
+ if (nextents + naextents == 0 && nblocks != 0)
+ return __this_address;
+ }
return NULL;
}
return xfs_iformat_extents(ip, dip, XFS_DATA_FORK);
case XFS_DINODE_FMT_BTREE:
return xfs_iformat_btree(ip, dip, XFS_DATA_FORK);
- case XFS_DINODE_FMT_RMAP:
- /*
- * growfs must create the rtrmap inodes before adding a
- * realtime volume to the filesystem, so we cannot use
- * the rtrmapbt predicate here.
- */
- if (!xfs_has_rmapbt(ip->i_mount)) {
- xfs_inode_mark_sick(ip, XFS_SICK_INO_CORE);
- return -EFSCORRUPTED;
- }
- return xfs_iformat_rtrmap(ip, dip);
- case XFS_DINODE_FMT_REFCOUNT:
- /* same comment about growfs and rmap inodes applies */
- if (!xfs_has_reflink(ip->i_mount)) {
- xfs_inode_mark_sick(ip, XFS_SICK_INO_CORE);
- return -EFSCORRUPTED;
+ case XFS_DINODE_FMT_META_BTREE:
+ switch (ip->i_metatype) {
+ case XFS_METAFILE_RTRMAP:
+ return xfs_iformat_rtrmap(ip, dip);
+ case XFS_METAFILE_RTREFCOUNT:
+ return xfs_iformat_rtrefcount(ip, dip);
+ default:
+ break;
}
- return xfs_iformat_rtrefcount(ip, dip);
+ fallthrough;
default:
xfs_inode_verifier_error(ip, -EFSCORRUPTED, __func__,
dip, sizeof(*dip), __this_address);
}
break;
- case XFS_DINODE_FMT_RMAP:
+ case XFS_DINODE_FMT_META_BTREE:
ASSERT(whichfork == XFS_DATA_FORK);
- if (iip->ili_fields & brootflag[whichfork])
- xfs_iflush_rtrmap(ip, dip);
- break;
- case XFS_DINODE_FMT_REFCOUNT:
- ASSERT(whichfork == XFS_DATA_FORK);
- if (iip->ili_fields & brootflag[whichfork])
+ if (!(iip->ili_fields & brootflag[whichfork]))
+ break;
+
+ switch (ip->i_metatype) {
+ case XFS_METAFILE_RTRMAP:
+ xfs_iflush_rtrmap(ip, dip);
+ break;
+ case XFS_METAFILE_RTREFCOUNT:
xfs_iflush_rtrefcount(ip, dip);
+ break;
+ default:
+ ASSERT(0);
+ }
break;
default:
const struct xfs_inode *ip =
container_of(m, struct xfs_inode, i_lock.dep_map);
- switch (ip->i_df.if_format) {
- case XFS_DINODE_FMT_RMAP:
- printk(KERN_CONT " rgno=%u rmapbt", ip->i_projid);
- break;
- case XFS_DINODE_FMT_REFCOUNT:
- printk(KERN_CONT " rgno=%u refcountbt", ip->i_projid);
- break;
- default:
- printk(KERN_CONT " rgno=%u", ip->i_projid);
- break;
- }
+ /* XXX: pretty print metatype */
+ printk(KERN_CONT " rgno=%u metatype %u", ip->i_projid, ip->i_metatype);
}
/*
.name = "rmap",
.metafile_type = XFS_METAFILE_RTRMAP,
.sick = XFS_SICK_RG_RMAPBT,
- .fmt_mask = 1U << XFS_DINODE_FMT_RMAP,
+ .fmt_mask = 1U << XFS_DINODE_FMT_META_BTREE,
/*
* growfs must create the rtrmap inodes before adding a
* realtime volume to the filesystem, so we cannot use the
.name = "refcount",
.metafile_type = XFS_METAFILE_RTREFCOUNT,
.sick = XFS_SICK_RG_REFCNTBT,
- .fmt_mask = 1U << XFS_DINODE_FMT_REFCOUNT,
+ .fmt_mask = 1U << XFS_DINODE_FMT_META_BTREE,
/* same comment about growfs and rmap inodes applies here */
.enabled = xfs_has_reflink,
.create = xfs_rtrefcountbt_create,
int flags = XFS_ILOG_CORE | XFS_ILOG_DBROOT;
ASSERT(cur->bc_flags & XFS_BTREE_STAGING);
- ASSERT(ifake->if_fork->if_format == XFS_DINODE_FMT_REFCOUNT);
+ ASSERT(ifake->if_fork->if_format == XFS_DINODE_FMT_META_BTREE);
/*
* Free any resources hanging off the real fork, then shallow-copy the
unsigned int level;
int dsize;
+ if (!xfs_has_reflink(mp)) {
+ xfs_inode_mark_sick(ip, XFS_SICK_INO_CORE);
+ return -EFSCORRUPTED;
+ }
+
dsize = XFS_DFORK_SIZE(dip, mp, XFS_DATA_FORK);
numrecs = be16_to_cpu(dfp->bb_numrecs);
level = be16_to_cpu(dfp->bb_level);
struct xfs_mount *mp = ip->i_mount;
struct xfs_btree_block *broot;
- ifp->if_format = XFS_DINODE_FMT_REFCOUNT;
+ ifp->if_format = XFS_DINODE_FMT_META_BTREE;
ASSERT(ifp->if_broot_bytes == 0);
ASSERT(ifp->if_bytes == 0);
int flags = XFS_ILOG_CORE | XFS_ILOG_DBROOT;
ASSERT(cur->bc_flags & XFS_BTREE_STAGING);
- ASSERT(ifake->if_fork->if_format == XFS_DINODE_FMT_RMAP);
+ ASSERT(ifake->if_fork->if_format == XFS_DINODE_FMT_META_BTREE);
/*
* Free any resources hanging off the real fork, then shallow-copy the
unsigned int level;
int dsize;
+ if (!xfs_has_rmapbt(mp)) {
+ xfs_inode_mark_sick(ip, XFS_SICK_INO_CORE);
+ return -EFSCORRUPTED;
+ }
+
dsize = XFS_DFORK_SIZE(dip, mp, XFS_DATA_FORK);
numrecs = be16_to_cpu(dfp->bb_numrecs);
level = be16_to_cpu(dfp->bb_level);
struct xfs_mount *mp = ip->i_mount;
struct xfs_btree_block *broot;
- ifp->if_format = XFS_DINODE_FMT_RMAP;
+ ifp->if_format = XFS_DINODE_FMT_META_BTREE;
ASSERT(ifp->if_broot_bytes == 0);
ASSERT(ifp->if_bytes == 0);