summaryrefslogtreecommitdiffstats
path: root/module/zfs
diff options
context:
space:
mode:
authorRichard Yao <[email protected]>2015-09-18 08:32:52 -0400
committerBrian Behlendorf <[email protected]>2015-09-19 14:00:14 -0700
commitf52ebcb3eb1630694648237ad6d439c226c3dd99 (patch)
treef83908c5a2f642ffc4ec1ecb2104784c15139e67 /module/zfs
parent7a27ad00ae142b38d4aef8cc0af7a72b4c0e44fe (diff)
Discard on zvols should not exceed the length of a block
37f9dac592bf5889c3efb305c48ac39b4c7dd140 replaced the end-start calculation with a cached value, but neglected to update it on discard operations. This can cause us to discard data not requested, causing data loss on zvols. Reported-by: Richard Connon <[email protected]> Signed-off-by: Richard Yao <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #3798
Diffstat (limited to 'module/zfs')
-rw-r--r--module/zfs/zvol.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c
index bcdd8e8de..37c39d19a 100644
--- a/module/zfs/zvol.c
+++ b/module/zfs/zvol.c
@@ -662,6 +662,7 @@ zvol_discard(struct bio *bio)
if (!(bio->bi_rw & REQ_SECURE)) {
start = P2ROUNDUP(start, zv->zv_volblocksize);
end = P2ALIGN(end, zv->zv_volblocksize);
+ size = end - start;
}
#endif