aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2017-12-06 17:14:27 -0600
committerEric Sandeen <sandeen@redhat.com>2017-12-06 17:14:27 -0600
commit7a9af89a284fcc8bb57e9555b1c7555676c22db9 (patch)
tree8af331139009a687c8aeba29cf12001949448abb
parent90b7e13d40e54205dad6d296863691716cf3d2c8 (diff)
downloadxfsprogs-dev-7a9af89a284fcc8bb57e9555b1c7555676c22db9.tar.gz
mkfs: factor rt device validation
Signed-Off-By: Dave Chinner <dchinner@redhat.com> Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
-rw-r--r--mkfs/xfs_mkfs.c109
1 files changed, 63 insertions, 46 deletions
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index ee1d7f78e6..e30950c57f 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -2684,6 +2684,64 @@ reported by the device (%u).\n"),
}
static void
+validate_rtdev(
+ struct mkfs_params *cfg,
+ struct cli_params *cli,
+ char **devname)
+{
+ struct libxfs_xinit *xi = cli->xi;
+
+ *devname = NULL;
+
+ if (!xi->rtdev) {
+ if (cli->rtsize) {
+ fprintf(stderr,
+_("size specified for non-existent rt subvolume\n"));
+ usage();
+ }
+
+ *devname = _("none");
+ cfg->rtblocks = 0;
+ cfg->rtextents = 0;
+ cfg->rtbmblocks = 0;
+ return;
+ }
+ if (!xi->rtsize) {
+ fprintf(stderr, _("Invalid zero length rt subvolume found\n"));
+ usage();
+ }
+
+ /* volume rtdev */
+ if (xi->volname)
+ *devname = _("volume rt");
+ else
+ *devname = xi->rtname;
+
+ if (cli->rtsize) {
+ if (cfg->rtblocks > DTOBT(xi->rtsize, cfg->blocklog)) {
+ fprintf(stderr,
+_("size %s specified for rt subvolume is too large, maxi->um is %lld blocks\n"),
+ cli->rtsize,
+ (long long)DTOBT(xi->rtsize, cfg->blocklog));
+ usage();
+ }
+ if (xi->rtbsize > cfg->sectorsize) {
+ fprintf(stderr, _(
+"Warning: the realtime subvolume sector size %u is less than the sector size\n\
+reported by the device (%u).\n"),
+ cfg->sectorsize, xi->rtbsize);
+ }
+ } else {
+ /* grab volume size */
+ cfg->rtblocks = DTOBT(xi->rtsize, cfg->blocklog);
+ }
+
+ cfg->rtextents = cfg->rtblocks / cfg->rtextblocks;
+ cfg->rtbmblocks = (xfs_extlen_t)howmany(cfg->rtextents,
+ NBBY * cfg->blocksize);
+}
+
+static void
print_mkfs_cfg(
struct mkfs_params *cfg,
char *dfile,
@@ -3362,7 +3420,6 @@ main(
xfs_extlen_t rtextblocks;
xfs_rtblock_t rtextents;
char *rtfile;
- char *rtsize;
xfs_sb_t *sbp;
int sectorlog;
uint64_t tmp_agsize;
@@ -3436,7 +3493,7 @@ main(
logagno = logblocks = rtblocks = rtextblocks = 0;
imaxpct = inodelog = inopblock = isize = 0;
dfile = logfile = rtfile = NULL;
- logsize = rtsize = protofile = NULL;
+ logsize = protofile = NULL;
dsunit = dswidth = lalign = lsunit = 0;
nodsflag = 0;
force_overwrite = 0;
@@ -3455,6 +3512,7 @@ main(
break;
case 'b':
case 'n':
+ case 'r':
case 's':
parse_subopts(c, optarg, &cli);
break;
@@ -3516,14 +3574,6 @@ main(
case 'q':
quiet = 1;
break;
- case 'r':
- parse_subopts(c, optarg, &cli);
-
- /* temp don't break code */
- rtsize = cli.rtsize;
- /* end temp don't break code */
- break;
- break;
case 'V':
printf(_("%s version %s\n"), progname, VERSION);
exit(0);
@@ -3579,6 +3629,7 @@ main(
open_devices(&cfg, &xi, (discard && !dry_run));
validate_datadev(&cfg, &cli);
validate_logdev(&cfg, &cli, &logfile);
+ validate_rtdev(&cfg, &cli, &rtfile);
/* temp don't break code */
sectorsize = cfg.sectorsize;
@@ -3598,48 +3649,14 @@ main(
logblocks = cfg.logblocks;
rtblocks = cfg.rtblocks;
rtextblocks = cfg.rtextblocks;
+ nbmblocks = cfg.rtbmblocks;
+ rtextents = cfg.rtextents;
dsunit = cfg.dsunit;
dswidth = cfg.dswidth;
lsunit = cfg.lsunit;
nodsflag = cfg.sb_feat.nodalign;
/* end temp don't break code */
- if (xi.rtname)
- rtfile = xi.rtname;
- else
- if (xi.volname && xi.rtdev)
- rtfile = _("volume rt");
- else if (!xi.rtdev)
- rtfile = _("none");
-
- if (rtsize && xi.rtsize > 0 && xi.rtbsize > sectorsize) {
- fprintf(stderr, _(
-"Warning: the realtime subvolume sector size %u is less than the sector size\n\
-reported by the device (%u).\n"),
- sectorsize, xi.rtbsize);
- }
-
- if (rtsize && xi.rtsize > 0 && rtblocks > DTOBT(xi.rtsize, blocklog)) {
- fprintf(stderr,
- _("size %s specified for rt subvolume is too large, "
- "maximum is %lld blocks\n"),
- rtsize, (long long)DTOBT(xi.rtsize, blocklog));
- usage();
- } else if (!rtsize && xi.rtsize > 0)
- rtblocks = DTOBT(xi.rtsize, blocklog);
- else if (rtsize && !xi.rtdev) {
- fprintf(stderr,
- _("size specified for non-existent rt subvolume\n"));
- usage();
- }
- if (xi.rtdev) {
- rtextents = rtblocks / rtextblocks;
- nbmblocks = (xfs_extlen_t)howmany(rtextents, NBBY * blocksize);
- } else {
- rtextents = rtblocks = 0;
- nbmblocks = 0;
- }
-
if (dasize) { /* User-specified AG size */
/*
* Check specified agsize is a multiple of blocksize.