*** 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)
- 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
- 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
*** 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