summaryrefslogtreecommitdiff
path: root/drivers/md
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2012-09-26 23:45:39 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-05-19 10:54:48 -0700
commit22f9c13508be586b3cf6a531dc980b169c1320fe (patch)
treea22bb6558f6dc403425d4b85739c181b712a56cd /drivers/md
parenta98124aac0b5adc5de8ae54f11322781cb4d85c3 (diff)
downloadlinux-3.10-22f9c13508be586b3cf6a531dc980b169c1320fe.tar.gz
linux-3.10-22f9c13508be586b3cf6a531dc980b169c1320fe.tar.bz2
linux-3.10-22f9c13508be586b3cf6a531dc980b169c1320fe.zip
dm thin: do not set discard_zeroes_data
commit 307615a26e95406c42c95916a66ba50434567e0f upstream. The dm thin pool target claims to support the zeroing of discarded data areas. This turns out to be incorrect when processing discards that do not exactly cover a complete number of blocks, so the target must always set discard_zeroes_data_unsupported. The thin pool target will zero blocks when they are allocated if the skip_block_zeroing feature is not specified. The block layer may send a discard that only partly covers a block. If a thin pool block is partially discarded then there is no guarantee that the discarded data will get zeroed before it is accessed again. Due to this, thin devices cannot claim discards will always zero data. Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com> Cc: Libo Chen <libo.chen@huawei.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm-thin.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index 1555f0b2a2b..7c3ab8fcdbd 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -2027,6 +2027,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)
* thin devices' discard limits consistent).
*/
ti->discards_supported = 1;
+ ti->discard_zeroes_data_unsupported = 1;
}
ti->private = pt;
@@ -2443,7 +2444,6 @@ static void set_discard_limits(struct pool *pool, struct queue_limits *limits)
* bios that overlap 2 blocks.
*/
limits->discard_granularity = pool->sectors_per_block << SECTOR_SHIFT;
- limits->discard_zeroes_data = pool->pf.zero_new_blocks;
}
static void pool_io_hints(struct dm_target *ti, struct queue_limits *limits)