Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
Context not available. | |||||
fnvlist_free(suspended); | fnvlist_free(suspended); | ||||
} | } | ||||
#ifdef __FreeBSD__ | |||||
#ifdef _KERNEL | |||||
if (error == 0) { | |||||
for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL; | |||||
pair = nvlist_next_nvpair(snaps, pair)) { | |||||
char *snapname = nvpair_name(pair); | |||||
zvol_create_minors(snapname); | |||||
} | |||||
} | |||||
#endif | |||||
#endif | |||||
return (error); | return (error); | ||||
} | } | ||||
Context not available. | |||||
const char *ddrsa_oldsnapname; | const char *ddrsa_oldsnapname; | ||||
const char *ddrsa_newsnapname; | const char *ddrsa_newsnapname; | ||||
boolean_t ddrsa_recursive; | boolean_t ddrsa_recursive; | ||||
nvlist_t *ddrsa_renamed; | |||||
dmu_tx_t *ddrsa_tx; | dmu_tx_t *ddrsa_tx; | ||||
} dsl_dataset_rename_snapshot_arg_t; | } dsl_dataset_rename_snapshot_arg_t; | ||||
Context not available. | |||||
dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp, | dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp, | ||||
dsl_dataset_t *hds, void *arg) | dsl_dataset_t *hds, void *arg) | ||||
{ | { | ||||
#ifdef __FreeBSD__ | char namebuf[ZFS_MAX_DATASET_NAME_LEN]; | ||||
#ifdef _KERNEL | |||||
char *oldname, *newname; | |||||
#endif | |||||
#endif | |||||
dsl_dataset_rename_snapshot_arg_t *ddrsa = arg; | dsl_dataset_rename_snapshot_arg_t *ddrsa = arg; | ||||
dsl_dataset_t *ds; | dsl_dataset_t *ds; | ||||
uint64_t val; | uint64_t val; | ||||
Context not available. | |||||
VERIFY0(zap_add(dp->dp_meta_objset, | VERIFY0(zap_add(dp->dp_meta_objset, | ||||
dsl_dataset_phys(hds)->ds_snapnames_zapobj, | dsl_dataset_phys(hds)->ds_snapnames_zapobj, | ||||
ds->ds_snapname, 8, 1, &ds->ds_object, tx)); | ds->ds_snapname, 8, 1, &ds->ds_object, tx)); | ||||
#ifdef __FreeBSD__ | |||||
#ifdef _KERNEL | |||||
oldname = kmem_alloc(MAXPATHLEN, KM_SLEEP); | |||||
newname = kmem_alloc(MAXPATHLEN, KM_SLEEP); | |||||
snprintf(oldname, MAXPATHLEN, "%s@%s", ddrsa->ddrsa_fsname, | |||||
ddrsa->ddrsa_oldsnapname); | |||||
snprintf(newname, MAXPATHLEN, "%s@%s", ddrsa->ddrsa_fsname, | |||||
ddrsa->ddrsa_newsnapname); | |||||
zfsvfs_update_fromname(oldname, newname); | |||||
zvol_rename_minors(oldname, newname); | |||||
kmem_free(newname, MAXPATHLEN); | |||||
kmem_free(oldname, MAXPATHLEN); | |||||
#endif | |||||
#endif | |||||
dsl_dataset_rele(ds, FTAG); | dsl_dataset_rele(ds, FTAG); | ||||
if (ddrsa->ddrsa_renamed != NULL) { | |||||
dsl_dataset_name(hds, namebuf); | |||||
fnvlist_add_boolean(ddrsa->ddrsa_renamed, namebuf); | |||||
} | |||||
return (0); | return (0); | ||||
} | } | ||||
Context not available. | |||||
int | int | ||||
dsl_dataset_rename_snapshot(const char *fsname, | dsl_dataset_rename_snapshot(const char *fsname, | ||||
const char *oldsnapname, const char *newsnapname, boolean_t recursive) | const char *oldsnapname, const char *newsnapname, boolean_t recursive, | ||||
nvlist_t *renamed) | |||||
{ | { | ||||
dsl_dataset_rename_snapshot_arg_t ddrsa; | dsl_dataset_rename_snapshot_arg_t ddrsa; | ||||
Context not available. | |||||
ddrsa.ddrsa_oldsnapname = oldsnapname; | ddrsa.ddrsa_oldsnapname = oldsnapname; | ||||
ddrsa.ddrsa_newsnapname = newsnapname; | ddrsa.ddrsa_newsnapname = newsnapname; | ||||
ddrsa.ddrsa_recursive = recursive; | ddrsa.ddrsa_recursive = recursive; | ||||
ddrsa.ddrsa_renamed = renamed; | |||||
return (dsl_sync_task(fsname, dsl_dataset_rename_snapshot_check, | return (dsl_sync_task(fsname, dsl_dataset_rename_snapshot_check, | ||||
dsl_dataset_rename_snapshot_sync, &ddrsa, | dsl_dataset_rename_snapshot_sync, &ddrsa, | ||||
Context not available. | |||||
dsl_dir_t *odd = NULL; | dsl_dir_t *odd = NULL; | ||||
uint64_t oldnext_obj; | uint64_t oldnext_obj; | ||||
int64_t delta; | int64_t delta; | ||||
#if defined(__FreeBSD__) && defined(_KERNEL) | |||||
char *oldname, *newname; | |||||
#endif | |||||
VERIFY0(promote_hold(ddpa, dp, FTAG)); | VERIFY0(promote_hold(ddpa, dp, FTAG)); | ||||
hds = ddpa->ddpa_clone; | hds = ddpa->ddpa_clone; | ||||
Context not available. | |||||
dsl_dir_phys(dd)->dd_clones, origin_head->ds_object, tx)); | dsl_dir_phys(dd)->dd_clones, origin_head->ds_object, tx)); | ||||
} | } | ||||
#if defined(__FreeBSD__) && defined(_KERNEL) | |||||
/* Take the spa_namespace_lock early so zvol renames don't deadlock. */ | |||||
mutex_enter(&spa_namespace_lock); | |||||
oldname = kmem_alloc(MAXPATHLEN, KM_SLEEP); | |||||
newname = kmem_alloc(MAXPATHLEN, KM_SLEEP); | |||||
#endif | |||||
/* move snapshots to this dir */ | /* move snapshots to this dir */ | ||||
for (snap = list_head(&ddpa->shared_snaps); snap; | for (snap = list_head(&ddpa->shared_snaps); snap; | ||||
snap = list_next(&ddpa->shared_snaps, snap)) { | snap = list_next(&ddpa->shared_snaps, snap)) { | ||||
Context not available. | |||||
dsl_fs_ss_count_adjust(hds->ds_dir, 1, | dsl_fs_ss_count_adjust(hds->ds_dir, 1, | ||||
DD_FIELD_SNAPSHOT_COUNT, tx); | DD_FIELD_SNAPSHOT_COUNT, tx); | ||||
if (ddpa->ddpa_moved != NULL) | |||||
fnvlist_add_boolean(ddpa->ddpa_moved, ds->ds_snapname); | |||||
/* change containing dsl_dir */ | /* change containing dsl_dir */ | ||||
dmu_buf_will_dirty(ds->ds_dbuf, tx); | dmu_buf_will_dirty(ds->ds_dbuf, tx); | ||||
ASSERT3U(dsl_dataset_phys(ds)->ds_dir_obj, ==, odd->dd_object); | ASSERT3U(dsl_dataset_phys(ds)->ds_dir_obj, ==, odd->dd_object); | ||||
Context not available. | |||||
VERIFY0(dsl_dir_hold_obj(dp, dd->dd_object, | VERIFY0(dsl_dir_hold_obj(dp, dd->dd_object, | ||||
NULL, ds, &ds->ds_dir)); | NULL, ds, &ds->ds_dir)); | ||||
#if defined(__FreeBSD__) && defined(_KERNEL) | |||||
dsl_dataset_name(ds, newname); | |||||
zfsvfs_update_fromname(oldname, newname); | |||||
zvol_rename_minors(oldname, newname); | |||||
#endif | |||||
/* move any clone references */ | /* move any clone references */ | ||||
if (dsl_dataset_phys(ds)->ds_next_clones_obj && | if (dsl_dataset_phys(ds)->ds_next_clones_obj && | ||||
spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { | spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { | ||||
Context not available. | |||||
ASSERT(!dsl_prop_hascb(ds)); | ASSERT(!dsl_prop_hascb(ds)); | ||||
} | } | ||||
#if defined(__FreeBSD__) && defined(_KERNEL) | |||||
mutex_exit(&spa_namespace_lock); | |||||
kmem_free(newname, MAXPATHLEN); | |||||
kmem_free(oldname, MAXPATHLEN); | |||||
#endif | |||||
/* | /* | ||||
* Change space accounting. | * Change space accounting. | ||||
* Note, pa->*usedsnap and dd_used_breakdown[SNAP] will either | * Note, pa->*usedsnap and dd_used_breakdown[SNAP] will either | ||||
Context not available. | |||||
* in with the name. (It must be at least ZFS_MAX_DATASET_NAME_LEN bytes long.) | * in with the name. (It must be at least ZFS_MAX_DATASET_NAME_LEN bytes long.) | ||||
*/ | */ | ||||
int | int | ||||
dsl_dataset_promote(const char *name, char *conflsnap) | dsl_dataset_promote(const char *name, char *conflsnap, nvlist_t *moved) | ||||
{ | { | ||||
dsl_dataset_promote_arg_t ddpa = { 0 }; | dsl_dataset_promote_arg_t ddpa = { 0 }; | ||||
uint64_t numsnaps; | uint64_t numsnaps; | ||||
Context not available. | |||||
return (error); | return (error); | ||||
ddpa.ddpa_clonename = name; | ddpa.ddpa_clonename = name; | ||||
ddpa.ddpa_moved = moved; | |||||
ddpa.err_ds = fnvlist_alloc(); | ddpa.err_ds = fnvlist_alloc(); | ||||
ddpa.cr = CRED(); | ddpa.cr = CRED(); | ||||
Context not available. |