1791 { |
1792 { |
1792 dsl_dataset_rollback_arg_t *ddra = arg; |
1793 dsl_dataset_rollback_arg_t *ddra = arg; |
1793 dsl_pool_t *dp = dmu_tx_pool(tx); |
1794 dsl_pool_t *dp = dmu_tx_pool(tx); |
1794 dsl_dataset_t *ds, *clone; |
1795 dsl_dataset_t *ds, *clone; |
1795 uint64_t cloneobj; |
1796 uint64_t cloneobj; |
|
1797 char namebuf[ZFS_MAXNAMELEN]; |
1796 |
1798 |
1797 VERIFY0(dsl_dataset_hold(dp, ddra->ddra_fsname, FTAG, &ds)); |
1799 VERIFY0(dsl_dataset_hold(dp, ddra->ddra_fsname, FTAG, &ds)); |
|
1800 |
|
1801 dsl_dataset_name(ds->ds_prev, namebuf); |
|
1802 fnvlist_add_string(ddra->ddra_result, "target", namebuf); |
1798 |
1803 |
1799 cloneobj = dsl_dataset_create_sync(ds->ds_dir, "%rollback", |
1804 cloneobj = dsl_dataset_create_sync(ds->ds_dir, "%rollback", |
1800 ds->ds_prev, DS_CREATE_FLAG_NODIRTY, kcred, tx); |
1805 ds->ds_prev, DS_CREATE_FLAG_NODIRTY, kcred, tx); |
1801 |
1806 |
1802 VERIFY0(dsl_dataset_hold_obj(dp, cloneobj, FTAG, &clone)); |
1807 VERIFY0(dsl_dataset_hold_obj(dp, cloneobj, FTAG, &clone)); |
1809 dsl_dataset_rele(clone, FTAG); |
1814 dsl_dataset_rele(clone, FTAG); |
1810 dsl_dataset_rele(ds, FTAG); |
1815 dsl_dataset_rele(ds, FTAG); |
1811 } |
1816 } |
1812 |
1817 |
1813 /* |
1818 /* |
|
1819 * Rolls back the given filesystem or volume to the most recent snapshot. |
|
1820 * The name of the most recent snapshot will be returned under key "target" |
|
1821 * in the result nvlist. |
|
1822 * |
1814 * If owner != NULL: |
1823 * If owner != NULL: |
1815 * |
|
1816 * - The existing dataset MUST be owned by the specified owner at entry |
1824 * - The existing dataset MUST be owned by the specified owner at entry |
1817 * - Upon return, dataset will still be held by the same owner, whether we |
1825 * - Upon return, dataset will still be held by the same owner, whether we |
1818 * succeed or not. |
1826 * succeed or not. |
1819 * |
1827 * |
1820 * This mode is required any time the existing filesystem is mounted. See |
1828 * This mode is required any time the existing filesystem is mounted. See |
1821 * notes above zfs_suspend_fs() for further details. |
1829 * notes above zfs_suspend_fs() for further details. |
1822 */ |
1830 */ |
1823 int |
1831 int |
1824 dsl_dataset_rollback(const char *fsname, void *owner) |
1832 dsl_dataset_rollback(const char *fsname, void *owner, nvlist_t *result) |
1825 { |
1833 { |
1826 dsl_dataset_rollback_arg_t ddra; |
1834 dsl_dataset_rollback_arg_t ddra; |
1827 |
1835 |
1828 ddra.ddra_fsname = fsname; |
1836 ddra.ddra_fsname = fsname; |
1829 ddra.ddra_owner = owner; |
1837 ddra.ddra_owner = owner; |
|
1838 ddra.ddra_result = result; |
1830 |
1839 |
1831 return (dsl_sync_task(fsname, dsl_dataset_rollback_check, |
1840 return (dsl_sync_task(fsname, dsl_dataset_rollback_check, |
1832 dsl_dataset_rollback_sync, (void *)&ddra, 1)); |
1841 dsl_dataset_rollback_sync, &ddra, 1)); |
1833 } |
1842 } |
1834 |
1843 |
1835 struct promotenode { |
1844 struct promotenode { |
1836 list_node_t link; |
1845 list_node_t link; |
1837 dsl_dataset_t *ds; |
1846 dsl_dataset_t *ds; |