summaryrefslogtreecommitdiffstats
path: root/cmd/zpool
diff options
context:
space:
mode:
authorArkadiusz Bubała <[email protected]>2017-10-26 21:26:09 +0200
committerBrian Behlendorf <[email protected]>2017-10-26 12:26:09 -0700
commitd3f2cd7e3b70679f127dd471ea6d37ece27463f2 (patch)
treec83555f629c501dd5742272c62888caa785b7468 /cmd/zpool
parent3ad59c015dce45965fa309a0364a46c6f8bdda9f (diff)
Added no_scrub_restart flag to zpool reopen
Added -n flag to zpool reopen that allows a running scrub operation to continue if there is a device with Dirty Time Log. By default if a component device has a DTL and zpool reopen is executed all running scan operations will be restarted. Added functional tests for `zpool reopen` Tests covers following scenarios: * `zpool reopen` without arguments, * `zpool reopen` with pool name as argument, * `zpool reopen` while scrubbing, * `zpool reopen -n` while scrubbing, * `zpool reopen -n` while resilvering, * `zpool reopen` with bad arguments. Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Tom Caputi <[email protected]> Signed-off-by: Arkadiusz Bubała <[email protected]> Closes #6076 Closes #6746
Diffstat (limited to 'cmd/zpool')
-rw-r--r--cmd/zpool/zpool_main.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c
index db2486aee..d80cbc6c6 100644
--- a/cmd/zpool/zpool_main.c
+++ b/cmd/zpool/zpool_main.c
@@ -28,6 +28,7 @@
* Copyright (c) 2013 by Prasad Joshi (sTec). All rights reserved.
* Copyright 2016 Igor Kozhukhov <[email protected]>.
* Copyright (c) 2017 Datto Inc.
+ * Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
*/
#include <assert.h>
@@ -342,7 +343,7 @@ get_usage(zpool_help_t idx)
case HELP_REMOVE:
return (gettext("\tremove <pool> <device> ...\n"));
case HELP_REOPEN:
- return (gettext("\treopen <pool>\n"));
+ return (gettext("\treopen [-n] <pool>\n"));
case HELP_SCRUB:
return (gettext("\tscrub [-s | -p] <pool> ...\n"));
case HELP_STATUS:
@@ -5855,12 +5856,14 @@ zpool_do_reopen(int argc, char **argv)
{
int c;
int ret = 0;
- zpool_handle_t *zhp;
- char *pool;
+ boolean_t scrub_restart = B_TRUE;
/* check options */
- while ((c = getopt(argc, argv, "")) != -1) {
+ while ((c = getopt(argc, argv, "n")) != -1) {
switch (c) {
+ case 'n':
+ scrub_restart = B_FALSE;
+ break;
case '?':
(void) fprintf(stderr, gettext("invalid option '%c'\n"),
optopt);
@@ -5868,25 +5871,13 @@ zpool_do_reopen(int argc, char **argv)
}
}
- argc--;
- argv++;
-
- if (argc < 1) {
- (void) fprintf(stderr, gettext("missing pool name\n"));
- usage(B_FALSE);
- }
-
- if (argc > 1) {
- (void) fprintf(stderr, gettext("too many arguments\n"));
- usage(B_FALSE);
- }
+ argc -= optind;
+ argv += optind;
- pool = argv[0];
- if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL)
- return (1);
+ /* if argc == 0 we will execute zpool_reopen_one on all pools */
+ ret = for_each_pool(argc, argv, B_TRUE, NULL, zpool_reopen_one,
+ &scrub_restart);
- ret = zpool_reopen(zhp);
- zpool_close(zhp);
return (ret);
}