]> git.proxmox.com Git - mirror_zfs.git/commitdiff
OpenZFS 9681 - ztest failure in spa_history_log_internal due to spa_rename()
authorMatthew Ahrens <mahrens@delphix.com>
Fri, 18 May 2018 22:56:13 +0000 (15:56 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 19 Oct 2018 19:02:28 +0000 (12:02 -0700)
Authored by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Serapheim Dimitropoulos <serapheim.dimitro@delphix.com>
Reviewed by: George Melikov <mail@gmelikov.ru>
Reviewed by: Tom Caputi <tcaputi@datto.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Ported-by: Brian Behlendorf <behlendorf1@llnl.gov>
OpenZFS-issue: https://www.illumos.org/issues/9681
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/6aee0ad7
Closes #8041

cmd/ztest/ztest.c
include/sys/spa.h
module/zfs/spa_misc.c

index cfd7bc12f43d693c554f93bf20ebf948017d6639..f277312c663ba1982cb62c60d8bdea6c75054fe4 100644 (file)
@@ -358,7 +358,6 @@ ztest_func_t ztest_fault_inject;
 ztest_func_t ztest_ddt_repair;
 ztest_func_t ztest_dmu_snapshot_hold;
 ztest_func_t ztest_mmp_enable_disable;
-ztest_func_t ztest_spa_rename;
 ztest_func_t ztest_scrub;
 ztest_func_t ztest_dsl_dataset_promote_busy;
 ztest_func_t ztest_vdev_attach_detach;
@@ -414,7 +413,6 @@ ztest_info_t ztest_info[] = {
        ZTI_INIT(ztest_dmu_snapshot_hold, 1, &zopt_sometimes),
        ZTI_INIT(ztest_mmp_enable_disable, 1, &zopt_sometimes),
        ZTI_INIT(ztest_reguid, 1, &zopt_rarely),
-       ZTI_INIT(ztest_spa_rename, 1, &zopt_rarely),
        ZTI_INIT(ztest_scrub, 1, &zopt_rarely),
        ZTI_INIT(ztest_spa_upgrade, 1, &zopt_rarely),
        ZTI_INIT(ztest_dsl_dataset_promote_busy, 1, &zopt_rarely),
@@ -6122,62 +6120,6 @@ ztest_reguid(ztest_ds_t *zd, uint64_t id)
        VERIFY3U(load, ==, spa_load_guid(spa));
 }
 
-/*
- * Rename the pool to a different name and then rename it back.
- */
-/* ARGSUSED */
-void
-ztest_spa_rename(ztest_ds_t *zd, uint64_t id)
-{
-       char *oldname, *newname;
-       spa_t *spa;
-
-       if (ztest_opts.zo_mmp_test)
-               return;
-
-       (void) pthread_rwlock_wrlock(&ztest_name_lock);
-
-       oldname = ztest_opts.zo_pool;
-       newname = umem_alloc(strlen(oldname) + 5, UMEM_NOFAIL);
-       (void) strcpy(newname, oldname);
-       (void) strcat(newname, "_tmp");
-
-       /*
-        * Do the rename
-        */
-       VERIFY3U(0, ==, spa_rename(oldname, newname));
-
-       /*
-        * Try to open it under the old name, which shouldn't exist
-        */
-       VERIFY3U(ENOENT, ==, spa_open(oldname, &spa, FTAG));
-
-       /*
-        * Open it under the new name and make sure it's still the same spa_t.
-        */
-       VERIFY3U(0, ==, spa_open(newname, &spa, FTAG));
-
-       ASSERT(spa == ztest_spa);
-       spa_close(spa, FTAG);
-
-       /*
-        * Rename it back to the original
-        */
-       VERIFY3U(0, ==, spa_rename(newname, oldname));
-
-       /*
-        * Make sure it can still be opened
-        */
-       VERIFY3U(0, ==, spa_open(oldname, &spa, FTAG));
-
-       ASSERT(spa == ztest_spa);
-       spa_close(spa, FTAG);
-
-       umem_free(newname, strlen(newname) + 1);
-
-       (void) pthread_rwlock_unlock(&ztest_name_lock);
-}
-
 void
 ztest_fletcher(ztest_ds_t *zd, uint64_t id)
 {
@@ -7399,7 +7341,6 @@ main(int argc, char **argv)
        ztest_shared_callstate_t *zc;
        char timebuf[100];
        char numbuf[NN_NUMBUF_SZ];
-       spa_t *spa;
        char *cmd;
        boolean_t hasalt;
        int f;
@@ -7601,24 +7542,6 @@ main(int argc, char **argv)
                        (void) printf("\n");
                }
 
-               /*
-                * It's possible that we killed a child during a rename test,
-                * in which case we'll have a 'ztest_tmp' pool lying around
-                * instead of 'ztest'.  Do a blind rename in case this happened.
-                */
-               kernel_init(FREAD);
-               if (spa_open(ztest_opts.zo_pool, &spa, FTAG) == 0) {
-                       spa_close(spa, FTAG);
-               } else {
-                       char tmpname[ZFS_MAX_DATASET_NAME_LEN];
-                       kernel_fini();
-                       kernel_init(FREAD | FWRITE);
-                       (void) snprintf(tmpname, sizeof (tmpname), "%s_tmp",
-                           ztest_opts.zo_pool);
-                       (void) spa_rename(tmpname, ztest_opts.zo_pool);
-               }
-               kernel_fini();
-
                if (!ztest_opts.zo_mmp_test)
                        ztest_run_zdb(ztest_opts.zo_pool);
        }
