Illumos 6292 - exporting a pool while an async destroy

6292 exporting a pool while an async destroy is running can leave
entries in the deferred tree
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Andriy Gapon <avg@FreeBSD.org>
Reviewed by: Fabian Keil <fk@fabiankeil.de>
Approved by: Gordon Ross <gordon.ross@nexenta.com>

References:
  https://www.illumos.org/issues/6292
  https://github.com/illumos/illumos-gate/commit/a443cc8

Ported-by: kernelOfTruth kerneloftruth@gmail.com
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
George Wilson 2015-11-04 21:12:40 +01:00 committed by Brian Behlendorf
parent 5511754b4f
commit 2e8efe1bef
1 changed files with 15 additions and 2 deletions

View File

@ -1470,11 +1470,24 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx)
dsl_scan_setup_sync(&func, tx); dsl_scan_setup_sync(&func, tx);
} }
/*
* Only process scans in sync pass 1.
*/
if (spa_sync_pass(dp->dp_spa) > 1)
return;
/*
* If the spa is shutting down, then stop scanning. This will
* ensure that the scan does not dirty any new data during the
* shutdown phase.
*/
if (spa_shutting_down(spa))
return;
/* /*
* If the scan is inactive due to a stalled async destroy, try again. * If the scan is inactive due to a stalled async destroy, try again.
*/ */
if ((!scn->scn_async_stalled && !dsl_scan_active(scn)) || if (!scn->scn_async_stalled && !dsl_scan_active(scn))
spa_sync_pass(dp->dp_spa) > 1)
return; return;
scn->scn_visited_this_txg = 0; scn->scn_visited_this_txg = 0;