Lines 1289-1296
Link Here
|
1289 |
fnvlist_free(suspended); |
1289 |
fnvlist_free(suspended); |
1290 |
} |
1290 |
} |
1291 |
|
1291 |
|
1292 |
#ifdef __FreeBSD__ |
1292 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
1293 |
#ifdef _KERNEL |
|
|
1294 |
if (error == 0) { |
1293 |
if (error == 0) { |
1295 |
for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL; |
1294 |
for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL; |
1296 |
pair = nvlist_next_nvpair(snaps, pair)) { |
1295 |
pair = nvlist_next_nvpair(snaps, pair)) { |
Lines 1299-1305
Link Here
|
1299 |
} |
1298 |
} |
1300 |
} |
1299 |
} |
1301 |
#endif |
1300 |
#endif |
1302 |
#endif |
|
|
1303 |
return (error); |
1301 |
return (error); |
1304 |
} |
1302 |
} |
1305 |
|
1303 |
|
Lines 1671-1681
Link Here
|
1671 |
dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp, |
1669 |
dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp, |
1672 |
dsl_dataset_t *hds, void *arg) |
1670 |
dsl_dataset_t *hds, void *arg) |
1673 |
{ |
1671 |
{ |
1674 |
#ifdef __FreeBSD__ |
1672 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
1675 |
#ifdef _KERNEL |
|
|
1676 |
char *oldname, *newname; |
1673 |
char *oldname, *newname; |
1677 |
#endif |
1674 |
#endif |
1678 |
#endif |
|
|
1679 |
dsl_dataset_rename_snapshot_arg_t *ddrsa = arg; |
1675 |
dsl_dataset_rename_snapshot_arg_t *ddrsa = arg; |
1680 |
dsl_dataset_t *ds; |
1676 |
dsl_dataset_t *ds; |
1681 |
uint64_t val; |
1677 |
uint64_t val; |
Lines 1697-1721
Link Here
|
1697 |
|
1693 |
|
1698 |
VERIFY0(dsl_dataset_snap_remove(hds, ddrsa->ddrsa_oldsnapname, tx)); |
1694 |
VERIFY0(dsl_dataset_snap_remove(hds, ddrsa->ddrsa_oldsnapname, tx)); |
1699 |
mutex_enter(&ds->ds_lock); |
1695 |
mutex_enter(&ds->ds_lock); |
|
|
1696 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
1697 |
oldname = kmem_alloc(MAXPATHLEN, KM_SLEEP); |
1698 |
newname = kmem_alloc(MAXPATHLEN, KM_SLEEP); |
1699 |
dsl_dataset_name(ds, oldname); |
1700 |
#endif |
1700 |
(void) strcpy(ds->ds_snapname, ddrsa->ddrsa_newsnapname); |
1701 |
(void) strcpy(ds->ds_snapname, ddrsa->ddrsa_newsnapname); |
|
|
1702 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
1703 |
dsl_dataset_name(ds, newname); |
1704 |
#endif |
1701 |
mutex_exit(&ds->ds_lock); |
1705 |
mutex_exit(&ds->ds_lock); |
1702 |
VERIFY0(zap_add(dp->dp_meta_objset, hds->ds_phys->ds_snapnames_zapobj, |
1706 |
VERIFY0(zap_add(dp->dp_meta_objset, hds->ds_phys->ds_snapnames_zapobj, |
1703 |
ds->ds_snapname, 8, 1, &ds->ds_object, tx)); |
1707 |
ds->ds_snapname, 8, 1, &ds->ds_object, tx)); |
1704 |
|
1708 |
|
1705 |
#ifdef __FreeBSD__ |
1709 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
1706 |
#ifdef _KERNEL |
|
|
1707 |
oldname = kmem_alloc(MAXPATHLEN, KM_SLEEP); |
1708 |
newname = kmem_alloc(MAXPATHLEN, KM_SLEEP); |
1709 |
snprintf(oldname, MAXPATHLEN, "%s@%s", ddrsa->ddrsa_fsname, |
1710 |
ddrsa->ddrsa_oldsnapname); |
1711 |
snprintf(newname, MAXPATHLEN, "%s@%s", ddrsa->ddrsa_fsname, |
1712 |
ddrsa->ddrsa_newsnapname); |
1713 |
zfsvfs_update_fromname(oldname, newname); |
1710 |
zfsvfs_update_fromname(oldname, newname); |
1714 |
zvol_rename_minors(oldname, newname); |
1711 |
zvol_rename_minors(oldname, newname); |
1715 |
kmem_free(newname, MAXPATHLEN); |
1712 |
kmem_free(newname, MAXPATHLEN); |
1716 |
kmem_free(oldname, MAXPATHLEN); |
1713 |
kmem_free(oldname, MAXPATHLEN); |
1717 |
#endif |
1714 |
#endif |
1718 |
#endif |
|
|
1719 |
dsl_dataset_rele(ds, FTAG); |
1715 |
dsl_dataset_rele(ds, FTAG); |
1720 |
|
1716 |
|
1721 |
return (0); |
1717 |
return (0); |
Lines 1731-1739
Link Here
|
1731 |
VERIFY0(dsl_dataset_hold(dp, ddrsa->ddrsa_fsname, FTAG, &hds)); |
1727 |
VERIFY0(dsl_dataset_hold(dp, ddrsa->ddrsa_fsname, FTAG, &hds)); |
1732 |
ddrsa->ddrsa_tx = tx; |
1728 |
ddrsa->ddrsa_tx = tx; |
1733 |
if (ddrsa->ddrsa_recursive) { |
1729 |
if (ddrsa->ddrsa_recursive) { |
|
|
1730 |
/* Take the spa_namespace_lock so zvol renames don't deadlock */ |
1731 |
mutex_enter(&spa_namespace_lock); |
1732 |
|
1734 |
VERIFY0(dmu_objset_find_dp(dp, hds->ds_dir->dd_object, |
1733 |
VERIFY0(dmu_objset_find_dp(dp, hds->ds_dir->dd_object, |
1735 |
dsl_dataset_rename_snapshot_sync_impl, ddrsa, |
1734 |
dsl_dataset_rename_snapshot_sync_impl, ddrsa, |
1736 |
DS_FIND_CHILDREN)); |
1735 |
DS_FIND_CHILDREN)); |
|
|
1736 |
|
1737 |
mutex_exit(&spa_namespace_lock); |
1737 |
} else { |
1738 |
} else { |
1738 |
VERIFY0(dsl_dataset_rename_snapshot_sync_impl(dp, hds, ddrsa)); |
1739 |
VERIFY0(dsl_dataset_rename_snapshot_sync_impl(dp, hds, ddrsa)); |
1739 |
} |
1740 |
} |
Lines 2031-2036
Link Here
|
2031 |
dsl_dir_t *odd = NULL; |
2032 |
dsl_dir_t *odd = NULL; |
2032 |
uint64_t oldnext_obj; |
2033 |
uint64_t oldnext_obj; |
2033 |
int64_t delta; |
2034 |
int64_t delta; |
|
|
2035 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
2036 |
char *oldname, *newname; |
2037 |
#endif |
2034 |
|
2038 |
|
2035 |
VERIFY0(promote_hold(ddpa, dp, FTAG)); |
2039 |
VERIFY0(promote_hold(ddpa, dp, FTAG)); |
2036 |
hds = ddpa->ddpa_clone; |
2040 |
hds = ddpa->ddpa_clone; |
Lines 2096-2101
Link Here
|
2096 |
dd->dd_phys->dd_clones, origin_head->ds_object, tx)); |
2100 |
dd->dd_phys->dd_clones, origin_head->ds_object, tx)); |
2097 |
} |
2101 |
} |
2098 |
|
2102 |
|
|
|
2103 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
2104 |
/* Take the spa_namespace_lock so zvol renames don't livelock */ |
2105 |
mutex_enter(&spa_namespace_lock); |
2106 |
|
2107 |
oldname = kmem_alloc(MAXPATHLEN, KM_SLEEP); |
2108 |
newname = kmem_alloc(MAXPATHLEN, KM_SLEEP); |
2109 |
#endif |
2099 |
/* move snapshots to this dir */ |
2110 |
/* move snapshots to this dir */ |
2100 |
for (snap = list_head(&ddpa->shared_snaps); snap; |
2111 |
for (snap = list_head(&ddpa->shared_snaps); snap; |
2101 |
snap = list_next(&ddpa->shared_snaps, snap)) { |
2112 |
snap = list_next(&ddpa->shared_snaps, snap)) { |
Lines 2115-2120
Link Here
|
2115 |
VERIFY0(dsl_dataset_get_snapname(ds)); |
2126 |
VERIFY0(dsl_dataset_get_snapname(ds)); |
2116 |
VERIFY0(dsl_dataset_snap_remove(origin_head, |
2127 |
VERIFY0(dsl_dataset_snap_remove(origin_head, |
2117 |
ds->ds_snapname, tx)); |
2128 |
ds->ds_snapname, tx)); |
|
|
2129 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
2130 |
dsl_dataset_name(ds, oldname); |
2131 |
#endif |
2118 |
VERIFY0(zap_add(dp->dp_meta_objset, |
2132 |
VERIFY0(zap_add(dp->dp_meta_objset, |
2119 |
hds->ds_phys->ds_snapnames_zapobj, ds->ds_snapname, |
2133 |
hds->ds_phys->ds_snapnames_zapobj, ds->ds_snapname, |
2120 |
8, 1, &ds->ds_object, tx)); |
2134 |
8, 1, &ds->ds_object, tx)); |
Lines 2127-2132
Link Here
|
2127 |
dsl_dir_rele(ds->ds_dir, ds); |
2141 |
dsl_dir_rele(ds->ds_dir, ds); |
2128 |
VERIFY0(dsl_dir_hold_obj(dp, dd->dd_object, |
2142 |
VERIFY0(dsl_dir_hold_obj(dp, dd->dd_object, |
2129 |
NULL, ds, &ds->ds_dir)); |
2143 |
NULL, ds, &ds->ds_dir)); |
|
|
2144 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
2145 |
dsl_dataset_name(ds, newname); |
2146 |
zfsvfs_update_fromname(oldname, newname); |
2147 |
zvol_rename_minors(oldname, newname); |
2148 |
#endif |
2130 |
|
2149 |
|
2131 |
/* move any clone references */ |
2150 |
/* move any clone references */ |
2132 |
if (ds->ds_phys->ds_next_clones_obj && |
2151 |
if (ds->ds_phys->ds_next_clones_obj && |
Lines 2165-2170
Link Here
|
2165 |
ASSERT(!dsl_prop_hascb(ds)); |
2184 |
ASSERT(!dsl_prop_hascb(ds)); |
2166 |
} |
2185 |
} |
2167 |
|
2186 |
|
|
|
2187 |
#if defined(__FreeBSD__) && defined(_KERNEL) |
2188 |
mutex_exit(&spa_namespace_lock); |
2189 |
|
2190 |
kmem_free(newname, MAXPATHLEN); |
2191 |
kmem_free(oldname, MAXPATHLEN); |
2192 |
#endif |
2168 |
/* |
2193 |
/* |
2169 |
* Change space accounting. |
2194 |
* Change space accounting. |
2170 |
* Note, pa->*usedsnap and dd_used_breakdown[SNAP] will either |
2195 |
* Note, pa->*usedsnap and dd_used_breakdown[SNAP] will either |