cddl/contrib/opensolaris/cmd/zpool/zpool_main.c:

cddl/contrib/opensolaris/cmd/zpool/zpool.8:
cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c:
	Add the "zpool labelclear" command.  This command can be
	used to wipe the label data from a drive that is not
	active in a pool.  The optional "-f" argument can be
	used to treat an exported or foreign vdev as "inactive"
	thus allowing its label information to be cleared.
This commit is contained in:
Justin T. Gibbs 2011-07-18 03:18:06 +00:00
parent d7a00114ea
commit e96cf39826
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=224171
3 changed files with 154 additions and 2 deletions

View File

@ -80,6 +80,11 @@ zpool \- configures ZFS storage pools
\fBzpool iostat\fR [\fB-T\fR u | d ] [\fB-v\fR] [\fIpool\fR] ... [\fIinterval\fR[\fIcount\fR]]
.fi
.LP
.nf
\fBzpool labelclear\fR [\fB-f\fR] \fIdevice\fR
.fi
.LP
.nf
\fBzpool list\fR [\fB-H\fR] [\fB-o\fR \fIproperty\fR[,...]] [\fIpool\fR] ...
@ -1201,6 +1206,28 @@ Verbose statistics. Reports usage statistics for individual \fIvdevs\fR within t
.RE
.sp
.ne 2
.mk
.na
\fB\fBzpool labelclear\fR [\fB-f\fR] \fIdevice\fR
.ad
.sp .6
.RS 4n
Removes ZFS label information from the specified device. The device must not be part of an active pool configuration.
.sp
.ne 2
.mk
.na
\fB\fB-f\fR\fR
.ad
.RS 12n
.rt
Treat exported or foreign devices as inactive.
.RE
.RE
.sp
.ne 2
.mk

View File

@ -57,6 +57,7 @@ static int zpool_do_destroy(int, char **);
static int zpool_do_add(int, char **);
static int zpool_do_remove(int, char **);
static int zpool_do_labelclear(int, char **);
static int zpool_do_list(int, char **);
static int zpool_do_iostat(int, char **);
@ -113,6 +114,7 @@ typedef enum {
HELP_HISTORY,
HELP_IMPORT,
HELP_IOSTAT,
HELP_LABELCLEAR,
HELP_LIST,
HELP_OFFLINE,
HELP_ONLINE,
@ -149,6 +151,8 @@ static zpool_command_t command_table[] = {
{ "add", zpool_do_add, HELP_ADD },
{ "remove", zpool_do_remove, HELP_REMOVE },
{ NULL },
{ "labelclear", zpool_do_labelclear, HELP_LABELCLEAR },
{ NULL },
{ "list", zpool_do_list, HELP_LIST },
{ "iostat", zpool_do_iostat, HELP_IOSTAT },
{ "status", zpool_do_status, HELP_STATUS },
@ -215,6 +219,8 @@ get_usage(zpool_help_t idx) {
case HELP_IOSTAT:
return (gettext("\tiostat [-v] [-T d|u] [pool] ... [interval "
"[count]]\n"));
case HELP_LABELCLEAR:
return (gettext("\tlabelclear [-f] <vdev>\n"));
case HELP_LIST:
return (gettext("\tlist [-H] [-o property[,...]] "
"[-T d|u] [pool] ... [interval [count]]\n"));
@ -560,6 +566,125 @@ zpool_do_remove(int argc, char **argv)
return (ret);
}
/*
* zpool labelclear <vdev>
*
* Verifies that the vdev is not active and zeros out the label information
* on the device.
*/
int
zpool_do_labelclear(int argc, char **argv)
{
char *vdev, *name;
int c, fd = -1, ret = 0;
pool_state_t state;
boolean_t inuse = B_FALSE;
boolean_t force = B_FALSE;
/* check options */
while ((c = getopt(argc, argv, "f")) != -1) {
switch (c) {
case 'f':
force = B_TRUE;
break;
default:
(void) fprintf(stderr, gettext("invalid option '%c'\n"),
optopt);
usage(B_FALSE);
}
}
argc -= optind;
argv += optind;
/* get vdev name */
if (argc < 1) {
(void) fprintf(stderr, gettext("missing vdev device name\n"));
usage(B_FALSE);
}
vdev = argv[0];
if ((fd = open(vdev, O_RDWR)) < 0) {
(void) fprintf(stderr, gettext("Unable to open %s\n"), vdev);
return (B_FALSE);
}
name = NULL;
if (zpool_in_use(g_zfs, fd, &state, &name, &inuse) != 0) {
if (force)
goto wipe_label;
(void) fprintf(stderr,
gettext("Unable to determine pool state for %s\n"
"Use -f to force the clearing any label data\n"), vdev);
return (1);
}
if (inuse) {
switch (state) {
default:
case POOL_STATE_ACTIVE:
case POOL_STATE_SPARE:
case POOL_STATE_L2CACHE:
(void) fprintf(stderr,
gettext("labelclear operation failed.\n"
"\tVdev %s is a member (%s), of pool \"%s\".\n"
"\tTo remove label information from this device, export or destroy\n"
"\tthe pool, or remove %s from the configuration of this pool\n"
"\tand retry the labelclear operation\n"),
vdev, zpool_pool_state_to_name(state), name, vdev);
ret = 1;
goto errout;
case POOL_STATE_EXPORTED:
if (force)
break;
(void) fprintf(stderr,
gettext("labelclear operation failed.\n"
"\tVdev %s is a member of the exported pool \"%s\".\n"
"\tUse \"zpool labelclear -f %s\" to force the removal of label\n"
"\tinformation.\n"),
vdev, name, vdev);
ret = 1;
goto errout;
case POOL_STATE_POTENTIALLY_ACTIVE:
if (force)
break;
(void) fprintf(stderr,
gettext("labelclear operation failed.\n"
"\tVdev %s is a member of the pool \"%s\".\n"
"\tThis pool is unknown to this system, but may be active on\n"
"\tanother system. Use \'zpool labelclear -f %s\' to force the\n"
"\tremoval of label information.\n"),
vdev, name, vdev);
ret = 1;
goto errout;
case POOL_STATE_DESTROYED:
/* inuse should never be set for a destoryed pool... */
break;
}
}
wipe_label:
if (zpool_clear_label(fd) != 0) {
(void) fprintf(stderr,
gettext("Label clear failed on vdev %s\n"), vdev);
ret = 1;
}
errout:
close(fd);
if (name != NULL)
free(name);
return (ret);
}
/*
* zpool create [-fn] [-o property=value] ...
* [-O file-system-property=value] ...

View File

@ -1084,8 +1084,8 @@ zpool_open_func(void *arg)
/*
* Given a file descriptor, clear (zero) the label information. This function
* is currently only used in the appliance stack as part of the ZFS sysevent
* module.
* is used in the appliance stack as part of the ZFS sysevent module and
* to implement the "zpool labelclear" command.
*/
int
zpool_clear_label(int fd)