From: Damien Le Moal <[email protected]>

With the development of file system support for zoned block devices
(e.g. f2fs), having dm-flakey support for these devices is interesting
to improve testing.

This patch adds support for zoned block devices in dm-flakey, both
host-aware and host-managed. The target type feature is set to
DM_TARGET_ZONED_HM indicate support for host-managed models. The
remaining of the support adds hooks for remapping of REQ_OP_ZONE_RESET
and REQ_OP_ZONE_REPORT bios. Additionally, in the bio completion path,
(backward) remapping of a zone report reply is also added.

Signed-off-by: Damien Le Moal <[email protected]>
---
 drivers/md/dm-flakey.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c
index 13305a1..b419c85 100644
--- a/drivers/md/dm-flakey.c
+++ b/drivers/md/dm-flakey.c
@@ -251,6 +251,8 @@ static int flakey_ctr(struct dm_target *ti, unsigned int 
argc, char **argv)
        return 0;
 
 bad:
+       if (fc->dev)
+               dm_put_device(ti, fc->dev);
        kfree(fc);
        return r;
 }
@@ -275,7 +277,7 @@ static void flakey_map_bio(struct dm_target *ti, struct bio 
*bio)
        struct flakey_c *fc = ti->private;
 
        bio->bi_bdev = fc->dev->bdev;
-       if (bio_sectors(bio))
+       if (bio_sectors(bio) || bio_op(bio) == REQ_OP_ZONE_RESET)
                bio->bi_iter.bi_sector =
                        flakey_map_sector(ti, bio->bi_iter.bi_sector);
 }
@@ -306,6 +308,14 @@ static int flakey_map(struct dm_target *ti, struct bio 
*bio)
        struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct 
per_bio_data));
        pb->bio_submitted = false;
 
+       /* Do not fail reset zone */
+       if (bio_op(bio) == REQ_OP_ZONE_RESET)
+               goto map_bio;
+
+       /* We need to remap reported zones, so remember the BIO iter */
+       if (bio_op(bio) == REQ_OP_ZONE_REPORT)
+               goto map_bio;
+
        /* Are we alive ? */
        elapsed = (jiffies - fc->start_time) / HZ;
        if (elapsed % (fc->up_interval + fc->down_interval) >= fc->up_interval) 
{
@@ -363,6 +373,14 @@ static int flakey_end_io(struct dm_target *ti, struct bio 
*bio, int error)
        struct flakey_c *fc = ti->private;
        struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct 
per_bio_data));
 
+       if (bio_op(bio) == REQ_OP_ZONE_RESET)
+               return error;
+
+       if (bio_op(bio) == REQ_OP_ZONE_REPORT) {
+               dm_remap_zone_report(ti, bio, fc->start);
+               return error;
+       }
+
        if (!error && pb->bio_submitted && (bio_data_dir(bio) == READ)) {
                if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == READ) &&
                    all_corrupt_bio_flags_match(bio, fc)) {
@@ -446,6 +464,7 @@ static int flakey_iterate_devices(struct dm_target *ti, 
iterate_devices_callout_
 static struct target_type flakey_target = {
        .name   = "flakey",
        .version = {1, 4, 0},
+       .features = DM_TARGET_ZONED_HM,
        .module = THIS_MODULE,
        .ctr    = flakey_ctr,
        .dtr    = flakey_dtr,
-- 
2.9.3

Western Digital Corporation (and its subsidiaries) E-mail Confidentiality 
Notice & Disclaimer:

This e-mail and any files transmitted with it may contain confidential or 
legally privileged information of WDC and/or its affiliates, and are intended 
solely for the use of the individual or entity to which they are addressed. If 
you are not the intended recipient, any disclosure, copying, distribution or 
any action taken or omitted to be taken in reliance on it, is prohibited. If 
you have received this e-mail in error, please notify the sender immediately 
and delete the e-mail in its entirety from your system.

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to