Make 'zpool labelclear -f' work on offlined disks
This patch allows you to clear the label on offlined disks in an active pool with `-f`. Previously, labelclear wouldn't let you do that. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Nguyen <tony.nguyen@delphix.com> Signed-off-by: Tony Hutter <hutter2@llnl.gov> Closes #12511
This commit is contained in:
parent
bc371b2806
commit
2904ec57f0
|
@ -1215,6 +1215,26 @@ zpool_do_remove(int argc, char **argv)
|
|||
return (ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return 1 if a vdev is active (being used in a pool)
|
||||
* Return 0 if a vdev is inactive (offlined or faulted, or not in active pool)
|
||||
*
|
||||
* This is useful for checking if a disk in an active pool is offlined or
|
||||
* faulted.
|
||||
*/
|
||||
static int
|
||||
vdev_is_active(char *vdev_path)
|
||||
{
|
||||
int fd;
|
||||
fd = open(vdev_path, O_EXCL);
|
||||
if (fd < 0) {
|
||||
return (1); /* cant open O_EXCL - disk is active */
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return (0); /* disk is inactive in the pool */
|
||||
}
|
||||
|
||||
/*
|
||||
* zpool labelclear [-f] <vdev>
|
||||
*
|
||||
|
@ -1324,9 +1344,23 @@ zpool_do_labelclear(int argc, char **argv)
|
|||
case POOL_STATE_ACTIVE:
|
||||
case POOL_STATE_SPARE:
|
||||
case POOL_STATE_L2CACHE:
|
||||
/*
|
||||
* We allow the user to call 'zpool offline -f'
|
||||
* on an offlined disk in an active pool. We can check if
|
||||
* the disk is online by calling vdev_is_active().
|
||||
*/
|
||||
if (force && !vdev_is_active(vdev))
|
||||
break;
|
||||
|
||||
(void) fprintf(stderr, gettext(
|
||||
"%s is a member (%s) of pool \"%s\"\n"),
|
||||
"%s is a member (%s) of pool \"%s\""),
|
||||
vdev, zpool_pool_state_to_name(state), name);
|
||||
|
||||
if (force) {
|
||||
(void) fprintf(stderr, gettext(
|
||||
". Offline the disk first to clear its label."));
|
||||
}
|
||||
printf("\n");
|
||||
ret = 1;
|
||||
goto errout;
|
||||
|
||||
|
|
Loading…
Reference in New Issue