zfs.resource.snapshot.rollback
==============================

Rollback a ZFS dataset to a snapshot.

.. warning::

    This is a destructive change. All data written since the target snapshot was
    taken will be discarded.

A validation error is raised when:

- the snapshot, or a child's snapshot, does not exist (errno ``ENOENT``)
- ``path`` is not a snapshot path (errno ``EINVAL``)
- snapshots more recent than ``path`` exist and neither ``recursive`` nor
  ``recursive_clones`` was passed (errno ``EINVAL``)
- ``path`` is a protected path and the call did not come from the middleware itself
  (errno ``EACCES``)

The call fails when:

- a snapshot that has to be destroyed first has holds, or has clones and
  ``recursive_clones`` was not passed (errno ``EBUSY``); release a hold with
  :doc:`zfs.resource.snapshot.release <api_methods_zfs.resource.snapshot.release>`
- a destroy or the rollback itself fails, with the errno the kernel reported

Examples:

Roll back to a snapshot:

.. code:: json

    {"path": "tank/data@backup"}

Roll back, destroying more recent snapshots:

.. code:: json

    {"path": "tank/data@backup", "recursive": true}

Roll back all child datasets:

.. code:: json

    {"path": "tank@backup", "recursive_rollback": true}

.. raw:: html

    <div id="json-schema">
    <span class="badge badge-dark value-type">Type: object</span><br/>
    <div class="accordion" id="accordionCall_parameters">
    <div class="card">
    <div class="card-header" id="headingCall_parameters">
    <h2 class="mb-0">
    <button aria-controls="Call_parameters" aria-expanded="" class="btn btn-link property-name-button" data-target="#Call_parameters" data-toggle="collapse" onclick="setAnchor('#Call_parameters')" type="button"><span class="property-name">Call parameters</span></button>
    </h2>
    </div>
    <div aria-labelledby="headingCall_parameters" class="collapse property-definition-div" data-parent="#accordionCall_parameters" id="Call_parameters">
    <div class="card-body pl-5">
    <span class="badge badge-dark value-type">Type: array</span><br/>
    <span class="badge badge-info no-additional">No Additional Items</span><h4>Tuple Validation</h4>
    <h5>Parameter 1: data</h5>
    <div class="card">
    <div class="card-body items-definition" id="Call_parameters_items_i0">
    <h4>data</h4><span class="badge badge-dark value-type">Type: object</span><br/>
    <span class="description"><p>Rollback parameters for rolling back to ZFS snapshots.</p>
    </span> <span class="badge badge-info no-additional">No Additional Properties</span>
    <div class="accordion" id="accordionCall_parameters_items_i0_path">
    <div class="card">
    <div class="card-header" id="headingCall_parameters_items_i0_path">
    <h2 class="mb-0">
    <button aria-controls="Call_parameters_items_i0_path" aria-expanded="" class="btn btn-link property-name-button" data-target="#Call_parameters_items_i0_path" data-toggle="collapse" onclick="setAnchor('#Call_parameters_items_i0_path')" type="button"><span class="property-name">path</span> <span class="badge badge-warning required-property">Required</span></button>
    </h2>
    </div>
    <div aria-labelledby="headingCall_parameters_items_i0_path" class="collapse property-definition-div" data-parent="#accordionCall_parameters_items_i0_path" id="Call_parameters_items_i0_path">
    <div class="card-body pl-5">
    <h4>Path</h4><span class="badge badge-dark value-type">Type: string</span><br/>
    <span class="description"><p>Snapshot path to rollback to (e.g., 'pool/dataset@snapshot').</p>
    </span>
    <p><span class="badge badge-light restriction min-length-restriction" id="Call_parameters_items_i0_path_minLength">Must be at least <code>1</code> characters long</span></p>
    </div>
    </div>
    </div>
    </div>
    <div class="accordion" id="accordionCall_parameters_items_i0_recursive">
    <div class="card">
    <div class="card-header" id="headingCall_parameters_items_i0_recursive">
    <h2 class="mb-0">
    <button aria-controls="Call_parameters_items_i0_recursive" aria-expanded="" class="btn btn-link property-name-button" data-target="#Call_parameters_items_i0_recursive" data-toggle="collapse" onclick="setAnchor('#Call_parameters_items_i0_recursive')" type="button"><span class="property-name">recursive</span></button>
    </h2>
    </div>
    <div aria-labelledby="headingCall_parameters_items_i0_recursive" class="collapse property-definition-div" data-parent="#accordionCall_parameters_items_i0_recursive" id="Call_parameters_items_i0_recursive">
    <div class="card-body pl-5">
    <h4>Recursive</h4><span class="badge badge-dark value-type">Type: boolean</span> <span class="badge badge-success default-value">Default: false</span><br/>
    <span class="description"><p>Destroy any snapshots more recent than the one specified.</p>
    </span>
    </div>
    </div>
    </div>
    </div>
    <div class="accordion" id="accordionCall_parameters_items_i0_recursive_clones">
    <div class="card">
    <div class="card-header" id="headingCall_parameters_items_i0_recursive_clones">
    <h2 class="mb-0">
    <button aria-controls="Call_parameters_items_i0_recursive_clones" aria-expanded="" class="btn btn-link property-name-button" data-target="#Call_parameters_items_i0_recursive_clones" data-toggle="collapse" onclick="setAnchor('#Call_parameters_items_i0_recursive_clones')" type="button"><span class="property-name">recursive_clones</span></button>
    </h2>
    </div>
    <div aria-labelledby="headingCall_parameters_items_i0_recursive_clones" class="collapse property-definition-div" data-parent="#accordionCall_parameters_items_i0_recursive_clones" id="Call_parameters_items_i0_recursive_clones">
    <div class="card-body pl-5">
    <h4>Recursive Clones</h4><span class="badge badge-dark value-type">Type: boolean</span> <span class="badge badge-success default-value">Default: false</span><br/>
    <span class="description"><p>Like recursive, but also destroy any clones.</p>
    </span>
    </div>
    </div>
    </div>
    </div>
    <div class="accordion" id="accordionCall_parameters_items_i0_force">
    <div class="card">
    <div class="card-header" id="headingCall_parameters_items_i0_force">
    <h2 class="mb-0">
    <button aria-controls="Call_parameters_items_i0_force" aria-expanded="" class="btn btn-link property-name-button" data-target="#Call_parameters_items_i0_force" data-toggle="collapse" onclick="setAnchor('#Call_parameters_items_i0_force')" type="button"><span class="property-name">force</span></button>
    </h2>
    </div>
    <div aria-labelledby="headingCall_parameters_items_i0_force" class="collapse property-definition-div" data-parent="#accordionCall_parameters_items_i0_force" id="Call_parameters_items_i0_force">
    <div class="card-body pl-5">
    <h4>Force</h4><span class="badge badge-dark value-type">Type: boolean</span> <span class="badge badge-success default-value">Default: false</span><br/>
    <span class="description"><p>Force unmount of any clones.</p>
    </span>
    </div>
    </div>
    </div>
    </div>
    <div class="accordion" id="accordionCall_parameters_items_i0_recursive_rollback">
    <div class="card">
    <div class="card-header" id="headingCall_parameters_items_i0_recursive_rollback">
    <h2 class="mb-0">
    <button aria-controls="Call_parameters_items_i0_recursive_rollback" aria-expanded="" class="btn btn-link property-name-button" data-target="#Call_parameters_items_i0_recursive_rollback" data-toggle="collapse" onclick="setAnchor('#Call_parameters_items_i0_recursive_rollback')" type="button"><span class="property-name">recursive_rollback</span></button>
    </h2>
    </div>
    <div aria-labelledby="headingCall_parameters_items_i0_recursive_rollback" class="collapse property-definition-div" data-parent="#accordionCall_parameters_items_i0_recursive_rollback" id="Call_parameters_items_i0_recursive_rollback">
    <div class="card-body pl-5">
    <h4>Recursive Rollback</h4><span class="badge badge-dark value-type">Type: boolean</span> <span class="badge badge-success default-value">Default: false</span><br/>
    <span class="description"><p>Do a complete recursive rollback of each child snapshot. Fails if any child lacks the snapshot.</p>
    </span>
    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    <div class="accordion" id="accordionReturn_value">
    <div class="card">
    <div class="card-header" id="headingReturn_value">
    <h2 class="mb-0">
    <button aria-controls="Return_value" aria-expanded="" class="btn btn-link property-name-button" data-target="#Return_value" data-toggle="collapse" onclick="setAnchor('#Return_value')" type="button"><span class="property-name">Return value</span></button>
    </h2>
    </div>
    <div aria-labelledby="headingReturn_value" class="collapse property-definition-div" data-parent="#accordionReturn_value" id="Return_value">
    <div class="card-body pl-5">
    <h4>Result</h4><span class="badge badge-dark value-type">Type: null</span><br/>
    </div>
    </div>
    </div>
    </div>
    </div><br><br>

*Required roles:* SNAPSHOT_WRITE

