git: 409247a6cbd1 - releng/15.1 - zfs: merge openzfs/zfs@6330a45b0 (zfs-2.4-release) into stable/15

From: Colin Percival <cperciva_at_FreeBSD.org>
Date: Fri, 15 May 2026 00:00:52 UTC
The branch releng/15.1 has been updated by cperciva:

URL: https://cgit.FreeBSD.org/src/commit/?id=409247a6cbd11e3510025e025f3b82184c3de17c

commit 409247a6cbd11e3510025e025f3b82184c3de17c
Author:     Martin Matuska <mm@FreeBSD.org>
AuthorDate: 2026-05-13 19:53:01 +0000
Commit:     Colin Percival <cperciva@FreeBSD.org>
CommitDate: 2026-05-14 23:58:46 +0000

    zfs: merge openzfs/zfs@6330a45b0 (zfs-2.4-release) into stable/15
    
    OpenZFS 2.4.2
    
    Notable upstream pull request merges:
     #18208 6f14581e1 Cleanup allocation class selection
     #18235 7590972f7 Prevent range tree corruption race by updating
                      dnode_sync()
     #18255 b06caaeec range_tree: use zfs_panic_recover() for partial-overlap
                      remove
     #18258 33961142a Fix deadlock on dmu_tx_assign() from vdev_rebuild()
     #18262 02ed09106 Fix check for .cfi_negate_ra_state on aarch64
     #18263 9f92266b7 Fix redundant declaration of dsl_pool_t
     #18276 3862aadf7 Fix vdev_rebuild_range() tx commit
     #18290 a94b137aa FreeBSD: Improve dmesg kernel message prefix
     #18294 938c8c98b draid: fix data corruption after disk clear
     #18310 b40cd9191 Fix s_active leak in zfsvfs_hold() when z_unmounted is
                      true
     #18380 9b8ccbd2c draid: fix import failure after disks replacements
     #18399 4bb759274 Add support for POSIX_FADV_DONTNEED
     #18403 aba3ed30a fix memleak in spa_errlog.c
     #18405 e9a8c6e08 draid: allow seq resilver reads from degraded vdevs
     #18414 da44040bb draid: fix cksum errors after rebuild with degraded disks
     #18421 e7524594a Fix read corruption after block clone after truncate
     #18440 b8addf922 dmu_direct: avoid UAF in dmu_write_direct_done()
     #18473 76fd64ac9 Fix rare cksum errors after rebuild
     #18482 fc87e269e Initialize vr_last_txg for rebuild
     #18489 38501e182 Fix long POSIX_FADV_DONTNEED for single block files
    
    Approved by:    re (cperciva)
    Obtained from:  OpenZFS
    OpenZFS commit: 6330a45b06d20125de679aae5f63ba14082671ef
    OpenZFS tag:    zfs-2.4.2
    
    (cherry picked from commit a40f24ec28554c2387e766a47d2d4cb910d95865)
