View | Details | Raw Unified | Return to bug 178999
Collapse All | Expand All

(-)sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c (+4 lines)
Lines 3296-3301 Link Here
3296
		if (error != 0)
3296
		if (error != 0)
3297
			(void) dsl_destroy_head(fsname);
3297
			(void) dsl_destroy_head(fsname);
3298
	}
3298
	}
3299
#ifdef __FreeBSD__
3300
	if (error == 0)
3301
		zvol_create_minors(fsname);
3302
#endif
3299
	return (error);
3303
	return (error);
3300
}
3304
}
3301
3305
(-)sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c (-15 / +40 lines)
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
(-)sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c (-4 / +10 lines)
Lines 2302-2310 Link Here
2302
	if (dmu_objset_type(os) == DMU_OST_ZVOL) {
2302
	if (dmu_objset_type(os) == DMU_OST_ZVOL) {
2303
		dsl_dataset_long_hold(os->os_dsl_dataset, FTAG);
2303
		dsl_dataset_long_hold(os->os_dsl_dataset, FTAG);
2304
		dsl_pool_rele(dmu_objset_pool(os), FTAG);
2304
		dsl_pool_rele(dmu_objset_pool(os), FTAG);
2305
		if ((error = zvol_create_minor(name)) == 0)
2305
		error = zvol_create_minor(name);
2306
		if (error == 0 || error == EEXIST) {
2306
			error = zvol_create_snapshots(os, name);
2307
			error = zvol_create_snapshots(os, name);
2307
		else {
2308
		} else {
2308
			printf("ZFS WARNING: Unable to create ZVOL %s (error=%d).\n",
2309
			printf("ZFS WARNING: Unable to create ZVOL %s (error=%d).\n",
2309
			    name, error);
2310
			    name, error);
2310
		}
2311
		}
Lines 2387-2398 Link Here
2387
	size_t oldnamelen, newnamelen;
2388
	size_t oldnamelen, newnamelen;
2388
	zvol_state_t *zv;
2389
	zvol_state_t *zv;
2389
	char *namebuf;
2390
	char *namebuf;
2391
	boolean_t locked = B_FALSE;
2390
2392
2391
	oldnamelen = strlen(oldname);
2393
	oldnamelen = strlen(oldname);
2392
	newnamelen = strlen(newname);
2394
	newnamelen = strlen(newname);
2393
2395
2394
	DROP_GIANT();
2396
	DROP_GIANT();
2395
	mutex_enter(&spa_namespace_lock);
2397
	if (!MUTEX_HELD(&spa_namespace_lock)) {
2398
		mutex_enter(&spa_namespace_lock);
2399
		locked = B_TRUE;
2400
	}
2396
	g_topology_lock();
2401
	g_topology_lock();
2397
2402
2398
	LIST_FOREACH(gp, &zfs_zvol_class.geom, geom) {
2403
	LIST_FOREACH(gp, &zfs_zvol_class.geom, geom) {
Lines 2415-2420 Link Here
2415
	}
2420
	}
2416
2421
2417
	g_topology_unlock();
2422
	g_topology_unlock();
2418
	mutex_exit(&spa_namespace_lock);
2423
	if (locked)
2424
		mutex_exit(&spa_namespace_lock);
2419
	PICKUP_GIANT();
2425
	PICKUP_GIANT();
2420
}
2426
}

Return to bug 178999