From 5bef7b63cc3cfb8de7074aa903f2e8646262ff2a Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Wed, 20 Nov 2013 11:09:12 +0000 Subject: 4322 ZFS deadlock on dp_config_rwlock illumos/illumos-gate@c50d56f667f119d78fa3d94d6bef2c298ba556f6 --- uts/common/fs/zfs/dsl_userhold.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/uts/common/fs/zfs/dsl_userhold.c b/uts/common/fs/zfs/dsl_userhold.c index a948e10b12b4..7f2c26f766e3 100644 --- a/uts/common/fs/zfs/dsl_userhold.c +++ b/uts/common/fs/zfs/dsl_userhold.c @@ -564,21 +564,23 @@ dsl_dataset_user_release_impl(nvlist_t *holds, nvlist_t *errlist, ddura.ddura_holdfunc = dsl_dataset_hold_obj_string; pool = spa_name(tmpdp->dp_spa); #ifdef _KERNEL - dsl_pool_config_enter(tmpdp, FTAG); for (pair = nvlist_next_nvpair(holds, NULL); pair != NULL; pair = nvlist_next_nvpair(holds, pair)) { dsl_dataset_t *ds; + dsl_pool_config_enter(tmpdp, FTAG); error = dsl_dataset_hold_obj_string(tmpdp, nvpair_name(pair), FTAG, &ds); if (error == 0) { char name[MAXNAMELEN]; dsl_dataset_name(ds, name); + dsl_pool_config_exit(tmpdp, FTAG); dsl_dataset_rele(ds, FTAG); (void) zfs_unmount_snap(name); + } else { + dsl_pool_config_exit(tmpdp, FTAG); } } - dsl_pool_config_exit(tmpdp, FTAG); #endif } else { /* Non-temporary holds are specified by name. */ -- cgit v1.2.3