---
 .../openzfs/.github/workflows/checkstyle.yaml      |   7 +-
 sys/contrib/openzfs/.github/workflows/codeql.yml   |   2 +-
 .../.github/workflows/scripts/generate-ci-type.py  |  33 +-
 .../.github/workflows/scripts/merge_summary.awk    |  38 ++
 .../.github/workflows/scripts/qemu-1-setup.sh      |  43 +-
 .../.github/workflows/scripts/qemu-2-start.sh      |  81 ++-
 .../.github/workflows/scripts/qemu-3-deps-vm.sh    |  22 +-
 .../.github/workflows/scripts/qemu-4-build-vm.sh   |  11 +-
 .../.github/workflows/scripts/qemu-6-tests.sh      |   4 +-
 .../.github/workflows/scripts/qemu-7-prepare.sh    |  47 +-
 .../.github/workflows/scripts/qemu-8-summary.sh    |   8 +-
 .../workflows/scripts/qemu-9-summary-page.sh       |   4 +-
 sys/contrib/openzfs/.github/workflows/smatch.yml   |   4 +-
 sys/contrib/openzfs/.github/workflows/zfs-arm.yml  |  40 ++
 .../.github/workflows/zfs-qemu-packages.yml        |  25 +-
 sys/contrib/openzfs/.github/workflows/zfs-qemu.yml |  46 +-
 sys/contrib/openzfs/.github/workflows/zloop.yml    |   7 +-
 sys/contrib/openzfs/META                           |   4 +-
 sys/contrib/openzfs/Makefile.am                    |   1 +
 sys/contrib/openzfs/README.md                      |  42 +-
 sys/contrib/openzfs/autogen.sh                     |   1 +
 sys/contrib/openzfs/cmd/Makefile.am                |   1 +
 sys/contrib/openzfs/cmd/raidz_test/Makefile.am     |   1 +
 sys/contrib/openzfs/cmd/zdb/Makefile.am            |   1 +
 sys/contrib/openzfs/cmd/zed/Makefile.am            |   1 +
 sys/contrib/openzfs/cmd/zed/zed.d/Makefile.am      |   1 +
 sys/contrib/openzfs/cmd/zed/zed_event.c            |   2 +-
 sys/contrib/openzfs/cmd/zfs/Makefile.am            |   1 +
 sys/contrib/openzfs/cmd/zfs/zfs_main.c             |   2 +-
 sys/contrib/openzfs/cmd/zinject/Makefile.am        |   1 +
 sys/contrib/openzfs/cmd/zpool/Makefile.am          |   1 +
 sys/contrib/openzfs/cmd/zpool_influxdb/Makefile.am |   1 +
 sys/contrib/openzfs/cmd/zstream/Makefile.am        |   1 +
 sys/contrib/openzfs/config/CppCheck.am             |   1 +
 sys/contrib/openzfs/config/Rules.am                |   1 +
 sys/contrib/openzfs/config/Shellcheck.am           |   1 +
 sys/contrib/openzfs/config/Substfiles.am           |   1 +
 sys/contrib/openzfs/config/always-arch.m4          |   1 +
 .../openzfs/config/always-compiler-options.m4      |   1 +
 sys/contrib/openzfs/config/always-cppcheck.m4      |   1 +
 sys/contrib/openzfs/config/always-parallel.m4      |   1 +
 sys/contrib/openzfs/config/always-python.m4        |   1 +
 sys/contrib/openzfs/config/always-pyzfs.m4         |   1 +
 sys/contrib/openzfs/config/always-sed.m4           |   1 +
 sys/contrib/openzfs/config/always-shellcheck.m4    |   1 +
 sys/contrib/openzfs/config/always-system.m4        |   1 +
 sys/contrib/openzfs/config/ax_compare_version.m4   |   1 +
 sys/contrib/openzfs/config/ax_count_cpus.m4        |   1 +
 sys/contrib/openzfs/config/ax_python_devel.m4      |   1 +
 sys/contrib/openzfs/config/ax_restore_flags.m4     |   1 +
 sys/contrib/openzfs/config/ax_save_flags.m4        |   1 +
 sys/contrib/openzfs/config/deb.am                  |  21 +-
 sys/contrib/openzfs/config/find_system_library.m4  |   1 +
 sys/contrib/openzfs/config/gettext.m4              |   1 +
 sys/contrib/openzfs/config/host-cpu-c-abi.m4       |   1 +
 sys/contrib/openzfs/config/iconv.m4                |   1 +
 .../openzfs/config/kernel-access-ok-type.m4        |   1 +
 sys/contrib/openzfs/config/kernel-acl.m4           |  32 +
 sys/contrib/openzfs/config/kernel-add-disk.m4      |   1 +
 sys/contrib/openzfs/config/kernel-assign_str.m4    |   1 +
 sys/contrib/openzfs/config/kernel-automount.m4     |   1 +
 sys/contrib/openzfs/config/kernel-bio.m4           |   1 +
 sys/contrib/openzfs/config/kernel-bio_max_segs.m4  |   1 +
 sys/contrib/openzfs/config/kernel-blk-queue.m4     |  27 +
 sys/contrib/openzfs/config/kernel-blkdev.m4        |   1 +
 .../config/kernel-block-device-operations.m4       |   1 +
 .../openzfs/config/kernel-commit-metadata.m4       |   1 +
 .../openzfs/config/kernel-config-defined.m4        |   1 +
 .../config/kernel-copy-from-user-inatomic.m4       |  29 -
 .../openzfs/config/kernel-cpu_has_feature.m4       |   1 +
 .../openzfs/config/kernel-declare-event-class.m4   |   1 +
 sys/contrib/openzfs/config/kernel-dentry-alias.m4  |  32 +
 .../openzfs/config/kernel-dentry-operations.m4     |   1 +
 .../openzfs/config/kernel-discard-granularity.m4   |   1 +
 sys/contrib/openzfs/config/kernel-drop-inode.m4    |   1 +
 sys/contrib/openzfs/config/kernel-file.m4          |   1 +
 sys/contrib/openzfs/config/kernel-filelock.m4      |  23 +
 .../openzfs/config/kernel-filemap-splice-read.m4   |   1 +
 .../openzfs/config/kernel-flush_dcache_page.m4     |   1 +
 sys/contrib/openzfs/config/kernel-fmode-t.m4       |   1 +
 .../openzfs/config/kernel-follow-down-one.m4       |   1 +
 sys/contrib/openzfs/config/kernel-fpu.m4           |   1 +
 sys/contrib/openzfs/config/kernel-free-inode.m4    |   1 +
 sys/contrib/openzfs/config/kernel-fs-context.m4    |  36 ++
 sys/contrib/openzfs/config/kernel-fst-mount.m4     |  30 -
 sys/contrib/openzfs/config/kernel-fsync-bdev.m4    |   1 +
 .../openzfs/config/kernel-generic_fadvise.m4       |   1 +
 .../openzfs/config/kernel-generic_fillattr.m4      |   1 +
 .../openzfs/config/kernel-generic_io_acct.m4       |   1 +
 sys/contrib/openzfs/config/kernel-genhd-flags.m4   |   1 +
 sys/contrib/openzfs/config/kernel-get-disk-ro.m4   |   1 +
 sys/contrib/openzfs/config/kernel-iattr-vfsid.m4   |   1 +
 sys/contrib/openzfs/config/kernel-idmap_mnt_api.m4 |   1 +
 sys/contrib/openzfs/config/kernel-inode-create.m4  |   1 +
 sys/contrib/openzfs/config/kernel-inode-getattr.m4 |   1 +
 sys/contrib/openzfs/config/kernel-inode-lookup.m4  |   1 +
 .../openzfs/config/kernel-inode-permission.m4      |   1 +
 sys/contrib/openzfs/config/kernel-inode-setattr.m4 |   1 +
 sys/contrib/openzfs/config/kernel-inode-state.m4   |   1 +
 sys/contrib/openzfs/config/kernel-inode-times.m4   |   1 +
 .../openzfs/config/kernel-insert-inode-locked.m4   |   1 +
 .../openzfs/config/kernel-is_owner_or_cap.m4       |   1 +
 sys/contrib/openzfs/config/kernel-kasan-enabled.m4 |   1 +
 .../openzfs/config/kernel-kmap-atomic-args.m4      |   1 +
 .../openzfs/config/kernel-kmap-local-page.m4       |   1 +
 sys/contrib/openzfs/config/kernel-kmem.m4          |   1 +
 sys/contrib/openzfs/config/kernel-kthread.m4       |   1 +
 sys/contrib/openzfs/config/kernel-kuid-helpers.m4  |   1 +
 sys/contrib/openzfs/config/kernel-kuidgid.m4       |   1 +
 .../openzfs/config/kernel-make-request-fn.m4       |   1 +
 sys/contrib/openzfs/config/kernel-misc-minor.m4    |   1 +
 sys/contrib/openzfs/config/kernel-mkdir.m4         |   1 +
 sys/contrib/openzfs/config/kernel-mknod.m4         |   1 +
 sys/contrib/openzfs/config/kernel-mm-page-flags.m4 |   1 +
 sys/contrib/openzfs/config/kernel-mm-pagemap.m4    |   1 +
 sys/contrib/openzfs/config/kernel-namespace.m4     |   1 +
 sys/contrib/openzfs/config/kernel-objtool.m4       |   1 +
 .../config/kernel-pagemap-folio_wait_bit.m4        |   1 +
 .../config/kernel-pagemap-readahead-page.m4        |   1 +
 sys/contrib/openzfs/config/kernel-pde-data.m4      |   1 +
 sys/contrib/openzfs/config/kernel-percpu.m4        |   1 +
 .../openzfs/config/kernel-pin-user-pages.m4        |   1 +
 .../openzfs/config/kernel-proc-operations.m4       |   1 +
 sys/contrib/openzfs/config/kernel-reclaim_state.m4 |   1 +
 .../openzfs/config/kernel-register_sysctl_table.m4 |   1 +
 sys/contrib/openzfs/config/kernel-rename.m4        |   1 +
 .../openzfs/config/kernel-revalidate-disk-size.m4  |   1 +
 sys/contrib/openzfs/config/kernel-sb-dying.m4      |   1 +
 sys/contrib/openzfs/config/kernel-sb-wb-err.m4     |   1 +
 sys/contrib/openzfs/config/kernel-sched.m4         |   1 +
 .../openzfs/config/kernel-security-inode-init.m4   |   1 +
 sys/contrib/openzfs/config/kernel-set-nlink.m4     |   1 +
 .../openzfs/config/kernel-setattr-prepare.m4       |   1 +
 sys/contrib/openzfs/config/kernel-sget-args.m4     |   1 +
 sys/contrib/openzfs/config/kernel-show-options.m4  |   1 +
 sys/contrib/openzfs/config/kernel-shrink.m4        |   1 +
 sys/contrib/openzfs/config/kernel-siginfo.m4       |   1 +
 sys/contrib/openzfs/config/kernel-stdarg.m4        |   1 +
 sys/contrib/openzfs/config/kernel-strlcpy.m4       |   1 +
 sys/contrib/openzfs/config/kernel-symlink.m4       |   1 +
 sys/contrib/openzfs/config/kernel-sysfs.m4         |   1 +
 sys/contrib/openzfs/config/kernel-timer.m4         |   1 +
 sys/contrib/openzfs/config/kernel-tmpfile.m4       |   1 +
 .../openzfs/config/kernel-totalhigh_pages.m4       |   1 +
 .../openzfs/config/kernel-totalram-pages-func.m4   |   1 +
 .../openzfs/config/kernel-truncate-setsize.m4      |   1 +
 sys/contrib/openzfs/config/kernel-types.m4         |   1 +
 sys/contrib/openzfs/config/kernel-usleep_range.m4  |   1 +
 .../openzfs/config/kernel-vfs-file_range.m4        |   1 +
 .../config/kernel-vfs-filemap_dirty_folio.m4       |   1 +
 sys/contrib/openzfs/config/kernel-vfs-fsync.m4     |   1 +
 sys/contrib/openzfs/config/kernel-vfs-iov_iter.m4  |   1 +
 .../openzfs/config/kernel-vfs-migrate_folio.m4     |   1 +
 .../openzfs/config/kernel-vfs-migratepage.m4       |   1 +
 .../openzfs/config/kernel-vfs-read_folio.m4        |   1 +
 sys/contrib/openzfs/config/kernel-vfs-readpages.m4 |   1 +
 .../openzfs/config/kernel-vfs-set_page_dirty.m4    |   1 +
 sys/contrib/openzfs/config/kernel-vfs-writepage.m4 |   1 +
 sys/contrib/openzfs/config/kernel-writeback.m4     |   1 +
 sys/contrib/openzfs/config/kernel-xattr-handler.m4 |   1 +
 sys/contrib/openzfs/config/kernel-zero_page.m4     |   1 +
 sys/contrib/openzfs/config/kernel.m4               |  22 +-
 sys/contrib/openzfs/config/lib-ld.m4               |   1 +
 sys/contrib/openzfs/config/lib-link.m4             |   1 +
 sys/contrib/openzfs/config/lib-prefix.m4           |   1 +
 sys/contrib/openzfs/config/mount-helper.m4         |   1 +
 sys/contrib/openzfs/config/nls.m4                  |   1 +
 sys/contrib/openzfs/config/pkg.m4                  |   1 +
 sys/contrib/openzfs/config/po.m4                   |   1 +
 sys/contrib/openzfs/config/progtest.m4             |   1 +
 sys/contrib/openzfs/config/rpm.am                  |   1 +
 sys/contrib/openzfs/config/tgz.am                  |   1 +
 sys/contrib/openzfs/config/toolchain-cfi.m4        |  33 +
 sys/contrib/openzfs/config/toolchain-simd.m4       |   1 +
 sys/contrib/openzfs/config/user-aio.h.m4           |   1 +
 sys/contrib/openzfs/config/user-backtrace.m4       |   1 +
 sys/contrib/openzfs/config/user-clock_gettime.m4   |   1 +
 sys/contrib/openzfs/config/user-dracut.m4          |   1 +
 sys/contrib/openzfs/config/user-gettext.m4         |   1 +
 sys/contrib/openzfs/config/user-libaio.m4          |   1 +
 sys/contrib/openzfs/config/user-libatomic.m4       |   1 +
 sys/contrib/openzfs/config/user-libblkid.m4        |   1 +
 sys/contrib/openzfs/config/user-libcrypto.m4       |   1 +
 sys/contrib/openzfs/config/user-libexec.m4         |   1 +
 sys/contrib/openzfs/config/user-libfetch.m4        |   1 +
 sys/contrib/openzfs/config/user-libtirpc.m4        |   1 +
 sys/contrib/openzfs/config/user-libudev.m4         |   1 +
 sys/contrib/openzfs/config/user-libunwind.m4       |   1 +
 sys/contrib/openzfs/config/user-libuuid.m4         |   1 +
 sys/contrib/openzfs/config/user-makedev.m4         |   1 +
 sys/contrib/openzfs/config/user-mount-setattr.m4   |  27 +
 sys/contrib/openzfs/config/user-pam.m4             |   1 +
 sys/contrib/openzfs/config/user-runstatedir.m4     |   1 +
 sys/contrib/openzfs/config/user-statx.m4           |   2 +
 sys/contrib/openzfs/config/user-systemd.m4         |   1 +
 sys/contrib/openzfs/config/user-sysvinit.m4        |   1 +
 sys/contrib/openzfs/config/user-udev.m4            |   1 +
 sys/contrib/openzfs/config/user-zlib.m4            |   1 +
 sys/contrib/openzfs/config/user.m4                 |   2 +
 sys/contrib/openzfs/config/zfs-build.m4            |   4 +-
 sys/contrib/openzfs/config/zfs-meta.m4             |   1 +
 sys/contrib/openzfs/configure.ac                   |   2 +-
 sys/contrib/openzfs/contrib/Makefile.am            |   1 +
 .../openzfs/contrib/bash_completion.d/Makefile.am  |   1 +
 sys/contrib/openzfs/contrib/bpftrace/Makefile.am   |   1 +
 sys/contrib/openzfs/contrib/debian/Makefile.am     |   1 +
 sys/contrib/openzfs/contrib/dracut/Makefile.am     |   1 +
 sys/contrib/openzfs/contrib/initramfs/Makefile.am  |   1 +
 sys/contrib/openzfs/contrib/initramfs/scripts/zfs  |   8 +-
 .../openzfs/contrib/pam_zfs_key/Makefile.am        |   1 +
 sys/contrib/openzfs/contrib/pyzfs/Makefile.am      |   1 +
 sys/contrib/openzfs/contrib/zcp/Makefile.am        |   1 +
 sys/contrib/openzfs/etc/Makefile.am                |   1 +
 .../system-generators/zfs-mount-generator.c        |   5 +-
 sys/contrib/openzfs/include/Makefile.am            |   1 +
 sys/contrib/openzfs/include/os/freebsd/Makefile.am |   1 +
 sys/contrib/openzfs/include/os/linux/Makefile.am   |   1 +
 .../include/os/linux/kernel/linux/dcache_compat.h  |   2 +
 .../include/os/linux/kernel/linux/xattr_compat.h   |  17 +
 .../include/os/linux/zfs/sys/zfs_vfsops_os.h       |  14 +-
 sys/contrib/openzfs/include/sys/dbuf.h             |   2 +
 sys/contrib/openzfs/include/sys/dmu.h              |   2 +
 sys/contrib/openzfs/include/sys/dnode.h            |  13 +
 sys/contrib/openzfs/include/sys/spa.h              |   1 +
 sys/contrib/openzfs/include/sys/vdev_raidz_impl.h  |   1 +
 sys/contrib/openzfs/include/sys/vdev_rebuild.h     |   4 +-
 sys/contrib/openzfs/lib/Makefile.am                |   1 +
 sys/contrib/openzfs/lib/libavl/Makefile.am         |   1 +
 sys/contrib/openzfs/lib/libefi/Makefile.am         |   1 +
 sys/contrib/openzfs/lib/libicp/Makefile.am         |   1 +
 sys/contrib/openzfs/lib/libnvpair/Makefile.am      |   1 +
 sys/contrib/openzfs/lib/libspl/Makefile.am         |   1 +
 sys/contrib/openzfs/lib/libspl/include/Makefile.am |   1 +
 .../openzfs/lib/libspl/os/linux/getmntany.c        |   9 +-
 sys/contrib/openzfs/lib/libuutil/uu_ident.c        |   2 +-
 sys/contrib/openzfs/lib/libzdb/Makefile.am         |   1 +
 sys/contrib/openzfs/lib/libzfs/Makefile.am         |   1 +
 sys/contrib/openzfs/lib/libzfs/libzfs_dataset.c    |  49 +-
 sys/contrib/openzfs/lib/libzfs/libzfs_diff.c       |   4 +-
 sys/contrib/openzfs/lib/libzfs/libzfs_impl.h       |  17 +
 sys/contrib/openzfs/lib/libzfs/libzfs_mount.c      |  43 +-
 sys/contrib/openzfs/lib/libzfs/libzfs_pool.c       |   2 +-
 sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c   |   2 +-
 .../openzfs/lib/libzfs/os/freebsd/libzfs_zmount.c  |  11 +
 .../openzfs/lib/libzfs/os/linux/libzfs_mount_os.c  | 143 +++++
 sys/contrib/openzfs/lib/libzfs_core/Makefile.am    |   1 +
 sys/contrib/openzfs/lib/libzfsbootenv/Makefile.am  |   1 +
 sys/contrib/openzfs/lib/libzpool/Makefile.am       |   1 +
 sys/contrib/openzfs/lib/libzstd/Makefile.am        |   1 +
 sys/contrib/openzfs/lib/libzutil/Makefile.am       |   1 +
 .../lib/libzutil/os/linux/zutil_device_path_os.c   |  16 +-
 sys/contrib/openzfs/man/Makefile.am                |   1 +
 .../icp/asm-aarch64/blake3/b3_aarch64_sse2.S       |   4 +-
 .../icp/asm-aarch64/blake3/b3_aarch64_sse41.S      |   4 +-
 sys/contrib/openzfs/module/nvpair/nvpair.c         |   5 +-
 .../openzfs/module/os/freebsd/spl/spl_cmn_err.c    |  10 +-
 .../openzfs/module/os/freebsd/zfs/zfs_vnops_os.c   |   4 +-
 .../openzfs/module/os/linux/zfs/vdev_disk.c        |   4 +
 .../openzfs/module/os/linux/zfs/zfs_ctldir.c       |  35 +-
 sys/contrib/openzfs/module/os/linux/zfs/zfs_uio.c  |  13 +-
 .../openzfs/module/os/linux/zfs/zfs_vfsops.c       | 231 +------
 sys/contrib/openzfs/module/os/linux/zfs/zpl_file.c |  44 +-
 .../openzfs/module/os/linux/zfs/zpl_super.c        | 681 ++++++++++++++++++---
 sys/contrib/openzfs/module/zfs/dbuf.c              |  78 ++-
 sys/contrib/openzfs/module/zfs/dmu.c               |  39 +-
 sys/contrib/openzfs/module/zfs/dmu_direct.c        |   8 +-
 sys/contrib/openzfs/module/zfs/dmu_objset.c        |   2 +-
 sys/contrib/openzfs/module/zfs/dnode.c             |   2 +
 sys/contrib/openzfs/module/zfs/dnode_sync.c        | 105 ++--
 sys/contrib/openzfs/module/zfs/dsl_bookmark.c      |  18 +-
 sys/contrib/openzfs/module/zfs/dsl_dir.c           |   2 +-
 sys/contrib/openzfs/module/zfs/range_tree.c        |   2 +-
 sys/contrib/openzfs/module/zfs/spa.c               |   2 +-
 sys/contrib/openzfs/module/zfs/spa_errlog.c        |   2 +-
 sys/contrib/openzfs/module/zfs/spa_misc.c          |  48 +-
 sys/contrib/openzfs/module/zfs/vdev.c              |  29 +-
 sys/contrib/openzfs/module/zfs/vdev_draid.c        |  76 ++-
 sys/contrib/openzfs/module/zfs/vdev_mirror.c       |  13 +-
 sys/contrib/openzfs/module/zfs/vdev_raidz.c        |  44 +-
 sys/contrib/openzfs/module/zfs/vdev_rebuild.c      |  56 +-
 sys/contrib/openzfs/module/zfs/zfs_ioctl.c         |   1 +
 sys/contrib/openzfs/module/zfs/zio.c               |   6 +-
 sys/contrib/openzfs/rpm/Makefile.am                |   1 +
 sys/contrib/openzfs/scripts/Makefile.am            |   1 +
 sys/contrib/openzfs/scripts/spdxcheck.pl           |  35 +-
 sys/contrib/openzfs/scripts/zfs-tests.sh           |  16 +-
 sys/contrib/openzfs/tests/Makefile.am              |   1 +
 sys/contrib/openzfs/tests/runfiles/common.run      |  15 +-
 sys/contrib/openzfs/tests/runfiles/linux.run       |   4 +
 .../openzfs/tests/test-runner/bin/zts-report.py.in |   3 +-
 sys/contrib/openzfs/tests/zfs-tests/Makefile.am    |   1 +
 sys/contrib/openzfs/tests/zfs-tests/cmd/.gitignore |   2 +
 .../openzfs/tests/zfs-tests/cmd/Makefile.am        |   4 +
 .../tests/zfs-tests/cmd/clone_after_trunc.c        | 117 ++++
 sys/contrib/openzfs/tests/zfs-tests/cmd/setlease.c | 126 ++++
 .../openzfs/tests/zfs-tests/cmd/threadsappend.c    |   8 +-
 .../openzfs/tests/zfs-tests/include/commands.cfg   |   6 +-
 .../openzfs/tests/zfs-tests/include/libtest.shlib  |  15 +
 .../openzfs/tests/zfs-tests/tests/Makefile.am      |  11 +
 .../block_cloning/block_cloning_after_trunc.ksh    |  31 +
 .../tests/functional/cli_root/zfs_list/cleanup.ksh |  30 +
 .../tests/functional/cli_root/zfs_list/setup.ksh   |  32 +
 .../cli_root/zfs_list/zfs_list_009_pos.ksh         |  69 +++
 .../tests/functional/fadvise/fadvise_dontneed.ksh  |  70 +++
 .../zfs-tests/tests/functional/lease/cleanup.ksh   |  26 +
 .../tests/functional/lease/lease_setlease.ksh      |  44 ++
 .../zfs-tests/tests/functional/lease/setup.ksh     |  27 +
 .../tests/functional/redundancy/redundancy.kshlib  |  71 ++-
 .../functional/redundancy/redundancy_draid.ksh     |  12 +-
 .../redundancy/redundancy_draid_damaged1.ksh       |   7 +-
 .../redundancy/redundancy_draid_damaged2.ksh       |  14 +-
 .../redundancy/redundancy_draid_degraded1.ksh      | 136 ++++
 .../redundancy/redundancy_draid_degraded2.ksh      | 152 +++++
 .../redundancy/redundancy_draid_spare1.ksh         |  13 +-
 .../redundancy/redundancy_draid_spare2.ksh         |   8 +-
 .../redundancy/redundancy_draid_spare3.ksh         |  28 +-
 sys/contrib/openzfs/udev/Makefile.am               |   1 +
 sys/modules/zfs/zfs_config.h                       |  29 +-
 sys/modules/zfs/zfs_gitrev.h                       |   2 +-
 319 files changed, 3254 insertions(+), 837 deletions(-)

