dm-flakey: error all IOs when num_features is absent
authorBenjamin Marzinski <bmarzins@redhat.com>
Tue, 22 Apr 2025 23:47:36 +0000 (19:47 -0400)
committerMikulas Patocka <mpatocka@redhat.com>
Sun, 4 May 2025 09:35:05 +0000 (11:35 +0200)
dm-flakey would error all IOs if num_features was 0, but if it was
absent, dm-flakey would never error any IO. Fix this so that no
num_features works the same as num_features set to 0.

Fixes: aa7d7bc99fed7 ("dm flakey: add an "error_reads" option")
Reported-by: Kent Overstreet <kent.overstreet@linux.dev>
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
drivers/md/dm-flakey.c

index f5f8d25d1b2daf2d0c4f585cde7eafb6ac637bb9..35f1708b62e801bb5f825aa07df2a045de011a87 100644 (file)
@@ -53,8 +53,8 @@ struct per_bio_data {
 static int parse_features(struct dm_arg_set *as, struct flakey_c *fc,
                          struct dm_target *ti)
 {
-       int r;
-       unsigned int argc;
+       int r = 0;
+       unsigned int argc = 0;
        const char *arg_name;
 
        static const struct dm_arg _args[] = {
@@ -65,14 +65,13 @@ static int parse_features(struct dm_arg_set *as, struct flakey_c *fc,
                {0, PROBABILITY_BASE, "Invalid random corrupt argument"},
        };
 
-       /* No feature arguments supplied. */
-       if (!as->argc)
-               return 0;
-
-       r = dm_read_arg_group(_args, as, &argc, &ti->error);
-       if (r)
+       if (as->argc && (r = dm_read_arg_group(_args, as, &argc, &ti->error)))
                return r;
 
+       /* No feature arguments supplied. */
+       if (!argc)
+               goto error_all_io;
+
        while (argc) {
                arg_name = dm_shift_arg(as);
                argc--;
@@ -232,6 +231,7 @@ static int parse_features(struct dm_arg_set *as, struct flakey_c *fc,
        if (!fc->corrupt_bio_byte && !test_bit(ERROR_READS, &fc->flags) &&
            !test_bit(DROP_WRITES, &fc->flags) && !test_bit(ERROR_WRITES, &fc->flags) &&
            !fc->random_read_corrupt && !fc->random_write_corrupt) {
+error_all_io:
                set_bit(ERROR_WRITES, &fc->flags);
                set_bit(ERROR_READS, &fc->flags);
        }