mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 03:08:51 +03:00
zed: mark disks as REMOVED when they are removed
ZED does not take any action for disk removal events if there is no spare VDEV available. Added zpool_vdev_remove_wanted() in libzfs and vdev_remove_wanted() in vdev.c to remove the VDEV through ZED on removal event. This means that if you are running zed and remove a disk, it will be properly marked as REMOVED. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Signed-off-by: Ameer Hamza <ahamza@ixsystems.com> Closes #13797
This commit is contained in:
@@ -1948,6 +1948,14 @@ vdev_open(vdev_t *vd)
|
||||
|
||||
error = vd->vdev_ops->vdev_op_open(vd, &osize, &max_osize,
|
||||
&logical_ashift, &physical_ashift);
|
||||
|
||||
/* Keep the device in removed state if unplugged */
|
||||
if (error == ENOENT && vd->vdev_removed) {
|
||||
vdev_set_state(vd, B_TRUE, VDEV_STATE_REMOVED,
|
||||
VDEV_AUX_NONE);
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Physical volume size should never be larger than its max size, unless
|
||||
* the disk has shrunk while we were reading it or the device is buggy
|
||||
@@ -3166,6 +3174,34 @@ vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg,
|
||||
mutex_exit(&vd->vdev_dtl_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Iterate over all the vdevs except spare, and post kobj events
|
||||
*/
|
||||
void
|
||||
vdev_post_kobj_evt(vdev_t *vd)
|
||||
{
|
||||
if (vd->vdev_ops->vdev_op_kobj_evt_post &&
|
||||
vd->vdev_kobj_flag == B_FALSE) {
|
||||
vd->vdev_kobj_flag = B_TRUE;
|
||||
vd->vdev_ops->vdev_op_kobj_evt_post(vd);
|
||||
}
|
||||
|
||||
for (int c = 0; c < vd->vdev_children; c++)
|
||||
vdev_post_kobj_evt(vd->vdev_child[c]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Iterate over all the vdevs except spare, and clear kobj events
|
||||
*/
|
||||
void
|
||||
vdev_clear_kobj_evt(vdev_t *vd)
|
||||
{
|
||||
vd->vdev_kobj_flag = B_FALSE;
|
||||
|
||||
for (int c = 0; c < vd->vdev_children; c++)
|
||||
vdev_clear_kobj_evt(vd->vdev_child[c]);
|
||||
}
|
||||
|
||||
int
|
||||
vdev_dtl_load(vdev_t *vd)
|
||||
{
|
||||
@@ -3947,6 +3983,29 @@ vdev_degrade(spa_t *spa, uint64_t guid, vdev_aux_t aux)
|
||||
return (spa_vdev_state_exit(spa, vd, 0));
|
||||
}
|
||||
|
||||
int
|
||||
vdev_remove_wanted(spa_t *spa, uint64_t guid)
|
||||
{
|
||||
vdev_t *vd;
|
||||
|
||||
spa_vdev_state_enter(spa, SCL_NONE);
|
||||
|
||||
if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL)
|
||||
return (spa_vdev_state_exit(spa, NULL, SET_ERROR(ENODEV)));
|
||||
|
||||
/*
|
||||
* If the vdev is already removed, then don't do anything.
|
||||
*/
|
||||
if (vd->vdev_removed)
|
||||
return (spa_vdev_state_exit(spa, NULL, 0));
|
||||
|
||||
vd->vdev_remove_wanted = B_TRUE;
|
||||
spa_async_request(spa, SPA_ASYNC_REMOVE);
|
||||
|
||||
return (spa_vdev_state_exit(spa, vd, 0));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Online the given vdev.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user