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
commitcf627f3c540cc610857906f936efa0b9ad3d39cf (patch)
treeb4a41e0ea58f98e07d317245381b445c8ae81cbf
parent05abf43d42822655557b95ad355be5a21d609ab4 (diff)
downloadxfsprogs-dev-cf627f3c540cc610857906f936efa0b9ad3d39cf.tar.gz
mkfs: introduce a structure to hold CLI options
We need to hold the values set from command line options so they can later be validated and discriminated from the default values that might be set. This structure will form a connector between the input parsing and the rest of the mkfs code. 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--include/libxfs.h2
-rw-r--r--mkfs/xfs_mkfs.c110
2 files changed, 94 insertions, 18 deletions
diff --git a/include/libxfs.h b/include/libxfs.h
index e392e527c6..c5fb396e26 100644
--- a/include/libxfs.h
+++ b/include/libxfs.h
@@ -96,7 +96,7 @@ extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len);
/*
* Argument structure for libxfs_init().
*/
-typedef struct {
+typedef struct libxfs_xinit {
/* input parameters */
char *volname; /* pathname of volume */
char *dname; /* pathname of data "subvolume" */
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index 3fd8c6a12c..e17e3b674e 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -717,6 +717,99 @@ struct opt_params mopts = {
},
};
+/* quick way of checking if a parameter was set on the CLI */
+static bool
+cli_opt_set(
+ struct opt_params *opts,
+ int subopt)
+{
+ return opts->subopt_params[subopt].seen ||
+ opts->subopt_params[subopt].str_seen;
+}
+
+/*
+ * Options configured on the command line.
+ *
+ * This stores all the specific config parameters the user sets on the command
+ * line. We do not use these values directly - they are inputs to the mkfs
+ * geometry validation and override any default configuration value we have.
+ *
+ * We don't keep flags to indicate what parameters are set - if we need to check
+ * if an option was set on teh command line, we check the relevant entry in the
+ * option table which records whether it was specified in the .seen and
+ * .str_seen variables in the table.
+ *
+ * Some parameters are stored as strings for post-parsing after their dependent
+ * options have been resolved (e.g. block size and sector size have been parsed
+ * and validated).
+ *
+ * This allows us to check that values have been set without needing separate
+ * flags for each value, and hence avoids needing to record and check for each
+ * specific option that can set the value later on in the code. In the cases
+ * where we don't have a cli_params structure around, the above cli_opt_set()
+ * function can be used.
+ */
+struct sb_feat_args {
+ int log_version;
+ int attr_version;
+ int dir_version;
+ bool inode_align;
+ bool nci;
+ bool lazy_sb_counters;
+ bool projid16bit;
+ bool crcs_enabled;
+ bool dirftype;
+ bool finobt;
+ bool spinodes;
+ bool rmapbt;
+ bool reflink;
+ bool parent_pointers;
+ bool nodalign;
+ bool nortalign;
+ uuid_t m_uuid;
+};
+
+struct cli_params {
+ int sectorsize;
+ int blocksize;
+
+ /* parameters that depend on sector/block size being validated. */
+ char *dsize;
+ char *agsize;
+ char *dsu;
+ char *dirblocksize;
+ char *logsize;
+ char *lsu;
+ char *rtextsize;
+ char *rtsize;
+
+ /* parameters where 0 is a valid CLI value */
+ int dsunit;
+ int dswidth;
+ int dsw;
+ int64_t logagno;
+ int loginternal;
+ int lsunit;
+
+ /* parameters where 0 is not a valid value */
+ int64_t agcount;
+ int dirblocklog;
+ int inodesize;
+ int inopblock;
+ int imaxpct;
+ int lsectorsize;
+ uuid_t uuid;
+
+ /* feature flags that are set */
+ struct sb_feat_args sb_feat;
+
+ /* root inode characteristics */
+ struct fsxattr fsx;
+
+ /* libxfs device setup */
+ struct libxfs_xinit *xi;
+};
+
#define TERABYTES(count, blog) ((uint64_t)(count) << (40 - (blog)))
#define GIGABYTES(count, blog) ((uint64_t)(count) << (30 - (blog)))
#define MEGABYTES(count, blog) ((uint64_t)(count) << (20 - (blog)))
@@ -1158,23 +1251,6 @@ discard_blocks(dev_t dev, uint64_t nsectors)
platform_discard_blocks(fd, 0, nsectors << 9);
}
-struct sb_feat_args {
- int log_version;
- int attr_version;
- int dir_version;
- int spinodes;
- int finobt;
- bool inode_align;
- bool nci;
- bool lazy_sb_counters;
- bool projid16bit;
- bool crcs_enabled;
- bool dirftype;
- bool parent_pointers;
- bool rmapbt;
- bool reflink;
-};
-
static void
sb_set_features(
struct xfs_sb *sbp,