summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor K <[email protected]>2019-03-22 23:25:07 +0300
committerBrian Behlendorf <[email protected]>2019-03-22 13:25:07 -0700
commitc048ddaf332504765696a456ab572d6f041051a2 (patch)
tree79d502bdca25ed1f6c1390980652c0154316d793
parent234234ca4de9b2121f69d2cd3b2928197234336d (diff)
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 <[email protected]> Reviewed-by: Tom Caputi <[email protected]> Signed-off-by: Igor Kozhukhov <[email protected]> Closes #8522
-rw-r--r--module/zfs/vdev_removal.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/module/zfs/vdev_removal.c b/module/zfs/vdev_removal.c
index ff39a0a26..98bf2194a 100644
--- a/module/zfs/vdev_removal.c
+++ b/module/zfs/vdev_removal.c
@@ -2101,10 +2101,10 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
nvlist_t **spares, **l2cache, *nv;
uint64_t txg = 0;
uint_t nspares, nl2cache;
- int error = 0;
+ int error = 0, error_log;
boolean_t locked = MUTEX_HELD(&spa_namespace_lock);
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));
@@ -2164,7 +2164,7 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
spa->spa_l2cache.sav_sync = B_TRUE;
} else if (vd != NULL && vd->vdev_islog) {
ASSERT(!locked);
- vd_type = "log";
+ vd_type = VDEV_TYPE_LOG;
vd_path = (vd->vdev_path != NULL) ? vd->vdev_path : "-";
error = spa_vdev_remove_log(vd, &txg);
} else if (vd != NULL) {
@@ -2177,6 +2177,11 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
error = SET_ERROR(ENOENT);
}
+ if (vd_path != NULL)
+ vd_path_log = spa_strdup(vd_path);
+
+ error_log = error;
+
if (!locked)
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,
* 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,
- "%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)
spa_event_post(ev);