diff --git a/sys/contrib/openzfs/.github/workflows/checkstyle.yaml b/sys/contrib/openzfs/.github/workflows/checkstyle.yaml
index a01a4fe8587c..ddcc2b8581fa 100644
--- a/sys/contrib/openzfs/.github/workflows/checkstyle.yaml
+++ b/sys/contrib/openzfs/.github/workflows/checkstyle.yaml
@@ -56,9 +56,10 @@ jobs:
     - name: Prepare artifacts
       if: failure() && steps.CheckABI.outcome == 'failure'
       run: |
-        find -name *.abi | tar -cf abi_files.tar -T -
-    - uses: actions/upload-artifact@v4
+        find -name *.abi | tar -cjf abi_files.tar.bz2 -T -
+    - uses: actions/upload-artifact@v7
       if: failure() && steps.CheckABI.outcome == 'failure'
       with:
         name: New ABI files (use only if you're sure about interface changes)
-        path: abi_files.tar
+        path: abi_files.tar.bz2
+        archive: false
diff --git a/sys/contrib/openzfs/.github/workflows/codeql.yml b/sys/contrib/openzfs/.github/workflows/codeql.yml
index e975d7dd00b9..689fe71fddc3 100644
--- a/sys/contrib/openzfs/.github/workflows/codeql.yml
+++ b/sys/contrib/openzfs/.github/workflows/codeql.yml
@@ -28,7 +28,7 @@ jobs:
         echo "MAKEFLAGS=-j$(nproc)" >> $GITHUB_ENV
 
     - name: Checkout repository
-      uses: actions/checkout@v4
+      uses: actions/checkout@v6
 
     - name: Initialize CodeQL
       uses: github/codeql-action/init@v3
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/generate-ci-type.py b/sys/contrib/openzfs/.github/workflows/scripts/generate-ci-type.py
index 059d6ad3872b..b1910ab630af 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/generate-ci-type.py
+++ b/sys/contrib/openzfs/.github/workflows/scripts/generate-ci-type.py
@@ -3,13 +3,16 @@
 """
 Determine the CI type based on the change list and commit message.
 
-Prints "quick" if (explicity required by user):
+Output format: "<type> <source>" where source is "manual" (from
+ZFS-CI-Type commit tag) or "auto" (from file change heuristics).
+
+Prints "quick manual" if:
 - the *last* commit message contains 'ZFS-CI-Type: quick'
-or if (heuristics):
+or "quick auto" if (heuristics):
 - the files changed are not in the list of specified directories, and
 - all commit messages do not contain 'ZFS-CI-Type: (full|linux|freebsd)'
 
-Otherwise prints "full".
+Otherwise prints "full auto" (or "<type> manual" if explicitly requested).
 """
 
 import sys
@@ -58,9 +61,10 @@ if __name__ == '__main__':
 
     head, base = sys.argv[1:3]
 
-    def output_type(type, reason):
-        print(f'{prog}: will run {type} CI: {reason}', file=sys.stderr)
-        print(type)
+    def output_type(type, source, reason):
+        print(f'{prog}: will run {type} CI ({source}): {reason}',
+              file=sys.stderr)
+        print(f'{type} {source}')
         sys.exit(0)
 
     # check last (HEAD) commit message
@@ -70,7 +74,8 @@ if __name__ == '__main__':
 
     for line in last_commit_message_raw.stdout.decode().splitlines():
         if line.strip().lower() == 'zfs-ci-type: quick':
-            output_type('quick', f'requested by HEAD commit {head}')
+            output_type('quick', 'manual',
+                        f'requested by HEAD commit {head}')
 
     # check all commit messages
     all_commit_message_raw = subprocess.run([
@@ -84,11 +89,14 @@ if __name__ == '__main__':
         if line.startswith('ZFS-CI-Commit:'):
             commit_ref = line.lstrip('ZFS-CI-Commit:').rstrip()
         if line.strip().lower() == 'zfs-ci-type: freebsd':
-            output_type('freebsd', f'requested by commit {commit_ref}')
+            output_type('freebsd', 'manual',
+                        f'requested by commit {commit_ref}')
         if line.strip().lower() == 'zfs-ci-type: linux':
-            output_type('linux', f'requested by commit {commit_ref}')
+            output_type('linux', 'manual',
+                        f'requested by commit {commit_ref}')
         if line.strip().lower() == 'zfs-ci-type: full':
-            output_type('full', f'requested by commit {commit_ref}')
+            output_type('full', 'manual',
+                        f'requested by commit {commit_ref}')
 
     # check changed files
     changed_files_raw = subprocess.run([
@@ -104,9 +112,10 @@ if __name__ == '__main__':
             for r in FULL_RUN_REGEX:
                 if r.match(f):
                     output_type(
-                        'full',
+                        'full', 'auto',
                         f'changed file "{f}" matches pattern "{r.pattern}"'
                         )
 
     # catch-all
-    output_type('quick', 'no changed file matches full CI patterns')
+    output_type('quick', 'auto',
+                'no changed file matches full CI patterns')
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/merge_summary.awk b/sys/contrib/openzfs/.github/workflows/scripts/merge_summary.awk
index 2b00d00226c9..8a4ce9a2be06 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/merge_summary.awk
+++ b/sys/contrib/openzfs/.github/workflows/scripts/merge_summary.awk
@@ -17,6 +17,7 @@ BEGIN {
 	pass=0
 	fail=0
 	skip=0
+	killed=0
 	state=""
 	cl=0
 	el=0
@@ -49,6 +50,37 @@ BEGIN {
 /PASS/{ if (state=="pass_count") {pass += $2}}
 /FAIL/{ if (state=="pass_count") {fail += $2}}
 /SKIP/{ if (state=="pass_count") {skip += $2}}
+
+# If the test was killed, you'll get a line like:
+#
+# [2026-04-22T03:34:17.694616] Test (Linux): /usr/share/zfs/zfs-tests/tests/functional/io/setup (run as root) [10:00] [KILLED]
+#
+# Parse out the test name minus the /usr/share/zfs/zfs-tests/tests/functional/'
+# part, and include the optional "(Linux): " line, as you can have the killed
+# tests in two categories, like:
+#
+#   KILLED (Linux): io/setup
+#   KILLED io/setup
+#
+/KILLED/{
+	extra=""
+	for(i=1; i<=NF; i++) {
+		# Look for optional "(Linux):" field
+		if ($i ~ "\\("){
+			extra=$i" "}
+
+		# Look for a field with a '/' in it.  It is the test name.
+		if($i ~ "/") {
+			testname=$i
+			# Remove /usr/share/zfs/zfs-test/test/functional string
+			sub(/\/usr\/share\/zfs\/zfs-tests\/tests\/functional\//,"",testname)
+			testname=extra""testname
+			killed_tests[killed] = testname
+			killed++
+			break
+		}
+	}
+}
 /Running Time/{
 	state="";
 	running[i]=$3;
@@ -106,4 +138,10 @@ END {
 	asort(unexpected_lines, sorted)
 	for (j in sorted)
 		print sorted[j]
+
+	# We don't want to sort killed tests, as the first test that was killed
+	# most likely caused the others to be killed.
+	print "\n\nTests that were killed:"
+	for (j in killed_tests)
+		print "    KILLED "killed_tests[j]
 }
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-1-setup.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-1-setup.sh
index 3d111561272d..5c41a4d6a497 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-1-setup.sh
+++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-1-setup.sh
@@ -6,6 +6,27 @@
 
 set -eu
 
+# The default runner has a bunch of development tools and other things
+# that we do not need.  Remove them here to free up a total of 35GB.
+#
+# First remove packages - this frees up ~10GB
+echo "Disk space before purge:"
+df -h /
+sudo docker image prune --all --force
+sudo docker builder prune -a
+unneeded="microsoft-edge-stable|azure-cli|google-cloud|google-chrome-stable|"\
+"temurin|llvm|firefox|mysql-server|snapd|android|dotnet|haskell|ghcup|"\
+"powershell|julia|swift|miniconda|chromium"
+sudo apt-get -y remove $(dpkg-query -f '${binary:Package}\n' -W | grep -E "'$unneeded'")
+sudo apt-get -y autoremove
+
+# Next, remove unneeded files in /usr.  This frees up an additional 25GB.
+sudo rm -fr /usr/local/lib/android /usr/share/dotnet /usr/local/.ghcup \
+        /usr/share/swift /usr/local/share/powershell /usr/local/julia* \
+        /usr/share/miniconda /usr/local/share/chromium
+echo "Disk space after:"
+df -h /
+
 # The default 'azure.archive.ubuntu.com' mirrors can be really slow.
 # Prioritize the official Ubuntu mirrors.
 #
@@ -42,7 +63,7 @@ sudo swapoff -a
 # configurations.  On one config you get two 75GB block devices, and on the
 # other you get a single 150GB block device. Here's what both look like:
 #
-# --- Two 75GB block devices ---
+# --- One 150GB block device ---
 # NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
 # sda       8:0    0  150G  0 disk
 # ├─sda1    8:1    0  149G  0 part /
@@ -56,7 +77,7 @@ sudo swapoff -a
 # lrwxrwxrwx 1 root root 11 Jan 29 18:07 azure_root-part15 -> ../../sda15
 # lrwxrwxrwx 1 root root 11 Jan 29 18:07 azure_root-part16 -> ../../sda16
 #
-# --- One 150GB block device ---
+# --- Two 75GB block devices ---
 # NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
 # sda       8:0    0   75G  0 disk
 # ├─sda1    8:1    0   74G  0 part /
@@ -118,18 +139,20 @@ fi
 sudo mkswap $SWAP
 sudo swapon $SWAP
 
+echo "Block devices:"
+lsblk
+
 # adjust zfs module parameter and create pool
-exec 1>/dev/null
 ARC_MIN=$((1024*1024*256))
 ARC_MAX=$((1024*1024*512))
-echo $ARC_MIN | sudo tee /sys/module/zfs/parameters/zfs_arc_min
-echo $ARC_MAX | sudo tee /sys/module/zfs/parameters/zfs_arc_max
-echo 1 | sudo tee /sys/module/zfs/parameters/zvol_use_blk_mq
+echo $ARC_MIN | sudo tee /sys/module/zfs/parameters/zfs_arc_min >/dev/null
+echo $ARC_MAX | sudo tee /sys/module/zfs/parameters/zfs_arc_max >/dev/null
+echo 1 | sudo tee /sys/module/zfs/parameters/zvol_use_blk_mq >/dev/null
 sudo zpool create -f -o ashift=12 zpool $DISKS -O relatime=off \
   -O atime=off -O xattr=sa -O compression=lz4 -O sync=disabled \
   -O redundant_metadata=none -O mountpoint=/mnt/tests
+echo "Status:"
+zpool status
 
-# no need for some scheduler
-for i in /sys/block/s*/queue/scheduler; do
-  echo "none" | sudo tee $i
-done
+echo "Last dmesg:"
+sudo dmesg | tail -n 10
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-2-start.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-2-start.sh
index 9a18ca659c44..e63aece389c0 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-2-start.sh
+++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-2-start.sh
@@ -78,11 +78,6 @@ case "$OS" in
     OPTS[0]="--boot"
     OPTS[1]="uefi=on"
     ;;
-  fedora41)
-    OSNAME="Fedora 41"
-    OSv="fedora-unknown"
-    URL="https://download.fedoraproject.org/pub/fedora/linux/releases/41/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-41-1.4.x86_64.qcow2"
-    ;;
   fedora42)
     OSNAME="Fedora 42"
     OSv="fedora-unknown"
@@ -93,6 +88,11 @@ case "$OS" in
     OSv="fedora-unknown"
     URL="https://download.fedoraproject.org/pub/fedora/linux/releases/43/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-43-1.6.x86_64.qcow2"
     ;;
+  fedora44)
+    OSNAME="Fedora 44"
+    OSv="fedora-unknown"
+    URL="https://download.fedoraproject.org/pub/fedora/linux/releases/44/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-44-1.7.x86_64.qcow2"
+    ;;
   freebsd13-5r)
     FreeBSD="13.5-RELEASE"
     OSNAME="FreeBSD $FreeBSD"
@@ -101,13 +101,20 @@ case "$OS" in
     KSRC="$FREEBSD_REL/../amd64/$FreeBSD/src.txz"
     NIC="rtl8139"
     ;;
-  freebsd14-3r)
-    FreeBSD="14.3-RELEASE"
+  freebsd14-4r)
+    FreeBSD="14.4-RELEASE"
     OSNAME="FreeBSD $FreeBSD"
     OSv="freebsd14.0"
     URLxz="$FREEBSD_REL/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI.raw.xz"
     KSRC="$FREEBSD_REL/../amd64/$FreeBSD/src.txz"
     ;;
+  freebsd15-0r)
+    FreeBSD="15.0-RELEASE"
+    OSNAME="FreeBSD $FreeBSD"
+    OSv="freebsd15.0"
+    URLxz="$FREEBSD_REL/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI-ufs.raw.xz"
+    KSRC="$FREEBSD_REL/../amd64/$FreeBSD/src.txz"
+    ;;
   freebsd13-5s)
     FreeBSD="13.5-STABLE"
     OSNAME="FreeBSD $FreeBSD"
@@ -116,15 +123,15 @@ case "$OS" in
     KSRC="$FREEBSD_SNAP/../amd64/$FreeBSD/src.txz"
     NIC="rtl8139"
     ;;
-  freebsd14-3s)
-    FreeBSD="14.3-STABLE"
+  freebsd14-4s)
+    FreeBSD="14.4-STABLE"
     OSNAME="FreeBSD $FreeBSD"
     OSv="freebsd14.0"
     URLxz="$FREEBSD_SNAP/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI-ufs.raw.xz"
     KSRC="$FREEBSD_SNAP/../amd64/$FreeBSD/src.txz"
     ;;
