diff options
Diffstat (limited to 'drivers/md/dm-thin.c')
-rw-r--r-- | drivers/md/dm-thin.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index ed063427d676..2c0cf511ec23 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
@@ -2095,6 +2095,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
2095 | * them down to the data device. The thin device's discard | 2095 | * them down to the data device. The thin device's discard |
2096 | * processing will cause mappings to be removed from the btree. | 2096 | * processing will cause mappings to be removed from the btree. |
2097 | */ | 2097 | */ |
2098 | ti->discard_zeroes_data_unsupported = true; | ||
2098 | if (pf.discard_enabled && pf.discard_passdown) { | 2099 | if (pf.discard_enabled && pf.discard_passdown) { |
2099 | ti->num_discard_bios = 1; | 2100 | ti->num_discard_bios = 1; |
2100 | 2101 | ||
@@ -2104,7 +2105,6 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
2104 | * thin devices' discard limits consistent). | 2105 | * thin devices' discard limits consistent). |
2105 | */ | 2106 | */ |
2106 | ti->discards_supported = true; | 2107 | ti->discards_supported = true; |
2107 | ti->discard_zeroes_data_unsupported = true; | ||
2108 | } | 2108 | } |
2109 | ti->private = pt; | 2109 | ti->private = pt; |
2110 | 2110 | ||
@@ -2689,8 +2689,16 @@ static void pool_io_hints(struct dm_target *ti, struct queue_limits *limits) | |||
2689 | * They get transferred to the live pool in bind_control_target() | 2689 | * They get transferred to the live pool in bind_control_target() |
2690 | * called from pool_preresume(). | 2690 | * called from pool_preresume(). |
2691 | */ | 2691 | */ |
2692 | if (!pt->adjusted_pf.discard_enabled) | 2692 | if (!pt->adjusted_pf.discard_enabled) { |
2693 | /* | ||
2694 | * Must explicitly disallow stacking discard limits otherwise the | ||
2695 | * block layer will stack them if pool's data device has support. | ||
2696 | * QUEUE_FLAG_DISCARD wouldn't be set but there is no way for the | ||
2697 | * user to see that, so make sure to set all discard limits to 0. | ||
2698 | */ | ||
2699 | limits->discard_granularity = 0; | ||
2693 | return; | 2700 | return; |
2701 | } | ||
2694 | 2702 | ||
2695 | disable_passdown_if_not_supported(pt); | 2703 | disable_passdown_if_not_supported(pt); |
2696 | 2704 | ||
@@ -2826,10 +2834,10 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
2826 | ti->per_bio_data_size = sizeof(struct dm_thin_endio_hook); | 2834 | ti->per_bio_data_size = sizeof(struct dm_thin_endio_hook); |
2827 | 2835 | ||
2828 | /* In case the pool supports discards, pass them on. */ | 2836 | /* In case the pool supports discards, pass them on. */ |
2837 | ti->discard_zeroes_data_unsupported = true; | ||
2829 | if (tc->pool->pf.discard_enabled) { | 2838 | if (tc->pool->pf.discard_enabled) { |
2830 | ti->discards_supported = true; | 2839 | ti->discards_supported = true; |
2831 | ti->num_discard_bios = 1; | 2840 | ti->num_discard_bios = 1; |
2832 | ti->discard_zeroes_data_unsupported = true; | ||
2833 | /* Discard bios must be split on a block boundary */ | 2841 | /* Discard bios must be split on a block boundary */ |
2834 | ti->split_discard_bios = true; | 2842 | ti->split_discard_bios = true; |
2835 | } | 2843 | } |