]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix vd_path and error in spa_vdev_remove()
authorIgor K <igor@dilos.org>
Fri, 22 Mar 2019 20:25:07 +0000 (23:25 +0300)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 22 Mar 2019 20:25:07 +0000 (13:25 -0700)
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

module/zfs/vdev_removal.c

index ff39a0a26d6a1a1d9c79f92ce293d3fa668a219e..98bf2194a42e32d27b3fb30ce9825d15cc17ab56 100644 (file)
@@ -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);