mirror_zfs/module/os/linux/zfs
Rob Norris f237b8e2a4 vdev_disk: try harder to ensure IO alignment rules
It seems out our notion of "properly" aligned IO was incomplete. In
particular, dm-crypt does its own splitting, and assumes that a logical
block will never cross an order-0 page boundary (ie, the physical page
size, not compound size). This effectively means that it needs to be
possible to split a BIO at any page or block size boundary and have it
work correctly.

This updates the alignment check function to enforce these rules (to the
extent possible).

Our response to misaligned data is to make some new allocation that is
properly aligned, and copy the data into it. It turns out that
linearising (via abd_borrow_buf()) is not enough, because we allocate eg
4K blocks from a general purpose slab, and so may receive (or already
have) a 4K block that crosses pages.

So instead, we allocate a new ABD, which is guaranteed to be aligned
properly to block sizes, and then copy everything into it, and back out
on the way back.

Sponsored-by: Klara, Inc.
Sponsored-by: Wasabi Technology, Inc.
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
Closes #16687 #16631 #15646 #15533 #14533
(cherry picked from commit 63bafe60ec741c269d29e26b192a8a5c4f6acf92)
2024-11-06 10:06:30 -08:00
..
abd_os.c abd_iter_page: rework to handle multipage scatterlists 2024-07-17 14:54:46 -07:00
arc_os.c linux 6.7 compat: rework shrinker setup for heap allocations 2023-12-21 11:03:08 -08: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 Linux 6.3 compat: idmapped mount API changes 2023-04-10 14:15:36 -07:00
qat_compress.c Intel QAT 1.7 compatibility 2023-09-07 16:10:52 -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 Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
trace.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
vdev_disk.c vdev_disk: try harder to ensure IO alignment rules 2024-11-06 10:06:30 -08:00
vdev_file.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
zfs_acl.c Fix an uninitialized data access (#16511) 2024-11-05 15:43:52 -08:00
zfs_ctldir.c Fix inconsistent mount options for ZFS root 2024-11-05 15:43:53 -08:00
zfs_debug.c Cleanup: Replace oldstyle struct hack with C99 flexible array members 2023-01-12 16:00:03 -08:00
zfs_dir.c Linux 6.3 compat: idmapped mount API changes 2023-04-10 14:15:36 -07:00
zfs_file_os.c Cleanup: Remove branches that always evaluate the same way 2022-11-03 10:47:48 -07:00
zfs_ioctl_os.c Linux 6.3 compat: idmapped mount API changes 2023-04-10 14:15:36 -07:00
zfs_racct.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
zfs_sysfs.c [2.2.5-only] Make 'rmmod zfs' work after zfs-2.2.4 (#16406) 2024-08-02 18:03:09 -07:00
zfs_uio.c zvol: Remove broken blk-mq optimization 2023-11-06 16:47:24 -08:00
zfs_vfsops.c Fix inconsistent mount options for ZFS root 2024-11-05 15:43:53 -08:00
zfs_vnops_os.c Linux 6.11: add compat macro for page_mapping() 2024-08-22 15:42:14 -07:00
zfs_znode.c linux 6.7 compat: use inode atime/mtime accessors 2023-12-21 11:03:08 -08:00
zio_crypt.c ZIL: Assert record sizes in different places 2024-01-08 16:11:39 -08:00
zpl_ctldir.c Linux 6.6 compat: generic_fillattr has a new u32 request_mask added at arg2 2023-11-08 12:15:41 -08:00
zpl_export.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
zpl_file_range.c Linux 6.8 compat: use splice_copy_file_range() for fallback 2024-03-21 09:35:17 -07:00
zpl_file.c Fix corruption caused by mmap flushing problems 2024-03-29 17:10:04 -07:00
zpl_inode.c linux 6.7 compat: use inode atime/mtime accessors 2023-12-21 11:03:08 -08:00
zpl_super.c Unify arc_prune_async() code 2023-11-08 12:15:41 -08:00
zpl_xattr.c Linux 6.6 compat: use inode_get/set_ctime*(...) 2023-11-08 12:15:41 -08:00
zvol_os.c linux/zvol_os: fix zvol queue limits initialization 2024-08-26 15:10:16 -07:00