diff options
Diffstat (limited to 'cmd/zhack')
-rw-r--r-- | cmd/zhack/zhack.c | 107 |
1 files changed, 4 insertions, 103 deletions
diff --git a/cmd/zhack/zhack.c b/cmd/zhack/zhack.c index 32d29fd44..eedd17c30 100644 --- a/cmd/zhack/zhack.c +++ b/cmd/zhack/zhack.c @@ -58,13 +58,12 @@ libzfs_handle_t *g_zfs; static importargs_t g_importargs; static char *g_pool; static boolean_t g_readonly; -static boolean_t g_force = B_FALSE; static void usage(void) { (void) fprintf(stderr, - "Usage: %s [-c cachefile] [-d dir] [-f] <subcommand> <args> ...\n" + "Usage: %s [-c cachefile] [-d dir] <subcommand> <args> ...\n" "where <subcommand> <args> is one of the following:\n" "\n", cmdname); @@ -74,9 +73,6 @@ usage(void) " feature enable [-d desc] <pool> <feature>\n" " add a new enabled feature to the pool\n" " -d <desc> sets the feature's description\n" - " feature disable <pool> <feature>\n" - " remove an enabled, but not active, feature\n" - " from the pool.\n" " feature ref [-md] <pool> <feature>\n" " change the refcount on the given feature\n" " -d decrease instead of increase the refcount\n" @@ -357,10 +353,8 @@ zhack_do_feature_enable(int argc, char **argv) zhack_spa_open(target, B_FALSE, FTAG, &spa); mos = spa->spa_meta_objset; - if (zfeature_is_supported(feature.fi_guid) && (g_force == B_FALSE)) - fatal(spa, FTAG, - "'%s' is a real feature, will not enable\n" - "provide the -f option to force override", feature.fi_guid); + if (zfeature_is_supported(feature.fi_guid)) + fatal(spa, FTAG, "'%s' is a real feature, will not enable"); if (0 == zap_contains(mos, spa->spa_feat_desc_obj, feature.fi_guid)) fatal(spa, FTAG, "feature already enabled: %s", feature.fi_guid); @@ -374,94 +368,6 @@ zhack_do_feature_enable(int argc, char **argv) } static void -zhack_feature_disable_sync(void *arg, dmu_tx_t *tx) -{ - spa_t *spa = dmu_tx_pool(tx)->dp_spa; - zfeature_info_t *feature = arg; - - feature_disable_sync(spa, feature, tx); - - spa_history_log_internal(spa, "zhack disable feature", tx, - "name=%s can_readonly=%u", - feature->fi_guid, feature->fi_can_readonly); -} - -static void -zhack_do_feature_disable(int argc, char **argv) -{ - char c; - char *target; - uint64_t count; - spa_t *spa; - objset_t *mos; - zfeature_info_t feature; - spa_feature_t nodeps[] = { SPA_FEATURE_NONE }; - - /* - * fi_desc does not matter here because it was written to disk - * when the feature was enabled, but we need to properly set the - * feature for read or write based on the information we read off - * disk later. - */ - feature.fi_uname = "zhack"; - feature.fi_mos = B_TRUE; - feature.fi_desc = NULL; - feature.fi_depends = nodeps; - feature.fi_feature = SPA_FEATURE_NONE; - - optind = 1; - while ((c = getopt(argc, argv, "")) != -1) { - switch (c) { - default: - usage(); - break; - } - } - argc -= optind; - argv += optind; - - if (argc < 2) { - (void) fprintf(stderr, "error: missing feature or pool name\n"); - usage(); - } - target = argv[0]; - feature.fi_guid = argv[1]; - - if (!zfeature_is_valid_guid(feature.fi_guid)) - fatal(NULL, FTAG, "invalid feature guid: %s", feature.fi_guid); - - zhack_spa_open(target, B_FALSE, FTAG, &spa); - mos = spa->spa_meta_objset; - - if (zfeature_is_supported(feature.fi_guid) && (g_force == B_FALSE)) { - fatal(spa, FTAG, - "'%s' is a real feature, will not disable\n" - "provide the -f option to force override", feature.fi_guid); - } - - if (0 == zap_contains(mos, spa->spa_feat_for_read_obj, - feature.fi_guid)) { - feature.fi_can_readonly = B_FALSE; - } else if (0 == zap_contains(mos, spa->spa_feat_for_write_obj, - feature.fi_guid)) { - feature.fi_can_readonly = B_TRUE; - } else { - fatal(spa, FTAG, "feature is not enabled: %s", feature.fi_guid); - } - - if (feature_get_refcount_from_disk(spa, &feature, &count) == 0 && - count > 0) { - fatal(spa, FTAG, "feature '%s' is active, can not disable", - feature.fi_guid); - } - - VERIFY0(dsl_sync_task(spa_name(spa), NULL, - zhack_feature_disable_sync, &feature, 5, ZFS_SPACE_CHECK_NORMAL)); - - spa_close(spa, FTAG); -} - -static void feature_incr_sync(void *arg, dmu_tx_t *tx) { spa_t *spa = dmu_tx_pool(tx)->dp_spa; @@ -589,8 +495,6 @@ zhack_do_feature(int argc, char **argv) zhack_do_feature_stat(argc, argv); } else if (strcmp(subcommand, "enable") == 0) { zhack_do_feature_enable(argc, argv); - } else if (strcmp(subcommand, "disable") == 0) { - zhack_do_feature_disable(argc, argv); } else if (strcmp(subcommand, "ref") == 0) { zhack_do_feature_ref(argc, argv); } else { @@ -619,7 +523,7 @@ main(int argc, char **argv) dprintf_setup(&argc, argv); zfs_prop_init(); - while ((c = getopt(argc, argv, "c:d:f")) != -1) { + while ((c = getopt(argc, argv, "c:d:")) != -1) { switch (c) { case 'c': g_importargs.cachefile = optarg; @@ -628,9 +532,6 @@ main(int argc, char **argv) assert(g_importargs.paths < MAX_NUM_PATHS); g_importargs.path[g_importargs.paths++] = optarg; break; - case 'f': - g_force = B_TRUE; - break; default: usage(); break; |