Gitweb:
http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=d9c69654...
Commit: d9c696542df0af5aa57d5a89cc3a487bf651fa14
Parent: 2e0c08d53e44a4a053a47482e0035e42144f74bb
Author: Andrew Price <anprice(a)redhat.com>
AuthorDate: Wed Jan 25 08:44:44 2017 +0000
Committer: Andrew Price <anprice(a)redhat.com>
CommitterDate: Wed Jan 25 08:44:44 2017 +0000
mkfs.gfs2: Add an extended option for device topology testing
This adds an -o test_topology=v1:v2:v3:v4:v5 extended option which can
be used to test how mkfs.gfs2 behaves with different device
characteristics. The values it accepts correspond to:
1. alignment_offset
2. logical_sector_size
3. minimum_io_size
4. optimal_io_size
5. physical_sector_size
Signed-off-by: Andrew Price <anprice(a)redhat.com>
---
gfs2/mkfs/main_mkfs.c | 39 ++++++++++++++++++++++++++++++++++-----
1 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
index 363878c..a2d2ba9 100644
--- a/gfs2/mkfs/main_mkfs.c
+++ b/gfs2/mkfs/main_mkfs.c
@@ -256,6 +256,33 @@ static unsigned parse_bool(struct mkfs_opts *opts, const char *key,
const char *
exit(-1);
}
+static int parse_topology(struct mkfs_opts *opts, char *str)
+{
+ char *opt;
+ unsigned i = 0;
+ unsigned long *topol[5] = {
+ &opts->dev.alignment_offset,
+ &opts->dev.logical_sector_size,
+ &opts->dev.minimum_io_size,
+ &opts->dev.optimal_io_size,
+ &opts->dev.physical_sector_size
+ };
+
+ while ((opt = strsep(&str, ":")) != NULL) {
+ if (i > 4) {
+ fprintf(stderr, "Too many topology values.\n");
+ return 1;
+ }
+ *topol[i] = parse_ulong(opts, "test_topology", opt);
+ i++;
+ }
+ if (i < 5) {
+ fprintf(stderr, "Too few topology values.\n");
+ return 1;
+ }
+ return 0;
+}
+
static void opt_parse_extended(char *str, struct mkfs_opts *opts)
{
char *opt;
@@ -274,6 +301,10 @@ static void opt_parse_extended(char *str, struct mkfs_opts *opts)
opts->got_swidth = 1;
} else if (strcmp("align", key) == 0) {
opts->align = parse_bool(opts, "align", val);
+ } else if (strcmp("test_topology", key) == 0) {
+ if (parse_topology(opts, val) != 0)
+ exit(-1);
+ opts->dev.got_topol = 1;
} else if (strcmp("help", key) == 0) {
print_ext_opts();
exit(0);
@@ -854,7 +885,7 @@ static int probe_contents(struct mkfs_dev *dev)
return 0;
}
-static void open_dev(struct mkfs_dev *dev)
+static void open_dev(struct mkfs_dev *dev, int withprobe)
{
int error;
@@ -882,9 +913,7 @@ static void open_dev(struct mkfs_dev *dev)
fprintf(stderr, _("'%s' is not a block device or regular file\n"),
dev->path);
exit(1);
}
-
- error = probe_contents(dev);
- if (error)
+ if (withprobe && (probe_contents(dev) != 0))
exit(1);
}
@@ -905,7 +934,7 @@ int main(int argc, char *argv[])
opts_get(argc, argv, &opts);
opts_check(&opts);
- open_dev(&opts.dev);
+ open_dev(&opts.dev, !opts.dev.got_topol);
bsize = choose_blocksize(&opts);
if (S_ISREG(opts.dev.stat.st_mode)) {