]> git.proxmox.com Git - mirror_zfs.git/commitdiff
OpenZFS 9164 - assert: newds == os->os_dsl_dataset
authorAndriy Gapon <avg@FreeBSD.org>
Wed, 21 Feb 2018 12:55:55 +0000 (14:55 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 30 Mar 2018 19:00:40 +0000 (12:00 -0700)
Authored by: Andriy Gapon <avg@FreeBSD.org>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: Don Brady <don.brady@delphix.com>
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Approved by: Richard Lowe <richlowe@richlowe.net>
Ported-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Porting Notes:
* Re-enabled and tweaked the zpool_upgrade_007_pos test case
  to successfully run in under 5 minutes.

OpenZFS-issue: https://www.illumos.org/issues/9164
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/0e776dc06a
Closes #6112
Closes #7336

include/sys/dmu_objset.h
module/zfs/dmu_objset.c
module/zfs/zfs_ioctl.c
tests/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib
tests/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib
tests/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_007_pos.ksh

index 0060efd51d8ba2bd97442d8e2b81fb476523c5f2..54fe37e61d8421f80c0da122224b47cc5d3559c0 100644 (file)
@@ -194,8 +194,8 @@ int dmu_objset_own(const char *name, dmu_objset_type_t type,
 int dmu_objset_own_obj(struct dsl_pool *dp, uint64_t obj,
     dmu_objset_type_t type, boolean_t readonly, boolean_t decrypt,
     void *tag, objset_t **osp);
-void dmu_objset_refresh_ownership(objset_t *os, boolean_t key_needed,
-    void *tag);
+void dmu_objset_refresh_ownership(struct dsl_dataset *ds,
+    struct dsl_dataset **newds, boolean_t decrypt, void *tag);
 void dmu_objset_rele(objset_t *os, void *tag);
 void dmu_objset_rele_flags(objset_t *os, boolean_t decrypt, void *tag);
 void dmu_objset_disown(objset_t *os, boolean_t decrypt, void *tag);
index c2dd31a8b8affc8daa50059842636161bea788b2..de7bbf894ea3379da6c609e7356160d42e98db6f 100644 (file)
@@ -791,24 +791,22 @@ dmu_objset_rele(objset_t *os, void *tag)
  * same name so that it can be partially torn down and reconstructed.
  */
 void
-dmu_objset_refresh_ownership(objset_t *os, boolean_t decrypt, void *tag)
+dmu_objset_refresh_ownership(dsl_dataset_t *ds, dsl_dataset_t **newds,
+    boolean_t decrypt, void *tag)
 {
        dsl_pool_t *dp;
-       dsl_dataset_t *ds, *newds;
        char name[ZFS_MAX_DATASET_NAME_LEN];
 
-       ds = os->os_dsl_dataset;
        VERIFY3P(ds, !=, NULL);
        VERIFY3P(ds->ds_owner, ==, tag);
        VERIFY(dsl_dataset_long_held(ds));
 
        dsl_dataset_name(ds, name);
-       dp = dmu_objset_pool(os);
+       dp = ds->ds_dir->dd_pool;
        dsl_pool_config_enter(dp, FTAG);
-       dmu_objset_disown(os, decrypt, tag);
+       dsl_dataset_disown(ds, decrypt, tag);
        VERIFY0(dsl_dataset_own(dp, name,
-           (decrypt) ? DS_HOLD_FLAG_DECRYPT : 0, tag, &newds));
-       VERIFY3P(newds, ==, os->os_dsl_dataset);
+           (decrypt) ? DS_HOLD_FLAG_DECRYPT : 0, tag, newds));
        dsl_pool_config_exit(dp, FTAG);
 }
 
index 92bdec4b960038a4ea3b11078cc1384bdbc4b692..8ef4cc46f09b8929a2ecbb2f221fde54bcb57a37 100644 (file)
@@ -5290,14 +5290,14 @@ zfs_ioc_userspace_upgrade(zfs_cmd_t *zc)
                         * objset needs to be closed & reopened (to grow the
                         * objset_phys_t).  Suspend/resume the fs will do that.
                         */