index 443d835a1bd05741fe21e5126e6005fe28364c10..ca657ad70fbbb3724bf80fe093267a058254a9b4 100644 (file)
@@ -1009,7 +1009,6 @@ extern void spa_load_note(spa_t *spa, const char *fmt, ...);
 extern void spa_activate_mos_feature(spa_t *spa, const char *feature,
     dmu_tx_t *tx);
 extern void spa_deactivate_mos_feature(spa_t *spa, const char *feature);
-extern int spa_rename(const char *oldname, const char *newname);
 extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid);
 extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid);
 extern char *spa_strdup(const char *);
index 0a7b7b92e45d590d2a8ad48a363daf1c7efc39b3..ae9eb4de7be7c02385a39962183bd7d766dc2301 100644 (file)
  * vdev state is protected by spa_vdev_state_enter() / spa_vdev_state_exit().
  * Like spa_vdev_enter/exit, these are convenience wrappers -- the actual
  * locking is, always, based on spa_namespace_lock and spa_config_lock[].
- *
- * spa_rename() is also implemented within this file since it requires
- * manipulation of the namespace.
  */
 
 static avl_tree_t spa_namespace_avl;
@@ -1335,56 +1332,6 @@ spa_deactivate_mos_feature(spa_t *spa, const char *feature)
                vdev_config_dirty(spa->spa_root_vdev);
 }
 
-/*
- * Rename a spa_t.
- */
-int
-spa_rename(const char *name, const char *newname)
-{
-       spa_t *spa;
-       int err;
-
-       /*
-        * Lookup the spa_t and grab the config lock for writing.  We need to
-        * actually open the pool so that we can sync out the necessary labels.
-        * It's OK to call spa_open() with the namespace lock held because we
-        * allow recursive calls for other reasons.
-        */
-       mutex_enter(&spa_namespace_lock);
-       if ((err = spa_open(name, &spa, FTAG)) != 0) {
-               mutex_exit(&spa_namespace_lock);
-               return (err);
-       }
-
-       spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
-
-       avl_remove(&spa_namespace_avl, spa);
-       (void) strlcpy(spa->spa_name, newname, sizeof (spa->spa_name));
-       avl_add(&spa_namespace_avl, spa);
-
-       /*
-        * Sync all labels to disk with the new names by marking the root vdev
-        * dirty and waiting for it to sync.  It will pick up the new pool name
-        * during the sync.
-        */
-       vdev_config_dirty(spa->spa_root_vdev);
-
-       spa_config_exit(spa, SCL_ALL, FTAG);
-
-       txg_wait_synced(spa->spa_dsl_pool, 0);
-
-       /*
-        * Sync the updated config cache.
-        */
-       spa_write_cachefile(spa, B_FALSE, B_TRUE);
-
-       spa_close(spa, FTAG);
-
-       mutex_exit(&spa_namespace_lock);
-
-       return (0);
-}
-
 /*
  * Return the spa_t associated with given pool_guid, if it exists.  If
  * device_guid is non-zero, determine whether the pool exists *and* contains
@@ -2633,7 +2580,6 @@ EXPORT_SYMBOL(spa_maxblocksize);
 EXPORT_SYMBOL(spa_maxdnodesize);
 
 /* Miscellaneous support routines */
-EXPORT_SYMBOL(spa_rename);
 EXPORT_SYMBOL(spa_guid_exists);
 EXPORT_SYMBOL(spa_strdup);
 EXPORT_SYMBOL(spa_strfree);