Skip to content

Data corruption (zeroed blocks) with dedup enabled in ZFS 2.4.0 RC5 #18366

Description

@saju-p

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type: DefectIncorrect behavior (e.g. crash, hang)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions