All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Luis R. Rodriguez" <mcgrof@kernel.org>
To: sandeen@sandeen.net, linux-xfs@vger.kernel.org
Cc: darrick.wong@oracle.com, david@fromorbit.com,
	"Luis R. Rodriguez" <mcgrof@kernel.org>
Subject: [PATCH v2] mkfs: add mkfs config version specifier for the config file
Date: Mon, 18 Jun 2018 11:05:20 -0700	[thread overview]
Message-ID: <20180618180520.22146-1-mcgrof@kernel.org> (raw)

We may opt later to bump this and add new features which we
don't want a v1 parser to use. So peg a version number. We add
a new [global] section dedicated for special configuration file
option specifiers, with the only subtopt supported being 'version'.

The only we support for now is version 1.

Suggested-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
---

As suggested by Sandeed, added a [global] section which makes the
code easier to read and maintain.

 man/man8/mkfs.xfs.8.in |  9 ++++-
 mkfs/config.c          | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 99 insertions(+), 1 deletion(-)

diff --git a/man/man8/mkfs.xfs.8.in b/man/man8/mkfs.xfs.8.in
index cf4bdf827d9c..c86d559ba3e1 100644
--- a/man/man8/mkfs.xfs.8.in
+++ b/man/man8/mkfs.xfs.8.in
@@ -965,12 +965,19 @@ option follow a simple ini-style format as shown below.
 Available options consist of a small subset of the parameters available
 via the
 .BR mkfs.xfs (8)
-command line.
+command line. All configuration files must start with an annotation of
+the configuration file format, specified in the global section with the keyword
+.B version
+and the only supported version format is 1.
 Currently all default parameters can only be either enabled or disabled,
 with a value of 1 to enable or 0 to disable.
 See below for a list of all supported configuration parameters and their
 current built-in default settings.
 .PP
+.BI [global]
+.br
+.BI version=1
+.PP
 .BI [data]
 .br
 .BI noalign=0
diff --git a/mkfs/config.c b/mkfs/config.c
index 835adc45f02d..4bb371d6b1e8 100644
--- a/mkfs/config.c
+++ b/mkfs/config.c
@@ -32,6 +32,8 @@
  * We only provide definitions for what we currently support parsing.
  */
 
+static uint64_t mkfs_config_version;
+
 enum data_subopts {
 	D_NOALIGN = 0,
 };
@@ -42,6 +44,14 @@ enum inode_subopts {
 	I_SPINODES,
 };
 
+/*
+ * These are not part of the defaults but rather global generic configuration
+ * file options.
+ */
+enum global_subopts {
+	G_VERSION = 0,
+};
+
 enum log_subopts {
 	L_LAZYSBCNTR = 0,
 };
@@ -122,6 +132,24 @@ inode_config_parser(
 	return -1;
 }
 
+static int
+global_config_parser(
+	struct mkfs_default_params	*dft,
+	int				psubopt,
+	uint64_t			value)
+{
+	enum global_subopts		subopt = psubopt;
+
+	switch (subopt) {
+	case G_VERSION:
+		if (value != 1)
+			return -1;
+		mkfs_config_version = value;
+		return 0;
+	}
+	return -1;
+}
+
 static int
 log_config_parser(
 	struct mkfs_default_params	*dft,
@@ -234,6 +262,14 @@ struct confopts {
 		},
 		.parser = inode_config_parser,
 	},
+	{
+		.name = "global",
+		.subopts = {
+			[G_VERSION] = "version",
+			NULL
+		},
+		.parser = global_config_parser,
+	},
 	{
 		.name = "log",
 		.subopts = {
@@ -287,6 +323,24 @@ get_confopts(
 	return NULL;
 }
 
+static bool config_version_set(void)
+{
+	/* cannot fail */
+	struct confopts *opts = get_confopts("global");
+
+	return opts->seen;
+}
+
+static uint64_t config_version(void)
+{
+	/* cannot fail */
+	struct confopts *opts = get_confopts("global");
+
+	if (!opts->seen)
+		return 0;
+	return mkfs_config_version;
+}
+
 enum parse_line_type {
 	PARSE_COMMENT = 0,
 	PARSE_EMPTY,
@@ -379,6 +433,32 @@ parse_get_line_type(
 	return PARSE_INVALID;
 }
 
+static bool
+check_version_supported(
+		void)
+{
+	uint64_t version = config_version();
+
+	if (!version) {
+		fprintf(stderr,
+_("Version for configuration file not specified\n"));
+		goto out;
+	}
+
+	if (version != 1) {
+		errno = EOPNOTSUPP;
+		fprintf(stderr,
+_("Only version 1 supported, you specified version %lu\n"), version);
+		goto out;
+	}
+
+	return true;
+
+out:
+	errno = EOPNOTSUPP;
+	return false;
+}
+
 static int
 parse_config_stream(
 	struct mkfs_default_params	*dft,
@@ -420,6 +500,7 @@ parse_config_stream(
 					  config_file, lineno, line);
 			goto out;
 		case PARSE_SECTION:
+
 			confopt = get_confopts(tag);
 			if (!confopt) {
 				fprintf(stderr,
@@ -451,6 +532,13 @@ _("No section specified yet on line %s:%zu : %s\n"),
 				goto out_free_tag;
 			}
 
+			if (!config_version_set() &&
+			    strcmp(confopt->name, "global") != 0) {
+				fprintf(stderr,
+_("A global section with a version set was not detected and must be set first\n"));
+				goto out_free_tag;
+			}
+
 			/*
 			 * We re-use the line buffer allocated by getline(),
 			 * however line must be kept pointing to its original
@@ -486,6 +574,9 @@ _("Error parsing line %s:%zu : %s\n"),
 				goto out;
 			}
 
+			if (!check_version_supported())
+				goto out;
+
 			break;
 		}
 		free(line);
-- 
2.16.3


             reply	other threads:[~2018-06-18 18:05 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-18 18:05 Luis R. Rodriguez [this message]
2018-06-19 19:53 ` [PATCH v2] mkfs: add mkfs config version specifier for the config file Eric Sandeen
2018-06-19 20:57   ` Luis R. Rodriguez
2018-06-19 21:21     ` Eric Sandeen
2018-06-19 23:52       ` Luis R. Rodriguez
2018-06-20 13:11         ` Jan Tulak
2018-06-20 23:18     ` Dave Chinner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180618180520.22146-1-mcgrof@kernel.org \
    --to=mcgrof@kernel.org \
    --cc=darrick.wong@oracle.com \
    --cc=david@fromorbit.com \
    --cc=linux-xfs@vger.kernel.org \
    --cc=sandeen@sandeen.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.