dm: eliminate ‘split_discard_bios’ flag from DM target interface [Linux 5.1]

dm: eliminate ‘split_discard_bios’ flag from DM target interface [Linux 5.1]

This Linux kernel change "dm: eliminate ‘split_discard_bios’ flag from DM target interface" is included in the Linux 5.1 release. This change is authored by Mike Snitzer <snitzer [at] redhat.com> on Fri Jan 18 14:19:26 2019 -0500. The commit for this change in Linux stable tree is 61697a6 (patch).

dm: eliminate 'split_discard_bios' flag from DM target interface

There is no need to have DM core split discards on behalf of a DM target
now that blk_queue_split() handles splitting discards based on the
queue_limits.  A DM target just needs to set max_discard_sectors,
discard_granularity, etc, in queue_limits.

Signed-off-by: Mike Snitzer <snitzer@redhat.com>

There are 52 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/md/dm-cache-target.c  |  1 -
 drivers/md/dm-raid.c          | 14 +++++++++-----
 drivers/md/dm-thin.c          |  1 -
 drivers/md/dm-zoned-target.c  |  1 -
 drivers/md/dm.c               | 25 ++++++-------------------
 include/linux/device-mapper.h |  6 ------
 include/uapi/linux/dm-ioctl.h |  4 ++--
 7 files changed, 17 insertions(+), 35 deletions(-)

diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
index b29a832..adc529f 100644
--- a/drivers/md/dm-cache-target.c
+++ b/drivers/md/dm-cache-target.c
@@ -2496,7 +2496,6 @@ static int cache_create(struct cache_args *ca, struct cache **result)

    ti->num_discard_bios = 1;
    ti->discards_supported = true;
-   ti->split_discard_bios = false;

    ti->per_io_data_size = sizeof(struct per_bio_data);

diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index adcfe8a..9fdef68 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -2986,11 +2986,6 @@ static void configure_discard_support(struct raid_set *rs)
        }
    }

-   /*
-    * RAID1 and RAID10 personalities require bio splitting,
-    * RAID0/4/5/6 don't and process large discard bios properly.
-    */
-   ti->split_discard_bios = !!(rs_is_raid1(rs) || rs_is_raid10(rs));
    ti->num_discard_bios = 1;
 }

@@ -3747,6 +3742,15 @@ static void raid_io_hints(struct dm_target *ti, struct queue_limits *limits)

    blk_limits_io_min(limits, chunk_size);
    blk_limits_io_opt(limits, chunk_size * mddev_data_stripes(rs));
+
+   /*
+    * RAID1 and RAID10 personalities require bio splitting,
+    * RAID0/4/5/6 don't and process large discard bios properly.
+    */
+   if (rs_is_raid1(rs) || rs_is_raid10(rs)) {
+       limits->discard_granularity = chunk_size;
+       limits->max_discard_sectors = chunk_size;
+   }
 }

 static void raid_postsuspend(struct dm_target *ti)
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index e83b636..0d9ded0 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -4227,7 +4227,6 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv)
    if (tc->pool->pf.discard_enabled) {
        ti->discards_supported = true;
        ti->num_discard_bios = 1;
-       ti->split_discard_bios = false;
    }

    mutex_unlock(&dm_thin_pool_table.mutex);
diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c
index 6af5bab..8865c17 100644
--- a/drivers/md/dm-zoned-target.c
+++ b/drivers/md/dm-zoned-target.c
@@ -727,7 +727,6 @@ static int dmz_ctr(struct dm_target *ti, unsigned int argc, char **argv)
    ti->per_io_data_size = sizeof(struct dmz_bioctx);
    ti->flush_supported = true;
    ti->discards_supported = true;
-   ti->split_discard_bios = true;

    /* The exposed capacity is the number of chunks that can be mapped */
    ti->len = (sector_t)dmz_nr_chunks(dmz->metadata) << dev->zone_nr_sectors_shift;
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 7a774fc..55f12df 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1478,17 +1478,10 @@ static unsigned get_num_write_zeroes_bios(struct dm_target *ti)
    return ti->num_write_zeroes_bios;
 }

-typedef bool (*is_split_required_fn)(struct dm_target *ti);
-
-static bool is_split_required_for_discard(struct dm_target *ti)
-{
-   return ti->split_discard_bios;
-}
-
 static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *ti,
-                      unsigned num_bios, bool is_split_required)
+                      unsigned num_bios)
 {
-   unsigned len;
+   unsigned len = ci->sector_count;

    /*
     * Even though the device advertised support for this type of
@@ -1499,11 +1492,6 @@ static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *
    if (!num_bios)
        return -EOPNOTSUPP;

-   if (!is_split_required)
-       len = min((sector_t)ci->sector_count, max_io_len_target_boundary(ci->sector, ti));
-   else
-       len = min((sector_t)ci->sector_count, max_io_len(ci->sector, ti));
-
    __send_duplicate_bios(ci, ti, num_bios, &len);

    ci->sector += len;
@@ -1514,23 +1502,22 @@ static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *

 static int __send_discard(struct clone_info *ci, struct dm_target *ti)
 {
-   return __send_changing_extent_only(ci, ti, get_num_discard_bios(ti),
-                      is_split_required_for_discard(ti));
+   return __send_changing_extent_only(ci, ti, get_num_discard_bios(ti));
 }

 static int __send_secure_erase(struct clone_info *ci, struct dm_target *ti)
 {
-   return __send_changing_extent_only(ci, ti, get_num_secure_erase_bios(ti), false);
+   return __send_changing_extent_only(ci, ti, get_num_secure_erase_bios(ti));
 }

 static int __send_write_same(struct clone_info *ci, struct dm_target *ti)
 {
-   return __send_changing_extent_only(ci, ti, get_num_write_same_bios(ti), false);
+   return __send_changing_extent_only(ci, ti, get_num_write_same_bios(ti));
 }

 static int __send_write_zeroes(struct clone_info *ci, struct dm_target *ti)
 {
-   return __send_changing_extent_only(ci, ti, get_num_write_zeroes_bios(ti), false);
+   return __send_changing_extent_only(ci, ti, get_num_write_zeroes_bios(ti));
 }

 static bool is_abnormal_io(struct bio *bio)
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
index e528bae..0f5b3d7 100644
--- a/include/linux/device-mapper.h
+++ b/include/linux/device-mapper.h
@@ -315,12 +315,6 @@ struct dm_target {
     * whether or not its underlying devices have support.
     */
    bool discards_supported:1;
-
-   /*
-    * Set if the target required discard bios to be split
-    * on max_io_len boundary.
-    */
-   bool split_discard_bios:1;
 };

 /* Each target can link one of these into the table */
diff --git a/include/uapi/linux/dm-ioctl.h b/include/uapi/linux/dm-ioctl.h
index d1e4951..f396a82 100644
--- a/include/uapi/linux/dm-ioctl.h
+++ b/include/uapi/linux/dm-ioctl.h
@@ -270,9 +270,9 @@ enum {
 #define DM_DEV_SET_GEOMETRY    _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)

 #define DM_VERSION_MAJOR   4
-#define DM_VERSION_MINOR   39
+#define DM_VERSION_MINOR   40
 #define DM_VERSION_PATCHLEVEL  0
-#define DM_VERSION_EXTRA   "-ioctl (2018-04-03)"
+#define DM_VERSION_EXTRA   "-ioctl (2019-01-18)"

 /* Status bits */
 #define DM_READONLY_FLAG   (1 << 0) /* In/Out */

Leave a Reply

Your email address will not be published. Required fields are marked *