}
if (cli->xi->rt.name) {
- if (cli->sb_feat.reflink && cli_opt_set(&mopts, M_REFLINK)) {
- fprintf(stderr,
-_("reflink not supported with realtime devices\n"));
- usage();
+ if (cli->rtextsize && cli->sb_feat.reflink) {
+ if (cli_opt_set(&mopts, M_REFLINK)) {
+ fprintf(stderr,
+_("reflink not supported on realtime devices with rt extent size specified\n"));
+ usage();
+ }
+ cli->sb_feat.reflink = false;
+ }
+ if (cli->blocksize < XFS_MIN_RTEXTSIZE && cli->sb_feat.reflink) {
+ if (cli_opt_set(&mopts, M_REFLINK)) {
+ fprintf(stderr,
+_("reflink not supported on realtime devices with blocksize %d < %d\n"),
+ cli->blocksize,
+ XFS_MIN_RTEXTSIZE);
+ usage();
+ }
+ cli->sb_feat.reflink = false;
+ }
+ if (!cli->sb_feat.rtgroups && cli->sb_feat.reflink) {
+ if (cli_opt_set(&mopts, M_REFLINK) &&
+ cli_opt_set(&ropts, R_RTGROUPS)) {
+ fprintf(stderr,
+_("reflink not supported on realtime devices without rtgroups feature\n"));
+ usage();
+ } else if (cli_opt_set(&mopts, M_REFLINK)) {
+ cli->sb_feat.rtgroups = true;
+ } else {
+ cli->sb_feat.reflink = false;
+ }
}
- cli->sb_feat.reflink = false;
if (!cli->sb_feat.rtgroups && cli->sb_feat.rmapbt) {
if (cli_opt_set(&mopts, M_RMAPBT) &&
usage();
}
cfg->rtextblocks = (xfs_extlen_t)(rtextbytes >> cfg->blocklog);
+ } else if (cli->sb_feat.reflink && cli->xi->rt.name) {
+ /*
+ * reflink doesn't support rt extent size > 1FSB yet, so set
+ * an extent size of 1FSB. Make sure we still satisfy the
+ * minimum rt extent size.
+ */
+ if (cfg->blocksize < XFS_MIN_RTEXTSIZE) {
+ fprintf(stderr,
+ _("reflink not supported on rt volume with blocksize %d\n"),
+ cfg->blocksize);
+ usage();
+ }
+ cfg->rtextblocks = 1;
} else {
/*
* If realtime extsize has not been specified by the user,
}
}
ASSERT(cfg->rtextblocks);
+
+ if (cli->sb_feat.reflink && cfg->rtblocks > 0 && cfg->rtextblocks > 1) {
+ fprintf(stderr,
+_("reflink not supported on realtime with extent sizes > 1\n"));
+ usage();
+ }
}
/* Validate the incoming extsize hint. */
rtg->rtg_inodes[XFS_RTG_RMAP], ask);
if (error)
prealloc_fail(mp, error, ask, _("realtime rmap btree"));
+
+ ask = libxfs_rtrefcountbt_calc_reserves(mp);
+ error = -libxfs_metafile_resv_init(
+ rtg->rtg_inodes[XFS_RTG_REFCOUNT], ask);
+ if (error)
+ prealloc_fail(mp, error, ask, _("realtime refcount btree"));
}
/* Unreserve the realtime metadata reservations. */
for_each_rtgroup(mp, rgno, rtg) {
libxfs_metafile_resv_free(rtg->rtg_inodes[XFS_RTG_RMAP]);
+ libxfs_metafile_resv_free(rtg->rtg_inodes[XFS_RTG_REFCOUNT]);
}
/* Unreserve the per-AG reservations. */