mirror_zfs/module/os/linux/zfs
Brian Atkinson b4e4cbeb20
Always validate checksums for Direct I/O reads
This fixes an oversight in the Direct I/O PR. There is nothing that
stops a process from manipulating the contents of a buffer for a
Direct I/O read while the I/O is in flight. This can lead checksum
verify failures. However, the disk contents are still correct, and this
would lead to false reporting of checksum validation failures.

To remedy this, all Direct I/O reads that have a checksum verification
failure are treated as suspicious. In the event a checksum validation
failure occurs for a Direct I/O read, then the I/O request will be
reissued though the ARC. This allows for actual validation to happen and
removes any possibility of the buffer being manipulated after the I/O
has been issued.

Just as with Direct I/O write checksum validation failures, Direct I/O
read checksum validation failures are reported though zpool status -d in
the DIO column. Also the zevent has been updated to have both:
1. dio_verify_wr -> Checksum verification failure for writes
2. dio_verify_rd -> Checksum verification failure for reads.
This allows for determining what I/O operation was the culprit for the
checksum verification failure. All DIO errors are reported only on the
top-level VDEV.

Even though FreeBSD can write protect pages (stable pages) it still has
the same issue as Linux with Direct I/O reads.

This commit updates the following:
1. Propogates checksum failures for reads all the way up to the
   top-level VDEV.
2. Reports errors through zpool status -d as DIO.
3. Has two zevents for checksum verify errors with Direct I/O. One for
   read and one for write.
4. Updates FreeBSD ABD code to also check for ABD_FLAG_FROM_PAGES and
   handle ABD buffer contents validation the same as Linux.
5. Updated manipulate_user_buffer.c to also manipulate a buffer while a
   Direct I/O read is taking place.
6. Adds a new ZTS test case dio_read_verify that stress tests the new
   code.
7. Updated man pages.
8. Added an IMPLY statement to zio_checksum_verify() to make sure that
   Direct I/O reads are not issued as speculative.
9. Removed self healing through mirror, raidz, and dRAID VDEVs for
   Direct I/O reads.

This issue was first observed when installing a Windows 11 VM on a ZFS
dataset with the dataset property direct set to always. The zpool
devices would report checksum failures, but running a subsequent zpool
scrub would not repair any data and report no errors.

Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Brian Atkinson <batkinson@lanl.gov>
Closes #16598
2024-10-09 12:28:08 -07:00
..
abd_os.c Always validate checksums for Direct I/O reads 2024-10-09 12:28:08 -07:00
arc_os.c arc_os: split userspace and Linux kernel code 2024-09-19 15:48:54 -07:00
mmp_os.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
policy.c config: remove HAVE_HAS_CAPABILITY 2024-09-18 11:23:51 -07:00
qat_compress.c Intel QAT 1.7 compatibility 2023-09-07 14:38:17 -07:00
qat_crypt.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
qat.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
spa_misc_os.c Selectable block allocators 2023-09-01 18:00:30 -07:00
trace.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
vdev_disk.c config: remove HAVE_BIO_SET_DEV 2024-09-18 11:23:51 -07:00
vdev_file.c zfs_file: rename zfs_file_fallocate to zfs_file_deallocate 2024-09-18 11:35:04 -07:00
vdev_label_os.c RAID-Z expansion feature 2023-11-08 10:19:41 -08:00
zfs_acl.c Fix an uninitialized data access (#16511) 2024-09-10 09:08:45 -07:00
zfs_ctldir.c snapdir: add 'disabled' value to make .zfs inaccessible 2024-10-02 09:12:02 -07:00
zfs_debug.c zfs_debug: specific variant for userspace 2024-09-19 15:49:50 -07:00
zfs_dir.c snapdir: add 'disabled' value to make .zfs inaccessible 2024-10-02 09:12:02 -07:00
zfs_file_os.c zfs_file: rename zfs_file_fallocate to zfs_file_deallocate 2024-09-18 11:35:04 -07:00
zfs_ioctl_os.c linux: log a scary warning when used with an experimental kernel 2024-09-23 10:44:54 -07:00
zfs_racct.c Adding Direct IO Support 2024-09-14 13:47:59 -07:00
zfs_sysfs.c Introduce kmem_scnprintf() 2022-10-29 13:05:11 -07:00
zfs_uio.c config: remove HAVE_GET_USER_PAGES_* 2024-09-18 11:23:51 -07:00
zfs_vfsops.c snapdir: add 'disabled' value to make .zfs inaccessible 2024-10-02 09:12:02 -07:00
zfs_vnops_os.c Support for longnames for files/directories (Linux part) 2024-10-01 13:40:27 -07:00
zfs_znode_os.c Linux 6.12: PG_error flag was removed 2024-10-01 13:54:05 -07:00
zio_crypt.c ZIL: Assert record sizes in different places 2023-11-28 13:35:14 -08:00
zpl_ctldir.c snapdir: add 'disabled' value to make .zfs inaccessible 2024-10-02 09:12:02 -07:00
zpl_export.c Support for longnames for files/directories (Linux part) 2024-10-01 13:40:27 -07:00
zpl_file_range.c config: remove HAVE_VFS_COPY_FILE_RANGE 2024-09-18 11:23:50 -07:00
zpl_file.c Avoid BUG in migrate_folio_extra 2024-09-26 08:57:09 -07:00
zpl_inode.c Support for longnames for files/directories (Linux part) 2024-10-01 13:40:27 -07:00
zpl_super.c config: remove HAVE_INODE_SET_IVERSION 2024-09-18 11:23:50 -07:00
zpl_xattr.c Allocate zap_attribute_t from kmem instead of stack 2024-10-01 13:39:08 -07:00
zvol_os.c cityhash: replace invocations with specialized versions when possible 2024-09-19 15:19:17 -07:00