-  freebsd15-0s)
-    FreeBSD="15.0-STABLE"
+  freebsd15-1s)
+    FreeBSD="15.1-PRERELEASE"
     OSNAME="FreeBSD $FreeBSD"
     OSv="freebsd14.0"
     URLxz="$FREEBSD_SNAP/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI-ufs.raw.xz"
@@ -193,17 +200,49 @@ DISK="/dev/zvol/zpool/openzfs"
 sudo zfs create -ps -b 64k -V 80g zpool/openzfs
 while true; do test -b $DISK && break; sleep 1; done
 
-# we are downloading via axel, curl and wget are mostly slower and
-# require more return value checking
+# We first try to download with 'axel', which is faster than curl, but fallback
+# to curl if that doesn't work.  It is hoped that the curl fallback will get
+# around the occasional "ERROR 502: Bad Gateway" errors.
 IMG="/mnt/tests/cloud-image"
-if [ ! -z "$URLxz" ]; then
-  echo "Loading $URLxz ..."
-  time axel -q -o "$IMG" "$URLxz"
-  echo "Loading $KSRC ..."
-  time axel -q -o ~/src.txz $KSRC
-else
-  echo "Loading $URL ..."
-  time axel -q -o "$IMG" "$URL"
+for cmd in 'axel -q -o' 'curl --fail -LSs -o' ; do
+  if [ ! -z "$URLxz" ]; then
+    echo "Loading $URLxz with $cmd..."
+    time eval "$cmd $IMG $URLxz" || true
+
+    if [ ! -s ~/src.txz ] ; then
+      echo "Loading $KSRC with $cmd..."
+      time eval "$cmd ~/src.txz $KSRC" || true
+    fi
+  else
+    echo "Loading $URL with $cmd..."
+    time eval "$cmd $IMG $URL" || true
+  fi
+
+  if [ -s "$IMG" ] ; then
+    # Successful download
+    break
+  fi
+done
+
+# SPECIAL CASE
+# FreeBSD sometimes has broken links in their "current/" URL.  Go back up a
+# level and look for other images that might work.  For example:
+#
+# https://download.freebsd.org/snapshots/CI-IMAGES/16.0-CURRENT/amd64/:
+#
+# 20251110/
+# 20251209/
+# 20260420/
+# current/
+#
+# In this case let's say the raw.xz link in current/ is bad, so look though the
+# other snapshot links for the newest existing raw.xz file.
+if [ ! -z "$URLxz" ] && [ ! -s "$IMG" ] ; then
+  URLxz=$(wget --accept "*.raw.xz" --spider -np --recursive  --no-verbose \
+    $(dirname $(dirname $URLxz)) 2>&1  | awk '/200 OK/{print $(NF-2)}' | \
+    sort -n | tail -n 1)
+  echo "Couldn't download FreeBSD raw.xz.  Trying fallback snapshot $URLxz"
+  curl --fail -LSs -o $IMG $URLxz
 fi
 
 echo "Importing VM image to zvol..."
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-3-deps-vm.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-3-deps-vm.sh
index c8e1a015abd9..6a83ef45fd26 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-3-deps-vm.sh
+++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-3-deps-vm.sh
@@ -3,8 +3,11 @@
 ######################################################################
 # 3) install dependencies for compiling and loading
 #
