From: Tony Hutter Date: Thu, 7 Dec 2017 00:04:57 +0000 (-0800) Subject: Revert "Long hold the dataset during upgrade" X-Git-Tag: zfs-0.7.4~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=36e0ddb74462ccec4c1276e4b3dc5b7f2100b659;p=zfs Revert "Long hold the dataset during upgrade" This reverts commit a5c8119eba0a3b8a2a780780099eb82e250ba7f9. The commit (which was modified to remove encryption) was hitting ASSERT(dsl_pool_config_held(dmu_objset_pool(os))) in dmu_objset_upgrade() during automated testing. Signed-off-by: Tony Hutter --- diff --git a/module/zfs/dmu_objset.c b/module/zfs/dmu_objset.c index 1706937ad..9a7a6968d 100644 --- a/module/zfs/dmu_objset.c +++ b/module/zfs/dmu_objset.c @@ -28,7 +28,6 @@ * Copyright (c) 2015, STRATO AG, Inc. All rights reserved. * Copyright (c) 2016 Actifio, Inc. All rights reserved. * Copyright 2017 Nexenta Systems, Inc. - * Copyright (c) 2017 Open-E, Inc. All Rights Reserved. */ /* Portions Copyright 2010 Robert Milkowski */ @@ -79,8 +78,6 @@ int dmu_find_threads = 0; */ int dmu_rescan_dnode_threshold = 1 << DN_MAX_INDBLKSHIFT; -static char *upgrade_tag = "upgrade_tag"; - static void dmu_objset_find_dp_cb(void *arg); static void dmu_objset_upgrade(objset_t *os, dmu_objset_upgrade_cb_t cb); @@ -1160,7 +1157,6 @@ dmu_objset_upgrade_task_cb(void *data) os->os_upgrade_exit = B_TRUE; os->os_upgrade_id = 0; mutex_exit(&os->os_upgrade_lock); - dsl_dataset_long_rele(dmu_objset_ds(os), upgrade_tag); } static void @@ -1169,9 +1165,6 @@ dmu_objset_upgrade(objset_t *os, dmu_objset_upgrade_cb_t cb) if (os->os_upgrade_id != 0) return; - ASSERT(dsl_pool_config_held(dmu_objset_pool(os))); - dsl_dataset_long_hold(dmu_objset_ds(os), upgrade_tag); - mutex_enter(&os->os_upgrade_lock); if (os->os_upgrade_id == 0 && os->os_upgrade_status == 0) { os->os_upgrade_exit = B_FALSE; @@ -1179,10 +1172,8 @@ dmu_objset_upgrade(objset_t *os, dmu_objset_upgrade_cb_t cb) os->os_upgrade_id = taskq_dispatch( os->os_spa->spa_upgrade_taskq, dmu_objset_upgrade_task_cb, os, TQ_SLEEP); - if (os->os_upgrade_id == TASKQID_INVALID) { - dsl_dataset_long_rele(dmu_objset_ds(os), upgrade_tag); + if (os->os_upgrade_id == TASKQID_INVALID) os->os_upgrade_status = ENOMEM; - } } mutex_exit(&os->os_upgrade_lock); } @@ -1198,10 +1189,7 @@ dmu_objset_upgrade_stop(objset_t *os) os->os_upgrade_id = 0; mutex_exit(&os->os_upgrade_lock); - if ((taskq_cancel_id(os->os_spa->spa_upgrade_taskq, id)) == 0) { - dsl_dataset_long_rele(dmu_objset_ds(os), upgrade_tag); - } - txg_wait_synced(os->os_spa->spa_dsl_pool, 0); + taskq_cancel_id(os->os_spa->spa_upgrade_taskq, id); } else { mutex_exit(&os->os_upgrade_lock); } diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c index 7106576c4..d195eded7 100644 --- a/module/zfs/zfs_ioctl.c +++ b/module/zfs/zfs_ioctl.c @@ -5181,6 +5181,9 @@ zfs_ioc_userobjspace_upgrade(zfs_cmd_t *zc) if (error != 0) return (error); + dsl_dataset_long_hold(dmu_objset_ds(os), FTAG); + dsl_pool_rele(dmu_objset_pool(os), FTAG); + if (dmu_objset_userobjspace_upgradable(os)) { mutex_enter(&os->os_upgrade_lock); if (os->os_upgrade_id == 0) { @@ -5193,12 +5196,8 @@ zfs_ioc_userobjspace_upgrade(zfs_cmd_t *zc) mutex_exit(&os->os_upgrade_lock); } - dsl_pool_rele(dmu_objset_pool(os), FTAG); - taskq_wait_id(os->os_spa->spa_upgrade_taskq, os->os_upgrade_id); error = os->os_upgrade_status; - } else { - dsl_pool_rele(dmu_objset_pool(os), FTAG); } dsl_dataset_long_rele(dmu_objset_ds(os), FTAG); diff --git a/module/zfs/zfs_vfsops.c b/module/zfs/zfs_vfsops.c index 0d03f1ef6..761133936 100644 --- a/module/zfs/zfs_vfsops.c +++ b/module/zfs/zfs_vfsops.c @@ -834,13 +834,8 @@ zfs_fuid_overobjquota(zfsvfs_t *zfsvfs, boolean_t isgroup, uint64_t fuid) int err; if (!dmu_objset_userobjspace_present(zfsvfs->z_os)) { - if (dmu_objset_userobjspace_upgradable(zfsvfs->z_os)) { - dsl_pool_config_enter( - dmu_objset_pool(zfsvfs->z_os), FTAG); + if (dmu_objset_userobjspace_upgradable(zfsvfs->z_os)) dmu_objset_userobjspace_upgrade(zfsvfs->z_os); - dsl_pool_config_exit( - dmu_objset_pool(zfsvfs->z_os), FTAG); - } return (B_FALSE); }