diff options
author | Mike Snitzer <snitzer@kernel.org> | 2023-04-14 12:07:27 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@kernel.org> | 2023-04-14 12:07:27 -0400 |
commit | 13f6facf3faeed34ca381aef4c9b153c7aed3972 (patch) | |
tree | 5b178e7ae69f1c9b7c10e91fa20c1acfaee0631a | |
parent | 3664ff82dae1ef9f14f7763d3dd30565e7ef9e14 (diff) | |
download | linux-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.c | 10 | ||||
-rw-r--r-- | include/linux/device-mapper.h | 16 |
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; |