-                       dsl_dataset_t *ds;
+                       dsl_dataset_t *ds, *newds;
 
                        ds = dmu_objset_ds(zfsvfs->z_os);
                        error = zfs_suspend_fs(zfsvfs);
                        if (error == 0) {
-                               dmu_objset_refresh_ownership(zfsvfs->z_os,
+                               dmu_objset_refresh_ownership(ds, &newds,
                                    B_TRUE, zfsvfs);
-                               error = zfs_resume_fs(zfsvfs, ds);
+                               error = zfs_resume_fs(zfsvfs, newds);
                        }
                }
                if (error == 0)
index c540e0851b3df3ca788027dd4c77d91e1d201ee2..9c7d273b385c783475221299cdfb7b64b6e0e28d 100644 (file)
@@ -42,11 +42,22 @@ set -A spa_create_versions 9 15 24
 set -A zpl_upgrade_versions 3 4  5
 set -A spa_upgrade_versions 9 15 24
 
+function get_pool_version #pool
+{
+       ver=$(get_pool_prop version $1)
+
+       if [ "$ver" = "-" ]; then
+               ver="5000"
+       fi
+
+       echo "$ver"
+}
+
 function default_setup_datasets #rootfs
 {
        typeset rootfs=$1
        typeset pool=${rootfs%%/*}
-       typeset -i vp=$(get_pool_prop version $pool)
+       typeset -i vp=$(get_pool_version $pool)
        typeset -i version
        typeset -i m
        typeset -i spa_version
@@ -107,7 +118,7 @@ function default_cleanup_datasets #rootfs
        typeset rootfs=$1
 
        if datasetexists $rootfs ; then
-               log_must zfs destroy -Rf $rootfs
+               log_must_busy zfs destroy -Rf $rootfs
        fi
 
        if datasetnonexists $rootfs ; then
@@ -119,7 +130,7 @@ function default_check_zfs_upgrade #rootfs
 {
        typeset rootfs=$1
        typeset pool=${rootfs%%/*}
-       typeset -i vp=$(get_pool_prop version $pool)
+       typeset -i vp=$(get_pool_version $pool)
        typeset -i m
        typeset -i spa_version
        typeset -i zpl_version
@@ -150,9 +161,9 @@ function default_check_zfs_upgrade #rootfs
 
                if (( df_ret != 0 )); then
                        if (( spa_version != 0 )) && (( vp < spa_version )); then
-                               log_mustnot zfs upgrade $opt -a >/dev/null
-                               log_must zpool upgrade $pool >/dev/null
-                               vp=$(get_pool_prop version $pool)
+                               log_mustnot eval "zfs upgrade $opt -a >/dev/null"
+                               log_must eval "zpool upgrade $pool >/dev/null"
+                               vp=$(get_pool_version $pool)
                        fi
 
                        log_must zfs upgrade $opt -a
index d4d229cc9382aaacf69ebec84b48323b2b5e251b..238d4ae386f554b87a935de9045d09be451ea23d 100644 (file)
@@ -93,9 +93,8 @@ function destroy_upgraded_pool
        typeset -n pool_files=ZPOOL_VERSION_${vers}_FILES
        typeset -n pool_name=ZPOOL_VERSION_${vers}_NAME
 
-       if poolexists $pool_name; then
-               log_must zpool destroy $pool_name
-       fi
+       destroy_pool $pool_name
+
        for file in $pool_files; do
                rm -f $TEST_BASE_DIR/$file
        done
index 429377f15ce3f21336437b9fd9ba930995b310ed..adc1ba47fcc1fe0c4147fe42490fd5f082ad7ed4 100755 (executable)
 
 verify_runnable "global"
 
-https://github.com/zfsonlinux/zfs/issues/6112
-log_unsupported "Known issue #6112"
-
 function cleanup
 {
        destroy_upgraded_pool $config
 }
 
+POOL_CONFIGS="1raidz 1mirror 2raidz 2mirror 3raidz 3mirror"
+
 log_assert "Import pools of all versions - 'zfs upgrade' on each pool works"
 log_onexit cleanup
 
 # $CONFIGS gets set in the .cfg script
-for config in $CONFIGS; do
+for config in $POOL_CONFIGS; do
        typeset -n pool_name=ZPOOL_VERSION_${config}_NAME
 
        create_old_pool $config