From 52a744f6a5adb89c0e6a8fc4245de70ec7ec4db0 Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Fri, 18 Sep 2015 08:32:52 -0400 Subject: [PATCH] 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 Signed-off-by: Richard Yao Signed-off-by: Brian Behlendorf Closes #3798 --- module/zfs/zvol.c | 1 + 1 file changed, 1 insertion(+) diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index 00f3e709b11a..b34273509a2b 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -637,6 +637,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