System information
| Type |
Version/Name |
| Distribution Name |
RHEL / RockyLinux |
| Distribution Version |
RHEL 10.1 / RockyLinux 9.4 |
| Kernel Version |
6.12.0-55.9.1.el10_0.x86_64 / 5.14.0-427.37.1.el9_4.x86_64 |
| Architecture |
x86_64 |
| OpenZFS Version |
zfs-2.4.1 (tag zfs-2.4.1, commit 1c702dd). Also reproduced with zfs-2.4.0 (tag zfs-2.4.0, commit 7433349). |
Describe the problem you're observing
Silent data corruption (zeroed blocks) when dedup is enabled in ZFS 2.4.0 and 2.4.1. File contents are partially or fully replaced by zeros, while file sizes remain identical to the originals. ZFS reports no checksum errors — the corruption is silent.
The corruption is random and intermittent — it can occur in any iteration, affecting any file.
Key observations:
Affected: ZFS 2.4.0 and 2.4.1 with dedup=on
NOT affected: ZFS 2.3.4 with dedup=on (works correctly)
NOT affected: ZFS 2.4.0/2.4.1 with dedup=off (works correctly)
This indicates a regression in the dedup path introduced between ZFS 2.3.4 and 2.4.0.
Tested on two different platforms:
RHEL 10.1 with 4 NVMe raw drives
RockyLinux 9.4 with a 10G loop device
Describe how to reproduce the problem
Step1:
Cloned and checked out zfs-2.4.1/2.4.0 tag
commit 1c702dd (HEAD, tag: zfs-2.4.1)
Author: Tony Hutter <hutter2@llnl.gov>
Date: Wed Feb 11 09:39:28 2026 -0800
Tag zfs-2.4.1
META file and changelog updated.
Signed-off-by: Tony Hutter <[hutter2@llnl.gov](mailto:hutter2@llnl.gov)>
OR
commit 7433349 (HEAD, tag: zfs-2.4.0)
Author: Tony Hutter <hutter2@llnl.gov>
Date: Mon Dec 15 09:52:28 2025 -0800
Tag 2.4.0
Signed-off-by: Tony Hutter <[hutter2@llnl.gov](mailto:hutter2@llnl.gov)>
Step2:
Build ZFS:
sh autogen.sh
/configure --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64 --includedir=/usr/include --sbindir=/usr/sbin
make -j${noproc}
sudo make install
sudo ./scripts/zfs.sh
Step3:
Create a pool and set compression=gzip, checksum=sha256 and dedup=on
Create a encryption dataset withing the pool by setting encryption=on
Set the record size recordsize=
echo 0 | sudo tee /sys/module/zfs/parameters/zfs_compressed_arc_enabled
zpool create -o ashift=12 -f /dev/loop0
zfs set compression=gzip
zfs set primarycache=none
zfs set checksum=sha256
zfs set dedup=on
zfs create -o encryption=on -o keyformat=raw -o keylocation=file:// /
zfs set recordsize=
Step4:
Copy the Silesia corpus files from directory named A to pool/dataset
Copy the files back to another non zfs directory named B.
Step5:
Compared md5sum of each file of directory A and corresponding file directory B.
Step6:
Destroy dataset
Destroy the pool
Repeated the Step3 to Step6 several times for different record sizes 512, 1K, 2K, up to 8M
Include any warning/errors/backtraces from the system logs
System information
Describe the problem you're observing
Silent data corruption (zeroed blocks) when dedup is enabled in ZFS 2.4.0 and 2.4.1. File contents are partially or fully replaced by zeros, while file sizes remain identical to the originals. ZFS reports no checksum errors — the corruption is silent.
The corruption is random and intermittent — it can occur in any iteration, affecting any file.
Key observations:
Affected: ZFS 2.4.0 and 2.4.1 with dedup=on
NOT affected: ZFS 2.3.4 with dedup=on (works correctly)
NOT affected: ZFS 2.4.0/2.4.1 with dedup=off (works correctly)
This indicates a regression in the dedup path introduced between ZFS 2.3.4 and 2.4.0.
Tested on two different platforms:
RHEL 10.1 with 4 NVMe raw drives
RockyLinux 9.4 with a 10G loop device
Describe how to reproduce the problem
Step1:
Cloned and checked out zfs-2.4.1/2.4.0 tag
commit 1c702dd (HEAD, tag: zfs-2.4.1)
Author: Tony Hutter <hutter2@llnl.gov>
Date: Wed Feb 11 09:39:28 2026 -0800
OR
commit 7433349 (HEAD, tag: zfs-2.4.0)
Author: Tony Hutter <hutter2@llnl.gov>
Date: Mon Dec 15 09:52:28 2025 -0800
Step2:
Build ZFS:
sh autogen.sh
/configure --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64 --includedir=/usr/include --sbindir=/usr/sbin
make -j${noproc}
sudo make install
sudo ./scripts/zfs.sh
Step3:
Create a pool and set compression=gzip, checksum=sha256 and dedup=on
Create a encryption dataset withing the pool by setting encryption=on
Set the record size recordsize=
echo 0 | sudo tee /sys/module/zfs/parameters/zfs_compressed_arc_enabled /
zpool create -o ashift=12 -f /dev/loop0
zfs set compression=gzip
zfs set primarycache=none
zfs set checksum=sha256
zfs set dedup=on
zfs create -o encryption=on -o keyformat=raw -o keylocation=file://
zfs set recordsize=
Step4:
Copy the Silesia corpus files from directory named A to pool/dataset
Copy the files back to another non zfs directory named B.
Step5:
Compared md5sum of each file of directory A and corresponding file directory B.
Step6:
Destroy dataset
Destroy the pool
Repeated the Step3 to Step6 several times for different record sizes 512, 1K, 2K, up to 8M
Include any warning/errors/backtraces from the system logs