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 (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>
|
* zpool labelclear [-f] <vdev>
|
||||||
*
|
*
|
||||||
|
@ -1324,9 +1344,23 @@ zpool_do_labelclear(int argc, char **argv)
|
||||||
case POOL_STATE_ACTIVE:
|
case POOL_STATE_ACTIVE:
|
||||||
case POOL_STATE_SPARE:
|
case POOL_STATE_SPARE:
|
||||||
case POOL_STATE_L2CACHE:
|
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(
|
(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);
|
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;
|
ret = 1;
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue