diff --git a/pkgs/os-specific/linux/zfs/0.6.5-fix-corruption.patch b/pkgs/os-specific/linux/zfs/0.6.5-fix-corruption.patch new file mode 100644 index 00000000000..af4ce1333c8 --- /dev/null +++ b/pkgs/os-specific/linux/zfs/0.6.5-fix-corruption.patch @@ -0,0 +1,28 @@ +From 96165264ad0afe7a5d440ef49f9712a188486266 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 +--- + module/zfs/zvol.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c +index 492f8ff..c5a8071 100644 +--- a/module/zfs/zvol.c ++++ b/module/zfs/zvol.c +@@ -661,6 +661,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 + diff --git a/pkgs/os-specific/linux/zfs/default.nix b/pkgs/os-specific/linux/zfs/default.nix index bd79ef51422..df74f1c76e2 100644 --- a/pkgs/os-specific/linux/zfs/default.nix +++ b/pkgs/os-specific/linux/zfs/default.nix @@ -10,5 +10,8 @@ callPackage ./generic.nix (args // rec { sha256 = "1jqm2a9mldp4km5m454zszsw6p8hrqd7xrbf52pgp82kf5w3d6wz"; }; - patches = [ ./nix-build.patch ]; + patches = [ + ./nix-build.patch + ./0.6.5-fix-corruption.patch + ]; }) diff --git a/pkgs/os-specific/linux/zfs/git.nix b/pkgs/os-specific/linux/zfs/git.nix index 175926f9657..bf127301d2e 100644 --- a/pkgs/os-specific/linux/zfs/git.nix +++ b/pkgs/os-specific/linux/zfs/git.nix @@ -10,7 +10,10 @@ callPackage ./generic.nix (args // rec { sha256 = "1jqm2a9mldp4km5m454zszsw6p8hrqd7xrbf52pgp82kf5w3d6wz"; }; - patches = [ ./nix-build.patch ]; + patches = [ + ./nix-build.patch + ./0.6.5-fix-corruption.patch + ]; spl = spl_git; })