summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2023-04-04 18:22:10 +0300
committerMike Snitzer <snitzer@kernel.org>2023-04-04 20:30:17 +0300
commitb6bcb84446810df0c9364ee6e23e07866316beaf (patch)
tree8f0efcea0b73cfc3686d9ed06463ca3c71c3d3d0 /drivers
parent00065f925efb077ade3e7fea49150d798cf87d05 (diff)
downloadlinux-b6bcb84446810df0c9364ee6e23e07866316beaf.tar.xz
dm error: add discard support
Add io_err_io_hints() and set discard limits so that the zero target advertises support for discards. The error target will return -EIO for discards. This is useful when the user combines dm-error with other discard-supporting targets in the same table; without dm-error support, discards would be disabled for the whole combined device. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Tested-by: Milan Broz <gmazyland@gmail.com> Signed-off-by: Mike Snitzer <snitzer@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/md/dm-target.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/md/dm-target.c b/drivers/md/dm-target.c
index 26ea22b1a0d7..97a75f3eed93 100644
--- a/drivers/md/dm-target.c
+++ b/drivers/md/dm-target.c
@@ -119,6 +119,7 @@ static int io_err_ctr(struct dm_target *tt, unsigned int argc, char **args)
* Return error for discards instead of -EOPNOTSUPP
*/
tt->num_discard_bios = 1;
+ tt->discards_supported = true;
return 0;
}
@@ -145,6 +146,13 @@ static void io_err_release_clone_rq(struct request *clone,
{
}
+static void io_err_io_hints(struct dm_target *ti, struct queue_limits *limits)
+{
+ limits->max_discard_sectors = UINT_MAX;
+ limits->max_hw_discard_sectors = UINT_MAX;
+ limits->discard_granularity = 512;
+}
+
static long io_err_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
long nr_pages, enum dax_access_mode mode, void **kaddr,
pfn_t *pfn)
@@ -154,13 +162,14 @@ static long io_err_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
static struct target_type error_target = {
.name = "error",
- .version = {1, 5, 0},
+ .version = {1, 6, 0},
.features = DM_TARGET_WILDCARD,
.ctr = io_err_ctr,
.dtr = io_err_dtr,
.map = io_err_map,
.clone_and_map_rq = io_err_clone_and_map_rq,
.release_clone_rq = io_err_release_clone_rq,
+ .io_hints = io_err_io_hints,
.direct_access = io_err_dax_direct_access,
};