diff options
author | Mike Snitzer <snitzer@redhat.com> | 2019-01-18 14:19:26 -0500 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2019-02-20 23:24:55 -0500 |
commit | 61697a6abd24acba941359c6268a94f4afe4a53d (patch) | |
tree | 9c1b1de749c7479a1a9f14392c673f84f4ede9a4 | |
parent | 568c73a355e0b845dc983aa59c8a8dc69294b275 (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.c | 1 | ||||
-rw-r--r-- | drivers/md/dm-raid.c | 14 | ||||
-rw-r--r-- | drivers/md/dm-thin.c | 1 | ||||
-rw-r--r-- | drivers/md/dm-zoned-target.c | 1 | ||||
-rw-r--r-- | drivers/md/dm.c | 25 | ||||
-rw-r--r-- | include/linux/device-mapper.h | 6 | ||||
-rw-r--r-- | 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 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 | ||
3752 | static void raid_postsuspend(struct dm_target *ti) | 3756 | static 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 | ||
1481 | typedef bool (*is_split_required_fn)(struct dm_target *ti); | ||
1482 | |||
1483 | static bool is_split_required_for_discard(struct dm_target *ti) | ||
1484 | { | ||
1485 | return ti->split_discard_bios; | ||
1486 | } | ||
1487 | |||
1488 | static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *ti, | 1481 | static 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 | ||
1515 | static int __send_discard(struct clone_info *ci, struct dm_target *ti) | 1503 | static 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 | ||
1521 | static int __send_secure_erase(struct clone_info *ci, struct dm_target *ti) | 1508 | static 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 | ||
1526 | static int __send_write_same(struct clone_info *ci, struct dm_target *ti) | 1513 | static 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 | ||
1531 | static int __send_write_zeroes(struct clone_info *ci, struct dm_target *ti) | 1518 | static 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 | ||
1536 | static bool is_abnormal_io(struct bio *bio) | 1523 | static 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 */ |