mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 10:01:01 +03:00
Fix vd_path and error in spa_vdev_remove()
Make a local copy of the vd_path and preserve the removal error for use in spa_history_log_internal(). This is required because after spa_vdev_exit() there is nothing preventing the vdev state from changing. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tom Caputi <tcaputi@datto.com> Signed-off-by: Igor Kozhukhov <igor@dilos.org> Closes #8522
This commit is contained in:
parent
234234ca4d
commit
c048ddaf33
@ -2101,10 +2101,10 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
|||||||
nvlist_t **spares, **l2cache, *nv;
|
nvlist_t **spares, **l2cache, *nv;
|
||||||
uint64_t txg = 0;
|
uint64_t txg = 0;
|
||||||
uint_t nspares, nl2cache;
|
uint_t nspares, nl2cache;
|
||||||
int error = 0;
|
int error = 0, error_log;
|
||||||
boolean_t locked = MUTEX_HELD(&spa_namespace_lock);
|
boolean_t locked = MUTEX_HELD(&spa_namespace_lock);
|
||||||
sysevent_t *ev = NULL;
|
sysevent_t *ev = NULL;
|
||||||
char *vd_type = NULL, *vd_path = NULL;
|
char *vd_type = NULL, *vd_path = NULL, *vd_path_log = NULL;
|
||||||
|
|
||||||
ASSERT(spa_writeable(spa));
|
ASSERT(spa_writeable(spa));
|
||||||
|
|
||||||
@ -2164,7 +2164,7 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
|||||||
spa->spa_l2cache.sav_sync = B_TRUE;
|
spa->spa_l2cache.sav_sync = B_TRUE;
|
||||||
} else if (vd != NULL && vd->vdev_islog) {
|
} else if (vd != NULL && vd->vdev_islog) {
|
||||||
ASSERT(!locked);
|
ASSERT(!locked);
|
||||||
vd_type = "log";
|
vd_type = VDEV_TYPE_LOG;
|
||||||
vd_path = (vd->vdev_path != NULL) ? vd->vdev_path : "-";
|
vd_path = (vd->vdev_path != NULL) ? vd->vdev_path : "-";
|
||||||
error = spa_vdev_remove_log(vd, &txg);
|
error = spa_vdev_remove_log(vd, &txg);
|
||||||
} else if (vd != NULL) {
|
} else if (vd != NULL) {
|
||||||
@ -2177,6 +2177,11 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
|||||||
error = SET_ERROR(ENOENT);
|
error = SET_ERROR(ENOENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (vd_path != NULL)
|
||||||
|
vd_path_log = spa_strdup(vd_path);
|
||||||
|
|
||||||
|
error_log = error;
|
||||||
|
|
||||||
if (!locked)
|
if (!locked)
|
||||||
error = spa_vdev_exit(spa, NULL, txg, error);
|
error = spa_vdev_exit(spa, NULL, txg, error);
|
||||||
|
|
||||||
@ -2187,10 +2192,12 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
|||||||
* Doing that would prevent the txg sync from actually happening,
|
* Doing that would prevent the txg sync from actually happening,
|
||||||
* causing a deadlock.
|
* causing a deadlock.
|
||||||
*/
|
*/
|
||||||
if (error == 0 && vd_type != NULL && vd_path != NULL) {
|
if (error_log == 0 && vd_type != NULL && vd_path_log != NULL) {
|
||||||
spa_history_log_internal(spa, "vdev remove", NULL,
|
spa_history_log_internal(spa, "vdev remove", NULL,
|
||||||
"%s vdev (%s) %s", spa_name(spa), vd_type, vd_path);
|
"%s vdev (%s) %s", spa_name(spa), vd_type, vd_path_log);
|
||||||
}
|
}
|
||||||
|
if (vd_path_log != NULL)
|
||||||
|
spa_strfree(vd_path_log);
|
||||||
|
|
||||||
if (ev != NULL)
|
if (ev != NULL)
|
||||||
spa_event_post(ev);
|
spa_event_post(ev);
|
||||||
|
Loading…
Reference in New Issue
Block a user