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
commit1de014466dd6e7eeb2c89b46f782d8e3804e8963 (patch)
treefd2ad6c32000ed54f312faa2d5f8a2e5d4e728dc
parent7a9af89a284fcc8bb57e9555b1c7555676c22db9 (diff)
downloadxfsprogs-dev-1de014466dd6e7eeb2c89b46f782d8e3804e8963.tar.gz
mkfs: factor AG geometry calculations
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.c61
1 files changed, 42 insertions, 19 deletions
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index e30950c57f..086d99979c 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -2742,6 +2742,38 @@ reported by the device (%u).\n"),
}
static void
+calculate_initial_ag_geometry(
+ struct mkfs_params *cfg,
+ struct cli_params *cli)
+{
+ if (cli->agsize) { /* User-specified AG size */
+ cfg->agsize = getnum(cli->agsize, &dopts, D_AGSIZE);
+
+ /*
+ * Check specified agsize is a multiple of blocksize.
+ */
+ if (cfg->agsize % cfg->blocksize) {
+ fprintf(stderr,
+_("agsize (%s) not a multiple of fs blk size (%d)\n"),
+ cli->agsize, cfg->blocksize);
+ usage();
+ }
+ cfg->agsize /= cfg->blocksize;
+ cfg->agcount = cfg->dblocks / cfg->agsize +
+ (cfg->dblocks % cfg->agsize != 0);
+
+ } else if (cli->agcount) { /* User-specified AG count */
+ cfg->agcount = cli->agcount;
+ cfg->agsize = cfg->dblocks / cfg->agcount +
+ (cfg->dblocks % cfg->agcount != 0);
+ } else {
+ calc_default_ag_geometry(cfg->blocklog, cfg->dblocks,
+ cfg->dsunit, &cfg->agsize,
+ &cfg->agcount);
+ }
+}
+
+static void
print_mkfs_cfg(
struct mkfs_params *cfg,
char *dfile,
@@ -3631,6 +3663,14 @@ main(
validate_logdev(&cfg, &cli, &logfile);
validate_rtdev(&cfg, &cli, &rtfile);
+ /*
+ * At this point when know exactly what size all the devices are,
+ * so we can start validating and calculating layout options that are
+ * dependent on device sizes. Once calculated, make sure everything
+ * aligns to device geometry correctly.
+ */
+ calculate_initial_ag_geometry(&cfg, &cli);
+
/* temp don't break code */
sectorsize = cfg.sectorsize;
sectorlog = cfg.sectorlog;
@@ -3655,27 +3695,10 @@ main(
dswidth = cfg.dswidth;
lsunit = cfg.lsunit;
nodsflag = cfg.sb_feat.nodalign;
+ agsize = cfg.agsize;
+ agcount = cfg.agcount;
/* end temp don't break code */
- if (dasize) { /* User-specified AG size */
- /*
- * Check specified agsize is a multiple of blocksize.
- */
- if (agsize % blocksize) {
- fprintf(stderr,
- _("agsize (%lld) not a multiple of fs blk size (%d)\n"),
- (long long)agsize, blocksize);
- usage();
- }
- agsize /= blocksize;
- agcount = dblocks / agsize + (dblocks % agsize != 0);
-
- } else if (daflag) { /* User-specified AG count */
- agsize = dblocks / agcount + (dblocks % agcount != 0);
- } else {
- calc_default_ag_geometry(blocklog, dblocks,
- dsunit | dswidth, &agsize, &agcount);
- }
/*
* If dsunit is a multiple of fs blocksize, then check that is a