zfs
A fork of OpenZFS. Its default branch mirrors upstream master; the project’s own work lives in separate branches: a prototype of in-place RAIDZ reshaping and the material for proposing it upstream.
- OpenZFS
- RAIDZ
- C
- Status
- A validated prototype, not a finished feature, in the repository’s own words: not production-ready, the on-disk format is not final. Tested with device-loss matrices, crash cutpoints, KASAN and soak runs; large-pool scale and a full ZTS run are still open.
- License
- CDDL, as upstream OpenZFS; exceptions are noted in individual source files.
- Platforms
- Linux; tested in an Ubuntu QEMU/KVM lab VM on builds based on zfs-2.4.4 and on current master.
What it solves
On a pool that backs running virtual machines and containers, changing RAIDZ redundancy or removing a disk today means a maintenance window: move the guests, export the pool, rebuild, bring everything back. RAIDZ expansion in OpenZFS 2.3 added only online width growth. The goal of this work is to change the geometry of a live pool in place, using only the pool’s own free space, with snapshots and clones preserved.
Key features
zpool reparityraises or lowers RAIDZ parity in place (raidz1 ↔ raidz2 ↔ raidz3); with--onlinethe datasets stay mounted, and--async,--statusand--cancelrun it in the background.- A per-vdev layout-epoch table behind one new feature flag (working name
com.openzfs:raidz_parity_epochs): every block is read and reconstructed at the geometry it was written with. - Fail-closed commit: the new parity takes effect only after a census finds no blocks left at the old one; otherwise the sweep resumes, also after a crash.
- Offline
zhacktools: removing a disk from a RAIDZ vdev (N → N−1), reshaping with snapshots and clones, re-checksumming and recompressing existing data; the last two are experimental. - ZTS functional tests and man pages for the new commands; an RFC and a stacked series of branches prepared for upstream review.
How it works
Each top-level RAIDZ vdev gets a small append-only table of {start_txg, width, parity} records, the same shape as the existing RAIDZ expansion records. A block’s geometry is chosen by its birth txg, so old and new blocks coexist. A bounded, crash-resumable sweep rewrites the existing blocks through ordinary copy-on-write. The RAIDZ row encoding, the block pointer format and ashift do not change.
zpool reparity [--online | --async | --status | --cancel] [--target N] pool
Requirements
- A pool with RAIDZ vdevs. The feature flag is incompatible and becomes active with the first reshape.
- Built from source like OpenZFS. The branches
ozfs-pr/1-parity-epochs-recon,ozfs-pr/2-reparity-commandandozfs-pr/3-reshape-toolkitare based on master,feat/raidz-*on zfs-2.4.4. - Removing a disk and the offline
zhacktools need the pool exported.
This page summarises the repository’s README and documentation as of October 2026. The repository itself is the authoritative source.