github openzfsonwindows/openzfs zfswin-2.4.4rc6
zfs-windows-2.4.4rc6

pre-release4 hours ago

*** rc6

We are finally attempting to switch from default build "Debug" to default build "Release"

Fixes

  • Release-build BSOD: ____cacheline_aligned is now a no-op on Windows. Optimised builds merged stores into aligned movaps on zio_t, but the allocator
    only guarantees 8/16-byte alignment, so the release driver crashed in zio_vdev_io_start. Debug builds never hit it.

Features

  • Tray: zfs_tray now tells you when a newer OpenZFS on Windows is released. There is a Settings ▶ submenu to turn it on and off and to include
    pre-releases, and it notifies once per version.

Packaging and build

  • Release installers: new ZFSInstall-release.iss produces OpenZFSOnWindows-.exe (-debug- is now the opt-in flavour), and the deploy project's
    Release|x64 config is wired to x64-Release.
  • ARM64: real ARM64 installer scripts (debug and release) replace the mis-copied x64 one, and CMakeSettings.json gains an arm64-Release configuration.
  • Attestation: one attestation.sh [x64|arm64] [Debug|Release] [zip] replaces the separate ARM64 script and the .ddf files.

Verified

  • Release build on the x64 VM under Driver Verifier (no violations or failed pool allocations), and CrystalDiskMark. test.exe showed no crash.

*** rc5

  • Readonly-file delete refusal, and its fallout fixed — del/FILE_DELETE_ON_CLOSE on a FILE_ATTRIBUTE_READONLY file now fails like
    NTFS instead of silently deleting it; the create-time path swallows the rejection via the existing "silently ignored" precedent so
    it doesn't leak a vnode ref (a260b29)
  • BSOD fix: unmount/export self-deadlock — zfsvfs_teardown()'s zil_close() could re-enter and try to attach NT security while already
    holding the teardown lock for write, tripping rrwlock's self-deadlock assert; security attach is now skipped on that re-entrant
    path (eee9770)
  • BSOD fix: usecount underflow in vnode_setparent() — two FILE_OBJECTs closing on the same vnode around the same time (e.g. a
    downloader writing through multiple parallel-chunk handles) could both release the same parent-link ref; the old-parent release is
    now claimed with a CAS so only one of them acts on it (bb999dc, #647 (#647))
  • OpenZVOL: fixed a crash on reinstall without reboot — a stale DRIVER_OBJECT pointer from a previous driver load caused
    IoDeleteDevice to dereference freed memory on unload; now only the devices this copy actually created are torn down (918b721,
    #654 (#654))
  • Rename: case-only rename now works — renaming low.txt → LOW.txt on a case-insensitive dataset was wrongly rejected as a name
    collision; it's now treated as the case-preserving rename it is (bd20aac)
  • Hardlinks: deleting one name no longer blocks the others — FileDispositionInformation(Ex) on a hardlinked file used to mark the
    whole vnode delete-pending, making every other name return access-denied; now only the one name being removed is affected, matching
    the existing DELETE_ON_CLOSE behavior (dce6de0)
  • Driver Verifier fixes (3 bugcheck 0xC4/0x3B crashes under Verifier):
    • zfs diff/send/recv: getf() referenced a user-mode fd as kernel-mode, and handed zfs_file_* the caller's raw handle instead of a
      kernel one usable from any thread (145eff7, 56c24ee)
    • Hardlink creation with a RootDirectory handle was also referenced with the wrong processor mode (849fada)
    • A lookup queued on an oplock break (STATUS_PENDING) kept touching the IRP's FileObject afterward, which could already be gone
      (873be90)
  • Internal: libzfs.abi/ZFS versions-feature plumbing (3a277c3, b9e3241) — no user-visible behavior change

*** rc4

  • Explorer integration exposing snapshot versions
  • Fix "zfs diff"
  • zfs_tray features
  • Paging IO deadlock fix
  • Fix BSOD related to SEQ
  • zfs_inactive deadlock fix

#646 (comment)


*** rc3

  • Fix regression in sa_remove_attrs causing BSOD

*** rc2

  • Fix zpool create
    Fixing execve attempted to run zfs_prepare_disk script, which fails on Windows
    Add zfs_prepare_disk.ps1 for Windows

*** rc1

You need to delete (or rename) C:\Program Files\OpenZFS on Windows\zfs_prepare_disk if you want to be able to create pools.

These are the changes from upstream 2.4.1 to 2.4.4

L2ARC — substantial rework

  • DWPD-based rate limiting with adaptive feed intervals (protects SSD endurance)
  • Per-device parallel feed threads (was single-threaded feed)
  • Persistent markers with consistent tail scanning + lazy reset flags + scan-based depth cap
  • Even-depth multi-sublist scanning, write budget fairness (metadata no longer monopolizes)
  • Rebuild bounded by write hand on first sweep; fixed a prev_hdr use-after-free

Performance

  • Predict and throttle buffers dirtied by the sync context
  • Batch object reallocation syncs in zfs receive
  • Parallelize metaslab_sync_done(), dedup block cloning, and brt_pending_apply() across vdevs
  • RAIDZ: optimize single data column writes; avoid extra abd_t allocations in RAIDZ/dRAID
  • Bridge speculative and prescient prefetchers; bound user prefetch to a fraction of ARC

New features / CLI

  • zpool condense — new verb
  • zpool scrub -t — thorough scrub support
  • zfs bookmark -r — recursive bookmark creation
  • zpool initialize -z — write zeroes
  • New dedupused/dedupsaved pool properties
  • zoned_uid property (Linux container/namespace delegation — not applicable to us)
  • FIDEDUPERANGE via block cloning
  • zstream: major rework — multithreaded, new raw/drop_record/queue subcommands, memory tracking

Data-integrity fixes (the ones that matter most)

  • Fix read corruption after block-clone-after-truncate
  • Fix double free for blocks cloned after DDT prune
  • draid: fix data corruption after disk clear; fix checksum errors after rebuild with degraded disks; fix import
    failure after disk replacement
  • Prevent range-tree corruption race in dnode_sync()
  • z_seq now persists across znode eviction — fixes the VMware ESXi-over-NFS "file specified is not a virtual disk" bug
    (Linux/FreeBSD only for now, per our earlier gap analysis)
  • DDT: multiple pruning bugs fixed (including negative time overflow)
  • Fix off-by-one in PREVIOUSLY_REDACTED handling that dropped the last block

Security hardening

  • vdev_open/zfs_file_open/vdev_file/vdev_disk: now check the calling credential instead of always using kcred (we
    ported the Windows side of this yesterday)
  • Additional verification of size fields and strings in the receive path
  • Hardened receive record validation
  • secpolicy_nfs removed; secpolicy_zinject/secpolicy_sys_config restricted to global-zone credentials

Deadlock/hang fixes

  • Fix deadlock on dmu_tx_assign() from vdev_rebuild()
  • Fix snapshot automount deadlock during concurrent zfs recv
  • Fix self-deadlock setting the vdev allocating/path property
  • Fix race between device-removal completion and pool export
  • zfs_ioctl: fix EBUSY race between quota queries and mount (we ported this too)
  • arc: fix race between arc_release() and arc_read_done()

OpenZFS on Windows

  • Add zpool create and zpool destroy to zfs_tray

Don't miss a new openzfs release

NewReleases is sending notifications on new releases.