Skip to content

Commit

Permalink
OpenZFS 9681 - ztest failure in spa_history_log_internal due to spa_r…
Browse files Browse the repository at this point in the history
…ename()

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: openzfs/openzfs@6aee0ad7
Closes #8041
  • Loading branch information
ahrens authored and behlendorf committed Oct 19, 2018
1 parent 80a91e7 commit d637db9
Show file tree
Hide file tree
Showing 3 changed files with 0 additions and 132 deletions.
77 changes: 0 additions & 77 deletions cmd/ztest/ztest.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down
1 change: 0 additions & 1 deletion include/sys/spa.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down
54 changes: 0 additions & 54 deletions module/zfs/spa_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,9 +225,6 @@
* 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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit d637db9

Please sign in to comment.