{
  "slug": "zfs-pool-checkpoint",
  "term": "ZFS pool checkpoint",
  "aliases": [
    "zpool checkpoint",
    "OpenZFS pool checkpoint"
  ],
  "definition": "A ZFS pool checkpoint preserves an earlier pool-wide state for later inspection or rewind while retaining blocks that state still needs.",
  "note": "A checkpoint retains pool state, including dataset names and snapshots, rather than just one dataset's image. Blocks deleted from the live state remain allocated if the checkpoint needs them. Only one checkpoint can exist, and a new one cannot be created while an earlier checkpoint is still discarding. [checkpoint-code]\n\nA normal import --rewind-to-checkpoint irreversibly abandons later pool changes. Import with the pool property readonly=on permits inspection without committing that rewind. The -N option only suppresses filesystem mounting. [pool-import] [pool-properties]\n\nIn OpenZFS 2.3.4, a live-pool scrub does not traverse blocks freed from current state but retained only by the checkpoint. A clean scrub therefore does not certify every checkpoint-only block. [checkpoint-scrub]\n\nAn existing checkpoint blocks remove, attach, detach, split and reguid operations. Space pressure can violate reservation boundaries. Discard removes the rewind point before retained-space cleanup completes; checkpoint -d -w waits for completion. [pool-checkpoint]\n\nThe scrub's scan-progress checkpoint is different: its bookmark resumes scanning after interruption, not pool-wide rollback. [scan-progress]",
  "advantages": [],
  "limitations": [
    {
      "text": "Pool loss also removes the checkpoint's retained blocks, so this same-pool mechanism is not an independent backup.",
      "citationIds": [
        "checkpoint-code"
      ]
    }
  ],
  "related": [
    "zfs",
    "snapshot",
    "data-scrubbing"
  ],
  "citations": [
    {
      "id": "pool-checkpoint",
      "title": "OpenZFS v2.3: zpool-checkpoint(8), restrictions and discard",
      "url": "https://openzfs.github.io/openzfs-docs/man/v2.3/8/zpool-checkpoint.8.html",
      "accessed": "2026-11-10"
    },
    {
      "id": "pool-import",
      "title": "OpenZFS v2.3: zpool-import(8), checkpoint rewind and read-only preview",
      "url": "https://openzfs.github.io/openzfs-docs/man/v2.3/8/zpool-import.8.html",
      "accessed": "2026-11-10"
    },
    {
      "id": "pool-properties",
      "title": "OpenZFS v2.3: zpoolprops(7), readonly pool import property",
      "url": "https://openzfs.github.io/openzfs-docs/man/v2.3/7/zpoolprops.7.html#readonly",
      "accessed": "2026-11-10"
    },
    {
      "id": "checkpoint-code",
      "title": "OpenZFS 2.3.4: pool checkpoint design, retained extents and creation checks",
      "url": "https://github.com/openzfs/zfs/blob/34f96a15c73eab27dd6ad17bb5f1263bf26e37d7/module/zfs/spa_checkpoint.c",
      "accessed": "2026-11-10"
    },
    {
      "id": "checkpoint-scrub",
      "title": "OpenZFS 2.3.4: dsl_scan_done, checkpoint-only blocks and scrub coverage",
      "url": "https://github.com/openzfs/zfs/blob/34f96a15c73eab27dd6ad17bb5f1263bf26e37d7/module/zfs/dsl_scan.c#L1079-L1094",
      "accessed": "2026-11-10"
    },
    {
      "id": "scan-progress",
      "title": "OpenZFS 2.3.4: scan-progress checkpoint bookmark and resumption",
      "url": "https://github.com/openzfs/zfs/blob/34f96a15c73eab27dd6ad17bb5f1263bf26e37d7/module/zfs/dsl_scan.c#L104-L113",
      "accessed": "2026-11-10"
    }
  ],
  "status": "shipping",
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-11-10",
  "provenance": [
    "Documentation and source review, scoped to OpenZFS v2.3 manuals and commit 34f96a15c73eab27dd6ad17bb5f1263bf26e37d7 (2.3.4).",
    "The pool-loss limitation is an engineering inference from shared storage dependence; no pool, scrub or recovery experiment was performed."
  ]
}
