summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@kernel.org>2023-04-14 12:07:27 -0400
committerMike Snitzer <snitzer@kernel.org>2023-04-14 12:07:27 -0400
commit13f6facf3faeed34ca381aef4c9b153c7aed3972 (patch)
tree5b178e7ae69f1c9b7c10e91fa20c1acfaee0631a
parent3664ff82dae1ef9f14f7763d3dd30565e7ef9e14 (diff)
downloadlinux-13f6facf3faeed34ca381aef4c9b153c7aed3972.tar.gz
linux-13f6facf3faeed34ca381aef4c9b153c7aed3972.tar.bz2
linux-13f6facf3faeed34ca381aef4c9b153c7aed3972.zip
dm: allow targets to require splitting WRITE_ZEROES and SECURE_ERASE
Introduce max_write_zeroes_granularity and max_secure_erase_granularity flags in the dm_target struct. If a target sets these then DM core will split IO of these operation types accordingly (in terms of max_write_zeroes_sectors and max_secure_erase_sectors respectively). Signed-off-by: Mike Snitzer <snitzer@kernel.org>
-rw-r--r--drivers/md/dm.c10
-rw-r--r--include/linux/device-mapper.h16
2 files changed, 20 insertions, 6 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 20c6b72a0245..244ebb8c316b 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1614,21 +1614,23 @@ static blk_status_t __process_abnormal_io(struct clone_info *ci,
{
unsigned int num_bios = 0;
unsigned int max_granularity = 0;
+ struct queue_limits *limits = dm_get_queue_limits(ti->table->md);
switch (bio_op(ci->bio)) {
case REQ_OP_DISCARD:
num_bios = ti->num_discard_bios;
- if (ti->max_discard_granularity) {
- struct queue_limits *limits =
- dm_get_queue_limits(ti->table->md);
+ if (ti->max_discard_granularity)
max_granularity = limits->max_discard_sectors;
- }
break;
case REQ_OP_SECURE_ERASE:
num_bios = ti->num_secure_erase_bios;
+ if (ti->max_secure_erase_granularity)
+ max_granularity = limits->max_secure_erase_sectors;
break;
case REQ_OP_WRITE_ZEROES:
num_bios = ti->num_write_zeroes_bios;
+ if (ti->max_write_zeroes_granularity)
+ max_granularity = limits->max_write_zeroes_sectors;
break;
default:
break;
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
index f2d9afb8a7e9..983f1f0402b5 100644
--- a/include/linux/device-mapper.h
+++ b/include/linux/device-mapper.h
@@ -359,12 +359,24 @@ struct dm_target {
bool discards_supported:1;
/*
- * Set if this target requires that discards be split on both
- * 'discard_granularity' and 'max_discard_sectors' boundaries.
+ * Set if this target requires that discards be split on
+ * 'max_discard_sectors' boundaries.
*/
bool max_discard_granularity:1;
/*
+ * Set if this target requires that secure_erases be split on
+ * 'max_secure_erase_sectors' boundaries.
+ */
+ bool max_secure_erase_granularity:1;
+
+ /*
+ * Set if this target requires that write_zeroes be split on
+ * 'max_write_zeroes_sectors' boundaries.
+ */
+ bool max_write_zeroes_granularity:1;
+
+ /*
* Set if we need to limit the number of in-flight bios when swapping.
*/
bool limit_swap_bios:1;