mirror_zfs/module/os/linux/zfs
Brian Behlendorf c7db374ac6 Fix buffered/direct/mmap I/O race
When a page is faulted in for memory mapped I/O the page lock
may be dropped before it has been read and marked up to date.
If a buffered read encounters such a page in mappedread() it
must wait until the page has been updated. Failure to do so
will result in a panic on debug builds and incorrect data on
production builds.

The critical part of this change is in mappedread() where pages
which are not up to date are now handled. Additionally, it
includes the following simplifications.

- zfs_getpage() and zfs_fillpage() could be passed an array of
  pages. This could be more efficient if it was used but in
  practice only a single page was ever provided. These
  interfaces were simplified to acknowledge that.

- update_pages() was modified to correctly set the PG_error bit
  on a page when it cannot be read by dmu_read().

- Setting PG_error and PG_uptodate was moved to zfs_fillpage()
  from zpl_readpage_common(). This is consistent with the
  handling in update_pages() and mappedread().

- Minor additional refactoring to comments and variable
  declarations to improve readability.

- Add a test case to exercise concurrent buffered, direct,
  and mmap IO to the same file.

- Reduce the mmap_sync test case default run time.

Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #13608
Closes #14498
2023-04-21 13:12:35 -07:00
..
abd_os.c Avoid small buffer copying on write 2022-07-26 10:10:37 -07:00
arc_os.c Remove b_pabd/b_rabd allocation from arc_hdr_alloc() 2021-09-14 14:31:50 -07:00
Makefile.in Restore FreeBSD resource usage accounting 2021-02-19 22:34:33 -08:00
mmp_os.c Add zfs_multihost_interval tunable handler for FreeBSD 2020-06-23 13:32:42 -07:00
policy.c Fix ACL checks for NFS kernel server 2022-03-20 21:21:18 -07:00
qat_compress.c QAT: Fix uninitialized seed in QAT compression 2023-03-17 11:09:07 -07:00
qat_crypt.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
qat.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
spa_misc_os.c Make spa_history_zone platform-dependent in kernel 2020-03-02 09:43:30 -08:00
trace.c Enable use of DTRACE_PROBE* macros in "spl" module 2019-11-01 13:13:43 -07:00
vdev_disk.c zed: mark disks as REMOVED when they are removed 2023-03-27 11:32:09 -07:00
vdev_file.c module: zfs: fix unused, remove argsused 2022-02-16 17:58:56 -08:00
zfs_acl.c Use fallthrough macro 2021-11-02 09:50:30 -07:00
zfs_ctldir.c Remove zpl_revalidate: fix snapshot rollback 2022-12-01 12:39:42 -08:00
zfs_debug.c Annotated dprintf as printf-like 2021-06-24 13:12:36 -07:00
zfs_dir.c skip permission checks for extended attributes 2023-01-05 11:10:28 -08:00
zfs_file_os.c file reference counts can get corrupted 2021-09-14 12:37:38 -07:00
zfs_ioctl_os.c libzfs: On FreeBSD, use MNT_NOWAIT with getfsstat 2021-06-09 13:05:34 -07:00
zfs_racct.c module: zfs: fix unused, remove argsused 2022-02-16 17:58:56 -08:00
zfs_sysfs.c Linux 5.18 compat: kobj_type.default_attrs replaced with default_groups 2022-04-25 10:00:09 -07:00
zfs_uio.c autoconf: Fail when __copy_from_user_inatomic is a non-GPL symbol 2022-05-20 10:33:24 -07:00
zfs_vfsops.c Remove zpl_revalidate: fix snapshot rollback 2022-12-01 12:39:42 -08:00
zfs_vnops_os.c Fix buffered/direct/mmap I/O race 2023-04-21 13:12:35 -07:00
zfs_znode.c Remove atomics from zh_refcount 2023-03-02 14:37:07 -08:00
zio_crypt.c Linux: Fix uninitialized variable usage in zio_do_crypt_data() 2022-09-27 15:43:26 -07:00
zpl_ctldir.c Linux 5.12 compat: idmapped mounts 2021-03-19 21:00:59 -07:00
zpl_export.c Return required size when encode_fh size too small 2021-05-10 12:13:45 -07:00
zpl_file.c Fix buffered/direct/mmap I/O race 2023-04-21 13:12:35 -07:00
zpl_inode.c linux 6.2 compat: get_acl() got moved to get_inode_acl() in 6.2 2023-01-10 08:43:49 -08:00
zpl_super.c Linux: Fix ZFS_ENTER/ZFS_EXIT/ZFS_VERFY_ZP usage 2020-11-14 10:19:00 -08:00
zpl_xattr.c linux 6.2 compat: zpl_set_acl arg2 is now struct dentry 2023-01-24 15:36:08 -08:00
zvol_os.c Linux 5.20 compat: blk_cleanup_disk() 2022-08-09 09:41:06 -07:00