Skip to content

Commit 6594735

Browse files
grwilsonbehlendorf
authored andcommitted
Illumos #3129, #3130
illumos/illumos-gate@d6afdce Illumos changeset: 13794:7c5e0e746b2c 3129 'zpool reopen' restarts resilvers 3130 ztest failure: Assertion failed: 0 == dmu_objset_destroy(name, B_FALSE) (0x0 == 0x10) Reviewed by: Eric Schrock <eric.schrock@delphix.com> Reviewed by: Matt Ahrens <matthew.ahrens@delphix.com> Reviewed by: Christopher Siden <chris.siden@delphix.com> Reviewed by: Adam Leventhal <ahl@delphix.com> Approved by: Dan McDonald <danmcd@nexenta.com> References: https://www.illumos.org/issues/3129 https://www.illumos.org/issues/3130 Ported by: Etienne Dechamps <etienne.dechamps@ovh.net> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #994
1 parent d135245 commit 6594735

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

module/zfs/dsl_dir.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -460,12 +460,14 @@ dsl_dir_destroy_check(void *arg1, void *arg2, dmu_tx_t *tx)
460460
/*
461461
* There should be exactly two holds, both from
462462
* dsl_dataset_destroy: one on the dd directory, and one on its
463-
* head ds. Otherwise, someone is trying to lookup something
464-
* inside this dir while we want to destroy it. The
465-
* config_rwlock ensures that nobody else opens it after we
466-
* check.
463+
* head ds. If there are more holds, then a concurrent thread is
464+
* performing a lookup inside this dir while we're trying to destroy
465+
* it. To minimize this possibility, we perform this check only
466+
* in syncing context and fail the operation if we encounter
467+
* additional holds. The dp_config_rwlock ensures that nobody else
468+
* opens it after we check.
467469
*/
468-
if (dmu_buf_refcount(dd->dd_dbuf) > 2)
470+
if (dmu_tx_is_syncing(tx) && dmu_buf_refcount(dd->dd_dbuf) > 2)
469471
return (EBUSY);
470472

471473
err = zap_count(mos, dd->dd_phys->dd_child_dir_zapobj, &count);

module/zfs/zfs_ioctl.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4094,7 +4094,17 @@ zfs_ioc_pool_reopen(zfs_cmd_t *zc)
40944094
return (error);
40954095

40964096
spa_vdev_state_enter(spa, SCL_NONE);
4097+
4098+
/*
4099+
* If a resilver is already in progress then set the
4100+
* spa_scrub_reopen flag to B_TRUE so that we don't restart
4101+
* the scan as a side effect of the reopen. Otherwise, let
4102+
* vdev_open() decided if a resilver is required.
4103+
*/
4104+
spa->spa_scrub_reopen = dsl_scan_resilvering(spa->spa_dsl_pool);
40974105
vdev_reopen(spa->spa_root_vdev);
4106+
spa->spa_scrub_reopen = B_FALSE;
4107+
40984108
(void) spa_vdev_state_exit(spa, NULL, 0);
40994109
spa_close(spa, FTAG);
41004110
return (0);

0 commit comments

Comments
 (0)