-# $1: OS name (like 'fedora41')
-# $2: (optional) Experimental Fedora kernel version, like "6.14" to
+# qemu-3-deps-vm.sh [--poweroff] OS_NAME [FEDORA_VERSION]
+#
+# --poweroff: Power off the VM after installing dependencies
+# OS_NAME: OS name (like 'fedora41')
+# FEDORA_VERSION: (optional) Experimental Fedora kernel version, like "6.14" to
 #     install instead of Fedora defaults.
 ######################################################################
 
@@ -153,6 +156,12 @@ function install_fedora_experimental_kernel {
   sudo dnf -y copr disable @kernel-vanilla/mainline
 }
 
+POWEROFF=""
+if [ "$1" == "--poweroff" ] ; then
+        POWEROFF=1
+        shift
+fi
+
 # Install dependencies
 case "$1" in
   almalinux8)
@@ -212,6 +221,11 @@ case "$1" in
     sudo apt-get install -yq linux-tools-common libtirpc-dev \
       linux-modules-extra-$(uname -r)
     sudo apt-get install -yq dh-sequence-dkms
+
+    # Need 'build-essential' explicitly for ARM builder
+    # https://github.com/actions/runner-images/issues/9946
+    sudo apt-get install -yq build-essential
+
     echo "##[endgroup]"
     echo "##[group]Delete Ubuntu OpenZFS modules"
     for i in $(find /lib/modules -name zfs -type d); do sudo rm -rvf $i; done
