]> git.proxmox.com Git - mirror_zfs.git/commitdiff
spa_export_common: refactor common exit points
authorWill Andrews <will@firepipe.net>
Mon, 25 Jan 2021 23:04:11 +0000 (17:04 -0600)
committerGitHub <noreply@github.com>
Mon, 25 Jan 2021 23:04:11 +0000 (15:04 -0800)
Create a common exit point for spa_export_common (a very long
function), which avoids missing steps on failure.  This work
is helpful for the planned forced pool export changes.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Will Andrews <will@firepipe.net>
Closes #11514

module/zfs/spa.c

index 57a492993eaeb8f8e2ad5b442b19e70a0fff57a3..56354a107e66a9e37b2461d334df3bde963626b6 100644 (file)
@@ -6250,6 +6250,7 @@ static int
 spa_export_common(const char *pool, int new_state, nvlist_t **oldconfig,
     boolean_t force, boolean_t hardforce)
 {
+       int error;
        spa_t *spa;
 
        if (oldconfig)
@@ -6302,13 +6303,9 @@ spa_export_common(const char *pool, int new_state, nvlist_t **oldconfig,
         * references.  If we are resetting a pool, allow references by
         * fault injection handlers.
         */
-       if (!spa_refcount_zero(spa) ||
-           (spa->spa_inject_ref != 0 &&
-           new_state != POOL_STATE_UNINITIALIZED)) {
-               spa_async_resume(spa);
-               spa->spa_is_exporting = B_FALSE;
-               mutex_exit(&spa_namespace_lock);
-               return (SET_ERROR(EBUSY));
+       if (!spa_refcount_zero(spa) || (spa->spa_inject_ref != 0)) {
+               error = SET_ERROR(EBUSY);
+               goto fail;
        }
 
        if (spa->spa_sync_on) {
@@ -6320,10 +6317,8 @@ spa_export_common(const char *pool, int new_state, nvlist_t **oldconfig,
                 */
                if (!force && new_state == POOL_STATE_EXPORTED &&
                    spa_has_active_shared_spare(spa)) {
-                       spa_async_resume(spa);
-                       spa->spa_is_exporting = B_FALSE;
-                       mutex_exit(&spa_namespace_lock);
-                       return (SET_ERROR(EXDEV));
+                       error = SET_ERROR(EXDEV);
+                       goto fail;
                }
 
                /*
@@ -6385,6 +6380,12 @@ export_spa:
 
        mutex_exit(&spa_namespace_lock);
        return (0);
+
+fail:
+       spa->spa_is_exporting = B_FALSE;
+       spa_async_resume(spa);
+       mutex_exit(&spa_namespace_lock);
+       return (error);
 }
 
 /*