summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2019-01-18 14:19:26 -0500
committerMike Snitzer <snitzer@redhat.com>2019-02-20 23:24:55 -0500
commit61697a6abd24acba941359c6268a94f4afe4a53d (patch)
tree9c1b1de749c7479a1a9f14392c673f84f4ede9a4
parent568c73a355e0b845dc983aa59c8a8dc69294b275 (diff)
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>
-rw-r--r--drivers/md/dm-cache-target.c1
-rw-r--r--drivers/md/dm-raid.c14
-rw-r--r--drivers/md/dm-thin.c1
-rw-r--r--drivers/md/dm-zoned-target.c1
-rw-r--r--drivers/md/dm.c25
-rw-r--r--include/linux/device-mapper.h6
-rw-r--r--include/uapi/linux/dm-ioctl.h4
7 files changed, 17 insertions, 35 deletions
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
index b29a8327eed1..adc529f12b6b 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)
2496 2496
2497 ti->num_discard_bios = 1; 2497 ti->num_discard_bios = 1;
2498 ti->discards_supported = true; 2498 ti->discards_supported = true;
2499 ti->split_discard_bios = false;
2500 2499
2501 ti->per_io_data_size = sizeof(struct per_bio_data); 2500 ti->per_io_data_size = sizeof(struct per_bio_data);
2502 2501
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index adcfe8ae10aa..9fdef6897316 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)
2986 } 2986 }
2987 } 2987 }
2988 2988
2989 /*
2990 * RAID1 and RAID10 personalities require bio splitting,
2991 * RAID0/4/5/6 don't and process large discard bios properly.
2992 */
2993 ti->split_discard_bios = !!(rs_is_raid1(rs) || rs_is_raid10(rs));
2994 ti->num_discard_bios = 1; 2989 ti->num_discard_bios = 1;
2995} 2990}
2996 2991
@@ -3747,6 +3742,15 @@ static void raid_io_hints(struct dm_target *ti, struct queue_limits *limits)
3747 3742
3748 blk_limits_io_min(limits, chunk_size); 3743 blk_limits_io_min(limits, chunk_size);
3749 blk_limits_io_opt(limits, chunk_size * mddev_data_stripes(rs)); 3744 blk_limits_io_opt(limits, chunk_size * mddev_data_stripes(rs));
3745
3746 /*
3747 * RAID1 and RAID10 personalities require bio splitting,
3748 * RAID0/4/5/6 don't and process large discard bios properly.
3749 */
3750 if (rs_is_raid1(rs) || rs_is_raid10(rs)) {
3751 limits->discard_granularity = chunk_size;
3752 limits->max_discard_sectors = chunk_size;
3753 }
3750} 3754}
3751 3755
3752static void raid_postsuspend(struct dm_target *ti) 3756static void raid_postsuspend(struct dm_target *ti)
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index e83b63608262..0d9ded0f5e50 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)
4227 if (tc->pool->pf.discard_enabled) { 4227 if (tc->pool->pf.discard_enabled) {
4228 ti->discards_supported = true; 4228 ti->discards_supported = true;
4229 ti->num_discard_bios = 1; 4229 ti->num_discard_bios = 1;
4230 ti->split_discard_bios = false;
4231 } 4230 }
4232 4231
4233 mutex_unlock(&dm_thin_pool_table.mutex); 4232 mutex_unlock(&dm_thin_pool_table.mutex);
diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c
index 6af5babe6837..8865c1709e16 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)
727 ti->per_io_data_size = sizeof(struct dmz_bioctx); 727 ti->per_io_data_size = sizeof(struct dmz_bioctx);
728 ti->flush_supported = true; 728 ti->flush_supported = true;
729 ti->discards_supported = true; 729 ti->discards_supported = true;
730 ti->split_discard_bios = true;
731 730
732 /* The exposed capacity is the number of chunks that can be mapped */ 731 /* The exposed capacity is the number of chunks that can be mapped */
733 ti->len = (sector_t)dmz_nr_chunks(dmz->metadata) << dev->zone_nr_sectors_shift; 732 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 7a774fcd0194..55f12df3589d 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)
1478 return ti->num_write_zeroes_bios; 1478 return ti->num_write_zeroes_bios;
1479} 1479}
1480 1480
1481typedef bool (*is_split_required_fn)(struct dm_target *ti);
1482
1483static bool is_split_required_for_discard(struct dm_target *ti)
1484{
1485 return ti->split_discard_bios;
1486}
1487
1488static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *ti, 1481static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *ti,
1489 unsigned num_bios, bool is_split_required) 1482 unsigned num_bios)
1490{ 1483{
1491 unsigned len; 1484 unsigned len = ci->sector_count;
1492 1485
1493 /* 1486 /*
1494 * Even though the device advertised support for this type of 1487 * 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 *
1499 if (!num_bios) 1492 if (!num_bios)
1500 return -EOPNOTSUPP; 1493 return -EOPNOTSUPP;
1501 1494
1502 if (!is_split_required)
1503 len = min((sector_t)ci->sector_count, max_io_len_target_boundary(ci->sector, ti));
1504 else
1505 len = min((sector_t)ci->sector_count, max_io_len(ci->sector, ti));
1506
1507 __send_duplicate_bios(ci, ti, num_bios, &len); 1495 __send_duplicate_bios(ci, ti, num_bios, &len);
1508 1496
1509 ci->sector += len; 1497 ci->sector += len;
@@ -1514,23 +1502,22 @@ static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *
1514 1502
1515static int __send_discard(struct clone_info *ci, struct dm_target *ti) 1503static int __send_discard(struct clone_info *ci, struct dm_target *ti)
1516{ 1504{
1517 return __send_changing_extent_only(ci, ti, get_num_discard_bios(ti), 1505 return __send_changing_extent_only(ci, ti, get_num_discard_bios(ti));
1518 is_split_required_for_discard(ti));
1519} 1506}
1520 1507
1521static int __send_secure_erase(struct clone_info *ci, struct dm_target *ti) 1508static int __send_secure_erase(struct clone_info *ci, struct dm_target *ti)
1522{ 1509{
1523 return __send_changing_extent_only(ci, ti, get_num_secure_erase_bios(ti), false); 1510 return __send_changing_extent_only(ci, ti, get_num_secure_erase_bios(ti));
1524} 1511}
1525 1512
1526static int __send_write_same(struct clone_info *ci, struct dm_target *ti) 1513static int __send_write_same(struct clone_info *ci, struct dm_target *ti)
1527{ 1514{
1528 return __send_changing_extent_only(ci, ti, get_num_write_same_bios(ti), false); 1515 return __send_changing_extent_only(ci, ti, get_num_write_same_bios(ti));
1529} 1516}
1530 1517
1531static int __send_write_zeroes(struct clone_info *ci, struct dm_target *ti) 1518static int __send_write_zeroes(struct clone_info *ci, struct dm_target *ti)
1532{ 1519{
1533 return __send_changing_extent_only(ci, ti, get_num_write_zeroes_bios(ti), false); 1520 return __send_changing_extent_only(ci, ti, get_num_write_zeroes_bios(ti));
1534} 1521}
1535 1522
1536static bool is_abnormal_io(struct bio *bio) 1523static bool is_abnormal_io(struct bio *bio)
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
index e528baebad69..0f5b3d7c6cb3 100644
--- a/include/linux/device-mapper.h
+++ b/include/linux/device-mapper.h
@@ -315,12 +315,6 @@ struct dm_target {
315 * whether or not its underlying devices have support. 315 * whether or not its underlying devices have support.
316 */ 316 */
317 bool discards_supported:1; 317 bool discards_supported:1;
318
319 /*
320 * Set if the target required discard bios to be split
321 * on max_io_len boundary.
322 */
323 bool split_discard_bios:1;
324}; 318};
325 319
326/* Each target can link one of these into the table */ 320/* 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 d1e49514977b..f396a82dfd3e 100644
--- a/include/uapi/linux/dm-ioctl.h
+++ b/include/uapi/linux/dm-ioctl.h
@@ -270,9 +270,9 @@ enum {
270#define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) 270#define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
271 271
272#define DM_VERSION_MAJOR 4 272#define DM_VERSION_MAJOR 4
273#define DM_VERSION_MINOR 39 273#define DM_VERSION_MINOR 40
274#define DM_VERSION_PATCHLEVEL 0 274#define DM_VERSION_PATCHLEVEL 0
275#define DM_VERSION_EXTRA "-ioctl (2018-04-03)" 275#define DM_VERSION_EXTRA "-ioctl (2019-01-18)"
276 276
277/* Status bits */ 277/* Status bits */
278#define DM_READONLY_FLAG (1 << 0) /* In/Out */ 278#define DM_READONLY_FLAG (1 << 0) /* In/Out */