@@ -306,5 +320,7 @@ esac
 
 # reset cloud-init configuration and poweroff
 sudo cloud-init clean --logs
-sleep 2 && sudo poweroff &
+if [ "$POWEROFF" == "1" ] ; then
+        sleep 2 && sudo poweroff &
+fi
 exit 0
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-4-build-vm.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-4-build-vm.sh
index 38255cf39966..bbfa2ec85b8f 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-4-build-vm.sh
+++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-4-build-vm.sh
@@ -350,7 +350,16 @@ fi
 # save some sysinfo
 uname -a > /var/tmp/uname.txt
 
-cd $HOME/zfs
+# Check if we're running this script from within a VM or on the runner itself.
+# Most of the time we will be running in a VM, but the ARM builder actually
+# runs this script on the runner.  If we happen to be running on the ARM
+# runner, we will start in the ZFS source directory.  If we're running on a VM
+# then we'll just start in our home directory, and will need to 'cd' into our
+# source directory.
+if [ ! -e META ] ; then
+  cd $HOME/zfs
+fi
+
 export PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin"
 
 extra=""
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-6-tests.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-6-tests.sh
index 8dad30fe4a5a..c261cbfca06d 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-6-tests.sh
+++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-6-tests.sh
@@ -222,9 +222,9 @@ TAGS=$NUM/$DEN
 sudo dmesg -c > dmesg-prerun.txt
 mount > mount.txt
 df -h > df-prerun.txt
