I don’t know much about btrfs so I’ll stick to ZFS related comments. ZFS does not use CRC, by default it uses fletcher4 checksum.
Fletcher’s checksum is made to approach CRC properties without the computational overhead usually associated with CRC.
Without a checksum, there is no way to tell if the data you read back is different from what you wrote down.
As you said corruption can happen for a variety of reason – due to bugs or HW failure anywhere in the storage stack.
Just like other filesystems not all types of corruption will be caught even by ZFS, especially on the write to disk side.
However, ZFS will catch bit rot and a host of other corruptions, while non-checksumming filesystems will just pass the corrupted data
back to the application. Hard drives don’t do it better, they have no idea if they’ve bit rotted over time and there are many other
components that may and do corrupt data, it’s not as rare as you think. The longer you hold data and the more data you have the higher
the chance you will see corruption at some point.
I want to do my best to avoid corrupting data and then giving it back to my users so I would like to know if my data has been
corrupted (not to mention I’d like it to self-heal as well which is what ZFS will do if there is a good copy available).
If you care about your data use a checksumming filesystem period. Ideally, a checksumming filesystem that doesn’t keep the
checksum next to the data. A typical checksum is less than 0.14 Kb while a block that it’s protecting is 128 Kb by default.
I’ll take that 0.1% “waste of space” to detect corruption all day, any day. Now let’s remember ZFS can also do in-line compression
which will easily save you 3-50% of storage space (depending on the data you’re storing) and calling a checksum a “waste of space” is even more laughable.
I do want to say that I wholeheartedly agree with “Nothing replaces backups” no matter what filesystem you’re using.
Backing up between two OpenZFS pools machines in different physical location is super easy using zfs snapshot-ting and send/receive functionality.