}
+/*
+ * Grab log sector size and validate.
+ *
+ * XXX: should we probe sector size on external log device rather than using
+ * the data device sector size?
+ */
+static void
+validate_log_sectorsize(
+ struct mkfs_params *cfg,
+ struct cli_params *cli,
+ struct mkfs_default_params *dft)
+{
+
+ if (cli->loginternal && cli->lsectorsize &&
+ cli->lsectorsize != cfg->sectorsize) {
+ fprintf(stderr,
+_("Can't change sector size on internal log!\n"));
+ usage();
+ }
+
+ if (cli->lsectorsize)
+ cfg->lsectorsize = cli->lsectorsize;
+ else if (cli->loginternal)
+ cfg->lsectorsize = cfg->sectorsize;
+ else
+ cfg->lsectorsize = dft->sectorsize;
+ cfg->lsectorlog = libxfs_highbit32(cfg->lsectorsize);
+
+ if (cfg->lsectorsize < XFS_MIN_SECTORSIZE ||
+ cfg->lsectorsize > XFS_MAX_SECTORSIZE ||
+ cfg->lsectorsize > cfg->blocksize) {
+ fprintf(stderr, _("illegal log sector size %d\n"),
+ cfg->lsectorsize);
+ usage();
+ }
+ if (cfg->lsectorsize > XFS_MIN_SECTORSIZE) {
+ if (cli->sb_feat.log_version < 2) {
+ /* user specified non-default log version */
+ fprintf(stderr,
+_("Version 1 logs do not support sector size %d\n"),
+ cfg->lsectorsize);
+ usage();
+ }
+ }
+
+ /* if lsu or lsunit was specified, automatically use v2 logs */
+ if ((cli_opt_set(&lopts, L_SU) || cli_opt_set(&lopts, L_SUNIT)) &&
+ cli->sb_feat.log_version == 1) {
+ fprintf(stderr,
+_("log stripe unit specified, using v2 logs\n"));
+ cli->sb_feat.log_version = 2;
+ }
+
+}
+
static void
print_mkfs_cfg(
struct mkfs_params *cfg,
int lsunitflag;
int lsectorlog;
int lsectorsize;
- int lslflag;
- int lssflag;
int lsu;
int lsunit;
int min_logblocks;
memcpy(&cli.sb_feat, &dft.sb_feat, sizeof(cli.sb_feat));
memcpy(&cli.fsx, &dft.fsx, sizeof(cli.fsx));
- lslflag = lssflag = 0;
- lsectorlog = 0;
- lsectorsize = 0;
+ /*
+ * Initialise cli parameters that can be set to zero to an appropriate
+ * value so we can tell if they have been set or or changed from the
+ * default value.
+ */
+ cli.loginternal = 1; /* internal by default */
+
agsize = daflag = dasize = dblocks = 0;
ilflag = imflag = ipflag = isflag = 0;
liflag = laflag = lsflag = lsuflag = lsunitflag = ldflag = lvflag = 0;
force_overwrite = 1;
break;
case 'b':
+ case 's':
parse_subopts(c, optarg, &cli);
break;
case 'd':
loginternal = cli.loginternal;
logfile = xi.logname;
logsize = cli.logsize;
- lsectorsize = cli.lsectorsize;
- lsectorlog = libxfs_highbit32(lsectorsize);
lsunit = cli.lsunit;
lsunitflag = cli_opt_set(&lopts, L_SUNIT);
ldflag = cli_opt_set(&lopts, L_NAME) ||
cli_opt_set(&lopts, L_DEV);
lvflag = cli_opt_set(&lopts, L_VERSION);
- lslflag = cli_opt_set(&lopts, L_SECTLOG);
- lssflag = cli_opt_set(&lopts, L_SECTSIZE);
/* end temp don't break code */
break;
case 'L':
norsflag = cli.sb_feat.nortalign;
/* end temp don't break code */
break;
- case 's':
- parse_subopts(c, optarg, &cli);
-
- /* temp don't break code */
- lsectorsize = cli.lsectorsize;
- lsectorlog = libxfs_highbit32(lsectorsize);
- lslflag = cli_opt_set(&sopts, S_LOG) ||
- cli_opt_set(&sopts, S_SECTLOG);
-
- lssflag = cli_opt_set(&sopts, S_SIZE) ||
- cli_opt_set(&sopts, S_SECTSIZE);
break;
case 'V':
printf(_("%s version %s\n"), progname, VERSION);
validate_blocksize(&cfg, &cli, &dft);
validate_sectorsize(&cfg, &cli, &dft, &ft, dfile, dry_run,
force_overwrite);
+ validate_log_sectorsize(&cfg, &cli, &dft);
/* temp don't break code */
sectorsize = cfg.sectorsize;
sectorlog = cfg.sectorlog;
blocksize = cfg.blocksize;
blocklog = cfg.blocklog;
+ lsectorsize = cfg.lsectorsize;
+ lsectorlog = cfg.lsectorlog;
+ sb_feat = cfg.sb_feat;
/* end temp don't break code */
- if (lsectorsize < XFS_MIN_SECTORSIZE ||
- lsectorsize > XFS_MAX_SECTORSIZE || lsectorsize > blocksize) {
- fprintf(stderr, _("illegal log sector size %d\n"), lsectorsize);
- usage();
- } else if (lsectorsize > XFS_MIN_SECTORSIZE && !lsu && !lsunit) {
- lsu = blocksize;
- sb_feat.log_version = 2;
- }
-
/*
* Now we have blocks and sector sizes set up, check parameters that are
* no longer optional for CRC enabled filesystems. Catch them up front
exit(1);
}
- /* if lsu or lsunit was specified, automatically use v2 logs */
- if ((lsu || lsunit) && sb_feat.log_version == 1) {
- fprintf(stderr,
- _("log stripe unit specified, using v2 logs\n"));
- sb_feat.log_version = 2;
- }
-
calc_stripe_factors(dsu, dsw, sectorsize, lsu, lsectorsize,
&dsunit, &dswidth, &lsunit);