-$TDIR/zfs-tests.sh -vKO -s 3GB -T $TAGS
+RV=0
+$TDIR/zfs-tests.sh -vKO -s 3GB -T $TAGS || RV=$?
 
-RV=$?
 df -h > df-postrun.txt
 echo $RV > tests-exitcode.txt
 sync
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-7-prepare.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-7-prepare.sh
index 98a5c24c2521..51ae82567c2c 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-7-prepare.sh
+++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-7-prepare.sh
@@ -13,16 +13,29 @@ source env.txt
 
 mkdir -p $RESPATH
 
+TARNAME=qemu-$OS
+
 # check if building the module has failed
 if [ -z ${VMs:-} ]; then
   cd $RESPATH
   echo ":exclamation: ZFS module didn't build successfully :exclamation:" \
     | tee summary.txt | tee /tmp/summary.txt
   cp /var/tmp/*.txt .
-  tar cf /tmp/qemu-$OS.tar -C $RESPATH -h . || true
+
+  # rename /var/tmp/test_results to /var/tmp/qemu-$OS
+  mv $RESPATH $(dirname $RESPATH)/$TARNAME
+  tar cjf /tmp/$TARNAME.tar.bz2 -C $(dirname $RESPATH) -h $TARNAME || true
+  # move it back to /var/tmp/test_results (needed for next script)
+  mv $(dirname $RESPATH)/$TARNAME $RESPATH
+
   exit 0
 fi
 
+if ! grep -q vm /etc/hosts ; then
+        echo "No vm* hostnames, VMs probably didn't startup"
+        exit 0
+fi
+
 # build was okay
 BASE="$HOME/work/zfs/zfs"
 MERGE="$BASE/.github/workflows/scripts/merge_summary.awk"
@@ -38,6 +51,11 @@ cd $RESPATH
 
 # prepare result files for summary
 for ((i=1; i<=VMs; i++)); do
+
+  # no results, VM either didn't start or was unreachable, create
+  # the missing directory which is expected by subsequent steps
+  test -d vm$i || mkdir -p vm$i
+
   file="vm$i/build-stderr.txt"
   test -s $file && mv -f $file build-stderr.txt
 
@@ -48,12 +66,14 @@ for ((i=1; i<=VMs; i++)); do
   test -s $file && mv -f $file uname.txt
 
   file="vm$i/tests-exitcode.txt"
-  if [ ! -s $file ]; then
-    # XXX - add some tests for kernel panic's here
-    # tail -n 80 vm$i/console.txt | grep XYZ
-    echo 1 > $file
+  if [ ! -s "$file" ]; then
+    # Print in bold red
+    echo -e "\033[1;31mVM$i didn't finish ZTS and may have crashed!\033[0m" >> extra
+
+    # ENOENT=2
+    echo 2 > "$file"
   fi
-  rv=$(cat vm$i/tests-exitcode.txt)
+  rv=$(cat "$file")
   test $rv != 0 && touch /tmp/have_failed_tests
 
   file="vm$i/current/log"
@@ -76,6 +96,14 @@ done
 if [ -s summary ]; then
   $MERGE summary | grep -v '^/' > summary.txt
   $MERGE summary | $BASE/scripts/zfs-tests-color.sh > /tmp/summary.txt
+
+  # Add in additional 'extra' text at the end, if file is present.
+  if [ -s extra ] ; then
+    echo "" >> /tmp/summary.txt
+    cat extra >> /tmp/summary.txt
+    rm -f extra
+  fi
+
   rm -f summary
 else
   touch summary.txt /tmp/summary.txt
@@ -121,4 +149,9 @@ if [ ! -s uname.txt ]; then
 fi
 
 # artifact ready now
-tar cf /tmp/qemu-$OS.tar -C $RESPATH -h . || true
+#
+# rename /var/tmp/test_results to /var/tmp/qemu-$OS
+mv $RESPATH $(dirname $RESPATH)/$TARNAME
+tar cjf /tmp/$TARNAME.tar.bz2 -C $(dirname $RESPATH) -h $TARNAME || true
+# move it back to /var/tmp/test_results (needed for next script)
+mv $(dirname $RESPATH)/$TARNAME $RESPATH
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-8-summary.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-8-summary.sh
index 00a4bf1ae325..39b3d124c794 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-8-summary.sh
+++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-8-summary.sh
@@ -37,9 +37,11 @@ function showfile_tail() {
   echo "##[endgroup]"
 }
 
-# overview
-cat /tmp/summary.txt
-echo ""
+# overview if available
+if [ -f /tmp/summary.txt -a -s /tmp/summary.txt ]; then
+  cat /tmp/summary.txt
+  echo ""
+fi
 
 if [ -f /tmp/have_failed_tests -a -s /tmp/failed.txt ]; then
   echo "Debuginfo of failed tests:"
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-9-summary-page.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-9-summary-page.sh
index 737dda01b565..1200f4de2b94 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-9-summary-page.sh
+++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-9-summary-page.sh
@@ -33,7 +33,9 @@ function send2github() {
 # first call, generate all summaries
 if [ ! -f out-1.md ]; then
   logfile="1"
-  for tarfile in Logs-functional-*/qemu-*.tar; do
+  # The bz2 files are put into directories with the same name, like:
+  # "qemu-debian12.tar.bz2/qemu-debian12.tar.bz2"
+  for tarfile in qemu-*.tar.bz2/qemu-*.tar.bz2; do
     rm -rf vm* *.txt
     if [ ! -s "$tarfile" ]; then
       output "\n## Functional Tests: unknown\n"
diff --git a/sys/contrib/openzfs/.github/workflows/smatch.yml b/sys/contrib/openzfs/.github/workflows/smatch.yml
index ac6454244f93..305a1f0179bd 100644
--- a/sys/contrib/openzfs/.github/workflows/smatch.yml
+++ b/sys/contrib/openzfs/.github/workflows/smatch.yml
@@ -13,7 +13,7 @@ jobs:
     runs-on: ubuntu-24.04
     steps:
     - name: Checkout smatch
-      uses: actions/checkout@v4
+      uses: actions/checkout@v6
       with:
         repository: error27/smatch
         ref: master
@@ -26,7 +26,7 @@ jobs:
         cd $GITHUB_WORKSPACE/smatch
         make -j$(nproc)
     - name: Checkout OpenZFS
-      uses: actions/checkout@v4
+      uses: actions/checkout@v6
       with:
         ref: ${{ github.event.pull_request.head.sha }}
*** 7802 LINES SKIPPED ***