From 718d718a734e79bad0b9f8a264219b238fabaf44 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Thu, 21 May 2009 16:24:49 -0700 Subject: [PATCH] 6843568 ztest fails when calling dmu_objset_destroy() --- usr/src/cmd/ztest/ztest.c | 78 ++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/usr/src/cmd/ztest/ztest.c b/usr/src/cmd/ztest/ztest.c index dc5907b0c4..cb59116d42 100644 --- a/usr/src/cmd/ztest/ztest.c +++ b/usr/src/cmd/ztest/ztest.c @@ -1443,6 +1443,42 @@ ztest_dmu_snapshot_create_destroy(ztest_args_t *za) } /* + * Cleanup non-standard snapshots and clones. + */ +void +ztest_dsl_dataset_cleanup(char *osname, uint64_t curval) +{ + char snap1name[100]; + char clone1name[100]; + char snap2name[100]; + char clone2name[100]; + char snap3name[100]; + int error; + + (void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval); + (void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval); + (void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval); + (void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval); + (void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval); + + error = dmu_objset_destroy(clone2name); + if (error && error != ENOENT) + fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error); + error = dmu_objset_destroy(snap3name); + if (error && error != ENOENT) + fatal(0, "dmu_objset_destroy(%s) = %d", snap3name, error); + error = dmu_objset_destroy(snap2name); + if (error && error != ENOENT) + fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); + error = dmu_objset_destroy(clone1name); + if (error && error != ENOENT) + fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error); + error = dmu_objset_destroy(snap1name); + if (error && error != ENOENT) + fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error); +} + +/* * Verify dsl_dataset_promote handles EBUSY */ void @@ -1458,35 +1494,19 @@ ztest_dsl_dataset_promote_busy(ztest_args_t *za) char clone2name[100]; char snap3name[100]; char osname[MAXNAMELEN]; - uint64_t curval; - - curval = za->za_instance; + uint64_t curval = za->za_instance; (void) rw_rdlock(&ztest_shared->zs_name_lock); dmu_objset_name(os, osname); + ztest_dsl_dataset_cleanup(osname, curval); + (void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval); (void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval); (void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval); (void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval); (void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval); - error = dmu_objset_destroy(clone2name); - if (error != 0 && error != ENOENT) - fatal(0, "dmu_objset_destroy() = %d", error); - error = dmu_objset_destroy(snap3name); - if (error != 0 && error != ENOENT) - fatal(0, "dmu_objset_destroy() = %d", error); - error = dmu_objset_destroy(snap2name); - if (error != 0 && error != ENOENT) - fatal(0, "dmu_objset_destroy() = %d", error); - error = dmu_objset_destroy(clone1name); - if (error != 0 && error != ENOENT) - fatal(0, "dmu_objset_destroy() = %d", error); - error = dmu_objset_destroy(snap1name); - if (error != 0 && error != ENOENT) - fatal(0, "dmu_objset_destroy() = %d", error); - error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, NULL, FALSE); if (error && error != EEXIST) { @@ -1559,21 +1579,7 @@ ztest_dsl_dataset_promote_busy(ztest_args_t *za) dsl_dataset_disown(ds, FTAG); out: - error = dmu_objset_destroy(clone2name); - if (error && error != ENOENT) - fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error); - error = dmu_objset_destroy(snap3name); - if (error && error != ENOENT) - fatal(0, "dmu_objset_destroy(%s) = %d", snap3name, error); - error = dmu_objset_destroy(snap2name); - if (error && error != ENOENT) - fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); - error = dmu_objset_destroy(clone1name); - if (error && error != ENOENT) - fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error); - error = dmu_objset_destroy(snap1name); - if (error && error != ENOENT) - fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error); + ztest_dsl_dataset_cleanup(osname, curval); (void) rw_unlock(&ztest_shared->zs_name_lock); } @@ -3691,6 +3697,10 @@ ztest_run(char *pool) (void) snprintf(name, 100, "%s/%s_%d", pool, pool, d); if (zopt_verbose >= 3) (void) printf("Destroying %s to free up space\n", name); + + /* Cleanup any non-standard clones and snapshots */ + ztest_dsl_dataset_cleanup(name, za[d].za_instance); + (void) dmu_objset_find(name, ztest_destroy_cb, &za[d], DS_FIND_SNAPSHOTS | DS_FIND_CHILDREN); (void) rw_unlock(&ztest_shared->zs_name_lock); -- 2.11.4.GIT