diff options
author | George Wilson <George.Wilson@Sun.COM> | 2010-02-15 07:37:00 -0800 |
---|---|---|
committer | George Wilson <George.Wilson@Sun.COM> | 2010-02-15 07:37:00 -0800 |
commit | 8d265e661a88084e97824e4a5ef1a337c9beb663 (patch) | |
tree | 500e9b7abfbf8a9f7eec2688663a79307b48d4de | |
parent | 113d3ed7581d96fe85b7b35e16c8b0ea4a9fa702 (diff) | |
download | illumos-joyent-8d265e661a88084e97824e4a5ef1a337c9beb663.tar.gz |
6926242 disabling dedup on zvols needs to check pool version
-rw-r--r-- | usr/src/uts/common/fs/zfs/zvol.c | 35 |
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); |