diff options
author | Richard Yao <[email protected]> | 2015-09-18 08:32:52 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2015-09-19 14:00:14 -0700 |
commit | f52ebcb3eb1630694648237ad6d439c226c3dd99 (patch) | |
tree | f83908c5a2f642ffc4ec1ecb2104784c15139e67 /module/zfs/zvol.c | |
parent | 7a27ad00ae142b38d4aef8cc0af7a72b4c0e44fe (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/zvol.c')
-rw-r--r-- | module/zfs/zvol.c | 1 |
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 |