diff options
author | Damien Le Moal <damien.lemoal@wdc.com> | 2017-05-08 19:40:50 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-06-19 11:03:51 -0400 |
commit | 0be12c1c7fce7e0f464861a7752d489860c376f9 (patch) | |
tree | 74fcd625e94e72c81a523adb1249ee9179b0ed8d | |
parent | 124c44546d0cbf6dc2daf92cba80cf556e9039c3 (diff) |
dm linear: add support for zoned block devices
Add support for zoned block devices by allowing host-managed zoned block
device mapped targets, the remapping of REQ_OP_ZONE_RESET and the post
processing (reply remapping) of REQ_OP_ZONE_REPORT.
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r-- | drivers/md/dm-linear.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c index 7d42a9d9f406..c03c203a90b4 100644 --- a/drivers/md/dm-linear.c +++ b/drivers/md/dm-linear.c | |||
@@ -89,7 +89,7 @@ static void linear_map_bio(struct dm_target *ti, struct bio *bio) | |||
89 | struct linear_c *lc = ti->private; | 89 | struct linear_c *lc = ti->private; |
90 | 90 | ||
91 | bio->bi_bdev = lc->dev->bdev; | 91 | bio->bi_bdev = lc->dev->bdev; |
92 | if (bio_sectors(bio)) | 92 | if (bio_sectors(bio) || bio_op(bio) == REQ_OP_ZONE_RESET) |
93 | bio->bi_iter.bi_sector = | 93 | bio->bi_iter.bi_sector = |
94 | linear_map_sector(ti, bio->bi_iter.bi_sector); | 94 | linear_map_sector(ti, bio->bi_iter.bi_sector); |
95 | } | 95 | } |
@@ -101,6 +101,17 @@ static int linear_map(struct dm_target *ti, struct bio *bio) | |||
101 | return DM_MAPIO_REMAPPED; | 101 | return DM_MAPIO_REMAPPED; |
102 | } | 102 | } |
103 | 103 | ||
104 | static int linear_end_io(struct dm_target *ti, struct bio *bio, | ||
105 | blk_status_t *error) | ||
106 | { | ||
107 | struct linear_c *lc = ti->private; | ||
108 | |||
109 | if (!*error && bio_op(bio) == REQ_OP_ZONE_REPORT) | ||
110 | dm_remap_zone_report(ti, bio, lc->start); | ||
111 | |||
112 | return DM_ENDIO_DONE; | ||
113 | } | ||
114 | |||
104 | static void linear_status(struct dm_target *ti, status_type_t type, | 115 | static void linear_status(struct dm_target *ti, status_type_t type, |
105 | unsigned status_flags, char *result, unsigned maxlen) | 116 | unsigned status_flags, char *result, unsigned maxlen) |
106 | { | 117 | { |
@@ -161,12 +172,13 @@ static long linear_dax_direct_access(struct dm_target *ti, pgoff_t pgoff, | |||
161 | 172 | ||
162 | static struct target_type linear_target = { | 173 | static struct target_type linear_target = { |
163 | .name = "linear", | 174 | .name = "linear", |
164 | .version = {1, 3, 0}, | 175 | .version = {1, 4, 0}, |
165 | .features = DM_TARGET_PASSES_INTEGRITY, | 176 | .features = DM_TARGET_PASSES_INTEGRITY | DM_TARGET_ZONED_HM, |
166 | .module = THIS_MODULE, | 177 | .module = THIS_MODULE, |
167 | .ctr = linear_ctr, | 178 | .ctr = linear_ctr, |
168 | .dtr = linear_dtr, | 179 | .dtr = linear_dtr, |
169 | .map = linear_map, | 180 | .map = linear_map, |
181 | .end_io = linear_end_io, | ||
170 | .status = linear_status, | 182 | .status = linear_status, |
171 | .prepare_ioctl = linear_prepare_ioctl, | 183 | .prepare_ioctl = linear_prepare_ioctl, |
172 | .iterate_devices = linear_iterate_devices, | 184 | .iterate_devices = linear_iterate_devices, |