changeset 25599:2382a653be35

13358 dmu_objset_upgrade_stop() needs to wait 12397 12254 broke the zfs test suite for older python versions Portions contributed by: Tom Caputi <tcaputi@datto.com> Portions contributed by: Nasf-Fan <fan.yong@intel.com> Portions contributed by: Gvozden Neskovic <neskovic@gmail.com> Reviewed by: Jason King <jason.king@joyent.com> Reviewed by: Igor Kozhukhov <igor@dilos.org> Approved by: Dan McDonald <danmcd@joyent.com>
author Andy Fiddaman <omnios@citrus-it.co.uk>
date Sat, 12 Dec 2020 00:38:47 +0000
parents 1ac626b08c2e
children 37aafd26785f
files usr/src/test/test-runner/cmd/run usr/src/uts/common/fs/zfs/dmu_objset.c
diffstat 2 files changed, 13 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/test/test-runner/cmd/run	Sat Jan 11 11:00:06 2020 +0000
+++ b/usr/src/test/test-runner/cmd/run	Sat Dec 12 00:38:47 2020 +0000
@@ -148,7 +148,7 @@
         for easy sorting/merging later.
         """
         fd = self.fileno()
-        buf = os.read(fd, 4096).decode('utf-8')
+        buf = os.read(fd, 4096).decode('utf-8', errors='ignore')
         if not buf:
             return None
         if '\n' not in buf:
--- a/usr/src/uts/common/fs/zfs/dmu_objset.c	Sat Jan 11 11:00:06 2020 +0000
+++ b/usr/src/uts/common/fs/zfs/dmu_objset.c	Sat Dec 12 00:38:47 2020 +0000
@@ -854,7 +854,7 @@
 	dp = ds->ds_dir->dd_pool;
 	dsl_pool_config_enter(dp, FTAG);
 
-	dsl_dataset_disown(ds, 0, tag);
+	dsl_dataset_disown(ds, decrypt, tag);
 	VERIFY0(dsl_dataset_own(dp, name,
 	    (decrypt) ? DS_HOLD_FLAG_DECRYPT : 0, tag, newds));
 	dsl_pool_config_exit(dp, FTAG);
@@ -983,6 +983,7 @@
 	mutex_destroy(&os->os_userused_lock);
 	mutex_destroy(&os->os_obj_lock);
 	mutex_destroy(&os->os_user_ptr_lock);
+	mutex_destroy(&os->os_upgrade_lock);
 	for (int i = 0; i < TXG_SIZE; i++) {
 		multilist_destroy(os->os_dirty_dnodes[i]);
 	}
@@ -1479,10 +1480,15 @@
 	mutex_enter(&os->os_upgrade_lock);
 	os->os_upgrade_status = EINTR;
 	if (!os->os_upgrade_exit) {
+		int status;
+
 		mutex_exit(&os->os_upgrade_lock);
 
-		os->os_upgrade_status = os->os_upgrade_cb(os);
+		status = os->os_upgrade_cb(os);
+
 		mutex_enter(&os->os_upgrade_lock);
+
+		os->os_upgrade_status = status;
 	}
 	os->os_upgrade_exit = B_TRUE;
 	os->os_upgrade_id = 0;
@@ -1510,6 +1516,8 @@
 			dsl_dataset_long_rele(dmu_objset_ds(os), upgrade_tag);
 			os->os_upgrade_status = ENOMEM;
 		}
+	} else {
+		dsl_dataset_long_rele(dmu_objset_ds(os), upgrade_tag);
 	}
 	mutex_exit(&os->os_upgrade_lock);
 }
@@ -1522,10 +1530,10 @@
 	if (os->os_upgrade_id != 0) {
 		taskqid_t tid = os->os_upgrade_id;
 
-		os->os_upgrade_id = 0;
 		mutex_exit(&os->os_upgrade_lock);
 
 		taskq_wait_id(os->os_spa->spa_upgrade_taskq, tid);
+		txg_wait_synced(os->os_spa->spa_dsl_pool, 0);
 	} else {
 		mutex_exit(&os->os_upgrade_lock);
 	}
@@ -2226,7 +2234,7 @@
 		if (flags & DN_ID_OLD_EXIST) {
 			dn->dn_newuid = dn->dn_olduid;
 			dn->dn_newgid = dn->dn_oldgid;
-			dn->dn_newgid = dn->dn_oldprojid;
+			dn->dn_newprojid = dn->dn_oldprojid;
 		} else {
 			dn->dn_newuid = 0;
 			dn->dn_newgid = 0;