dm: allow targets to require splitting WRITE_ZEROES and SECURE_ERASE
authorMike Snitzer <snitzer@kernel.org>
Fri, 14 Apr 2023 16:07:27 +0000 (12:07 -0400)
committerMike Snitzer <snitzer@kernel.org>
Fri, 14 Apr 2023 16:07:27 +0000 (12:07 -0400)
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>
drivers/md/dm.c
include/linux/device-mapper.h

index 20c6b72..244ebb8 100644 (file)
@@ -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;
index f2d9afb..983f1f0 100644 (file)
@@ -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;