summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Wilson <George.Wilson@Sun.COM>2010-02-15 07:37:00 -0800
committerGeorge Wilson <George.Wilson@Sun.COM>2010-02-15 07:37:00 -0800
commit8d265e661a88084e97824e4a5ef1a337c9beb663 (patch)
tree500e9b7abfbf8a9f7eec2688663a79307b48d4de
parent113d3ed7581d96fe85b7b35e16c8b0ea4a9fa702 (diff)
downloadillumos-joyent-8d265e661a88084e97824e4a5ef1a337c9beb663.tar.gz
6926242 disabling dedup on zvols needs to check pool version
-rw-r--r--usr/src/uts/common/fs/zfs/zvol.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/usr/src/uts/common/fs/zfs/zvol.c b/usr/src/uts/common/fs/zfs/zvol.c
index b22ec4a4e7..b65f192c5d 100644
--- a/usr/src/uts/common/fs/zfs/zvol.c
+++ b/usr/src/uts/common/fs/zfs/zvol.c
@@ -1589,6 +1589,7 @@ zvol_dump_init(zvol_state_t *zv, boolean_t resize)
int error = 0;
objset_t *os = zv->zv_objset;
nvlist_t *nv = NULL;
+ uint64_t version = spa_version(dmu_objset_spa(zv->zv_objset));
ASSERT(MUTEX_HELD(&zvol_state_lock));
error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, 0,
@@ -1626,8 +1627,11 @@ zvol_dump_init(zvol_state_t *zv, boolean_t resize)
zfs_prop_to_name(ZFS_PROP_REFRESERVATION), &refresrv, NULL);
error = error ? error : dsl_prop_get_integer(zv->zv_name,
zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE), &vbs, NULL);
- error = error ? error : dsl_prop_get_integer(zv->zv_name,
- zfs_prop_to_name(ZFS_PROP_DEDUP), &dedup, NULL);
+ if (version >= SPA_VERSION_DEDUP) {
+ error = error ? error :
+ dsl_prop_get_integer(zv->zv_name,
+ zfs_prop_to_name(ZFS_PROP_DEDUP), &dedup, NULL);
+ }
error = error ? error : zap_update(os, ZVOL_ZAP_OBJ,
zfs_prop_to_name(ZFS_PROP_COMPRESSION), 8, 1,
@@ -1642,9 +1646,11 @@ zvol_dump_init(zvol_state_t *zv, boolean_t resize)
&vbs, tx);
error = error ? error : dmu_object_set_blocksize(
os, ZVOL_OBJ, SPA_MAXBLOCKSIZE, 0, tx);
- error = error ? error : zap_update(os, ZVOL_ZAP_OBJ,
- zfs_prop_to_name(ZFS_PROP_DEDUP), 8, 1,
- &dedup, tx);
+ if (version >= SPA_VERSION_DEDUP) {
+ error = error ? error : zap_update(os, ZVOL_ZAP_OBJ,
+ zfs_prop_to_name(ZFS_PROP_DEDUP), 8, 1,
+ &dedup, tx);
+ }
if (error == 0)
zv->zv_volblocksize = SPA_MAXBLOCKSIZE;
}
@@ -1664,9 +1670,11 @@ zvol_dump_init(zvol_state_t *zv, boolean_t resize)
VERIFY(nvlist_add_uint64(nv,
zfs_prop_to_name(ZFS_PROP_CHECKSUM),
ZIO_CHECKSUM_OFF) == 0);
- VERIFY(nvlist_add_uint64(nv,
- zfs_prop_to_name(ZFS_PROP_DEDUP),
- ZIO_CHECKSUM_OFF) == 0);
+ if (version >= SPA_VERSION_DEDUP) {
+ VERIFY(nvlist_add_uint64(nv,
+ zfs_prop_to_name(ZFS_PROP_DEDUP),
+ ZIO_CHECKSUM_OFF) == 0);
+ }
error = zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL,
nv, NULL);
@@ -1742,6 +1750,7 @@ zvol_dump_fini(zvol_state_t *zv)
nvlist_t *nv;
int error = 0;
uint64_t checksum, compress, refresrv, vbs, dedup;
+ uint64_t version = spa_version(dmu_objset_spa(zv->zv_objset));
/*
* Attempt to restore the zvol back to its pre-dumpified state.
@@ -1768,8 +1777,6 @@ zvol_dump_fini(zvol_state_t *zv)
zfs_prop_to_name(ZFS_PROP_REFRESERVATION), 8, 1, &refresrv);
(void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ,
zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE), 8, 1, &vbs);
- (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ,
- zfs_prop_to_name(ZFS_PROP_DEDUP), 8, 1, &dedup);
VERIFY(nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_SLEEP) == 0);
(void) nvlist_add_uint64(nv,
@@ -1778,8 +1785,12 @@ zvol_dump_fini(zvol_state_t *zv)
zfs_prop_to_name(ZFS_PROP_COMPRESSION), compress);
(void) nvlist_add_uint64(nv,
zfs_prop_to_name(ZFS_PROP_REFRESERVATION), refresrv);
- (void) nvlist_add_uint64(nv,
- zfs_prop_to_name(ZFS_PROP_DEDUP), dedup);
+ if (version >= SPA_VERSION_DEDUP &&
+ zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ,
+ zfs_prop_to_name(ZFS_PROP_DEDUP), 8, 1, &dedup) == 0) {
+ (void) nvlist_add_uint64(nv,
+ zfs_prop_to_name(ZFS_PROP_DEDUP), dedup);
+ }
(void) zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL,
nv, NULL);
nvlist_free(nv);