update/rebase to zfs-0.7.12 with patches from ZOL
Reorder patches, so that the upstream changeset comes last Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
This commit is contained in:
		
							parent
							
								
									2e5067b011
								
							
						
					
					
						commit
						04a710dd91
					
				@ -1,4 +1,4 @@
 | 
			
		||||
From 5ac80068e911d3b0935903f713c5f492d518da91 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Stoiko Ivanov <s.ivanov@proxmox.com>
 | 
			
		||||
Date: Mon, 29 Oct 2018 15:49:20 +0100
 | 
			
		||||
Subject: [PATCH] Add Breaks/Replaces to zfs-initramfs
 | 
			
		||||
@ -13,10 +13,10 @@ Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
 | 
			
		||||
 2 files changed, 4 insertions(+)
 | 
			
		||||
 | 
			
		||||
diff --git a/debian/control b/debian/control
 | 
			
		||||
index 4d22ff50..a414e449 100644
 | 
			
		||||
index f33008df..d3d1034e 100644
 | 
			
		||||
--- a/debian/control
 | 
			
		||||
+++ b/debian/control
 | 
			
		||||
@@ -117,6 +117,8 @@ Depends: busybox-initramfs | busybox-static | busybox,
 | 
			
		||||
@@ -116,6 +116,8 @@ Depends: busybox-initramfs | busybox-static | busybox,
 | 
			
		||||
          zfs-modules | zfs-dkms,
 | 
			
		||||
          zfsutils-linux (>= ${binary:Version}),
 | 
			
		||||
          ${misc:Depends}
 | 
			
		||||
@ -26,11 +26,11 @@ index 4d22ff50..a414e449 100644
 | 
			
		||||
  The Z file system is a pooled filesystem designed for maximum data
 | 
			
		||||
  integrity, supporting data snapshots, multiple copies, and data
 | 
			
		||||
diff --git a/debian/control.in b/debian/control.in
 | 
			
		||||
index 96154c5c..b9c34331 100644
 | 
			
		||||
index 0a9ceef6..09ef18cc 100644
 | 
			
		||||
--- a/debian/control.in
 | 
			
		||||
+++ b/debian/control.in
 | 
			
		||||
@@ -117,6 +117,8 @@ Depends: busybox-initramfs | busybox-static | busybox,
 | 
			
		||||
          zfs-modules | zfs-dkms,
 | 
			
		||||
@@ -100,6 +100,8 @@ Depends: busybox-initramfs | busybox-static | busybox,
 | 
			
		||||
          initramfs-tools,
 | 
			
		||||
          zfsutils-linux (>= ${binary:Version}),
 | 
			
		||||
          ${misc:Depends}
 | 
			
		||||
+Breaks: zfsutils-linux (<= 0.7.11-pve1~bpo1)
 | 
			
		||||
@ -38,6 +38,3 @@ index 96154c5c..b9c34331 100644
 | 
			
		||||
 Description: OpenZFS root filesystem capabilities for Linux - initramfs
 | 
			
		||||
  The Z file system is a pooled filesystem designed for maximum data
 | 
			
		||||
  integrity, supporting data snapshots, multiple copies, and data
 | 
			
		||||
-- 
 | 
			
		||||
2.11.0
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
From c37a6401469cae16519db06d623d49c6f606f312 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Thomas Lamprecht <t.lamprecht@proxmox.com>
 | 
			
		||||
Date: Wed, 31 Oct 2018 15:37:39 +0100
 | 
			
		||||
Subject: [PATCH] Revert "Install init scripts to support non-systemd setups.
 | 
			
		||||
@ -11,11 +11,11 @@ systems)
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
 | 
			
		||||
---
 | 
			
		||||
 debian/rules                                 | 8 --------
 | 
			
		||||
 debian/zfs-zed.zfs-zed.init                  | 1 -
 | 
			
		||||
 debian/zfsutils-linux.zfs-import.init        | 1 -
 | 
			
		||||
 debian/zfsutils-linux.zfs-mount.init         | 1 -
 | 
			
		||||
 debian/zfsutils-linux.zfs-share.init         | 1 -
 | 
			
		||||
 debian/rules                          | 8 --------
 | 
			
		||||
 debian/zfs-zed.zfs-zed.init           | 1 -
 | 
			
		||||
 debian/zfsutils-linux.zfs-import.init | 1 -
 | 
			
		||||
 debian/zfsutils-linux.zfs-mount.init  | 1 -
 | 
			
		||||
 debian/zfsutils-linux.zfs-share.init  | 1 -
 | 
			
		||||
 5 files changed, 12 deletions(-)
 | 
			
		||||
 delete mode 120000 debian/zfs-zed.zfs-zed.init
 | 
			
		||||
 delete mode 120000 debian/zfsutils-linux.zfs-import.init
 | 
			
		||||
@ -23,10 +23,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
 | 
			
		||||
 delete mode 120000 debian/zfsutils-linux.zfs-share.init
 | 
			
		||||
 | 
			
		||||
diff --git a/debian/rules b/debian/rules
 | 
			
		||||
index 5fba58ff..81c301e4 100644
 | 
			
		||||
index 3ba4b99a..d6cf5a56 100755
 | 
			
		||||
--- a/debian/rules
 | 
			
		||||
+++ b/debian/rules
 | 
			
		||||
@@ -161,14 +153,6 @@ override_dh_install:
 | 
			
		||||
@@ -117,14 +117,6 @@ override_dh_install:
 | 
			
		||||
 	find . -name lib*.la -delete
 | 
			
		||||
 	dh_install --fail-missing
 | 
			
		||||
 
 | 
			
		||||
@ -40,7 +40,7 @@ index 5fba58ff..81c301e4 100644
 | 
			
		||||
-
 | 
			
		||||
 # ------------
 | 
			
		||||
 
 | 
			
		||||
 override_dh_prep-deb-files:
 | 
			
		||||
 debian-copyright:
 | 
			
		||||
diff --git a/debian/zfs-zed.zfs-zed.init b/debian/zfs-zed.zfs-zed.init
 | 
			
		||||
deleted file mode 120000
 | 
			
		||||
index 3f41f681..00000000
 | 
			
		||||
@ -73,6 +73,3 @@ index 3f069f9b..00000000
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
-../etc/init.d/zfs-share
 | 
			
		||||
\ No newline at end of file
 | 
			
		||||
-- 
 | 
			
		||||
2.19.1
 | 
			
		||||
 | 
			
		||||
@ -17,13 +17,8 @@ treated as a list_node_t when it is technically a multilist_node_t.
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Signed-off-by: Tom Caputi <tcaputi@datto.com>
 | 
			
		||||
Requires-spl: spl-0.7-release
 | 
			
		||||
Issue #7147
 | 
			
		||||
Issue #7388
 | 
			
		||||
Issue #7997
 | 
			
		||||
 | 
			
		||||
(cherry-picked from behlendorf/issue-7997 4764f6f3be90be073d2700653dff286371e52583)
 | 
			
		||||
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
 | 
			
		||||
Closes #7147
 | 
			
		||||
Closes #7388
 | 
			
		||||
---
 | 
			
		||||
 include/sys/dmu_impl.h  |  1 +
 | 
			
		||||
 include/sys/dnode.h     |  4 ++++
 | 
			
		||||
@ -20,15 +20,11 @@ Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Reviewed by: George Wilson <george.wilson@delphix.com>
 | 
			
		||||
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
 | 
			
		||||
External-issue: DLPX-59292
 | 
			
		||||
Requires-spl: spl-0.7-release
 | 
			
		||||
Closes #7736
 | 
			
		||||
 | 
			
		||||
(cherry-picked from behlendorf/issue-7736 496657ab3bcfeb638b1786e1759980ccfcacb08e)
 | 
			
		||||
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
 | 
			
		||||
---
 | 
			
		||||
 include/sys/zio.h |   4 +-
 | 
			
		||||
 module/zfs/zio.c  | 250 +++++++++++++++++++++++++++++-------------------------
 | 
			
		||||
 2 files changed, 137 insertions(+), 117 deletions(-)
 | 
			
		||||
 module/zfs/zio.c  | 252 +++++++++++++++++++++++++++++-------------------------
 | 
			
		||||
 2 files changed, 139 insertions(+), 117 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/include/sys/zio.h b/include/sys/zio.h
 | 
			
		||||
index 4b0eecc2..3618912c 100644
 | 
			
		||||
@ -53,7 +49,7 @@ index 4b0eecc2..3618912c 100644
 | 
			
		||||
 /*
 | 
			
		||||
  * The io_reexecute flags are distinct from io_flags because the child must
 | 
			
		||||
diff --git a/module/zfs/zio.c b/module/zfs/zio.c
 | 
			
		||||
index 9a465e1b..b08b4747 100644
 | 
			
		||||
index 9a465e1b..dd0dfcdb 100644
 | 
			
		||||
--- a/module/zfs/zio.c
 | 
			
		||||
+++ b/module/zfs/zio.c
 | 
			
		||||
@@ -75,9 +75,6 @@ uint64_t zio_buf_cache_frees[SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT];
 | 
			
		||||
@ -226,16 +222,18 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_free_bp_init(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	blkptr_t *bp = zio->io_bp;
 | 
			
		||||
@@ -1472,7 +1490,7 @@ zio_free_bp_init(zio_t *zio)
 | 
			
		||||
@@ -1472,7 +1490,9 @@ zio_free_bp_init(zio_t *zio)
 | 
			
		||||
 			zio->io_pipeline = ZIO_DDT_FREE_PIPELINE;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
-	return (ZIO_PIPELINE_CONTINUE);
 | 
			
		||||
+	ASSERT3P(zio->io_bp, ==, &zio->io_bp_copy);
 | 
			
		||||
+
 | 
			
		||||
+	return (zio);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -1541,12 +1559,12 @@ zio_taskq_member(zio_t *zio, zio_taskq_type_t q)
 | 
			
		||||
@@ -1541,12 +1561,12 @@ zio_taskq_member(zio_t *zio, zio_taskq_type_t q)
 | 
			
		||||
 	return (B_FALSE);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -250,7 +248,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
@@ -1687,14 +1705,13 @@ __attribute__((always_inline))
 | 
			
		||||
@@ -1687,14 +1707,13 @@ __attribute__((always_inline))
 | 
			
		||||
 static inline void
 | 
			
		||||
 __zio_execute(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
@ -267,7 +265,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 
 | 
			
		||||
 		ASSERT(!MUTEX_HELD(&zio->io_lock));
 | 
			
		||||
 		ASSERT(ISP2(stage));
 | 
			
		||||
@@ -1736,12 +1753,16 @@ __zio_execute(zio_t *zio)
 | 
			
		||||
@@ -1736,12 +1755,16 @@ __zio_execute(zio_t *zio)
 | 
			
		||||
 
 | 
			
		||||
 		zio->io_stage = stage;
 | 
			
		||||
 		zio->io_pipeline_trace |= zio->io_stage;
 | 
			
		||||
@ -288,7 +286,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -2215,7 +2236,7 @@ zio_gang_tree_issue(zio_t *pio, zio_gang_node_t *gn, blkptr_t *bp, abd_t *data,
 | 
			
		||||
@@ -2215,7 +2238,7 @@ zio_gang_tree_issue(zio_t *pio, zio_gang_node_t *gn, blkptr_t *bp, abd_t *data,
 | 
			
		||||
 		zio_nowait(zio);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -297,7 +295,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_gang_assemble(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	blkptr_t *bp = zio->io_bp;
 | 
			
		||||
@@ -2227,16 +2248,16 @@ zio_gang_assemble(zio_t *zio)
 | 
			
		||||
@@ -2227,16 +2250,16 @@ zio_gang_assemble(zio_t *zio)
 | 
			
		||||
 
 | 
			
		||||
 	zio_gang_tree_assemble(zio, bp, &zio->io_gang_tree);
 | 
			
		||||
 
 | 
			
		||||
@ -317,7 +315,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT(BP_IS_GANG(bp) && zio->io_gang_leader == zio);
 | 
			
		||||
@@ -2250,7 +2271,7 @@ zio_gang_issue(zio_t *zio)
 | 
			
		||||
@@ -2250,7 +2273,7 @@ zio_gang_issue(zio_t *zio)
 | 
			
		||||
 
 | 
			
		||||
 	zio->io_pipeline = ZIO_INTERLOCK_PIPELINE;
 | 
			
		||||
 
 | 
			
		||||
@ -326,7 +324,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void
 | 
			
		||||
@@ -2290,7 +2311,7 @@ zio_write_gang_done(zio_t *zio)
 | 
			
		||||
@@ -2290,7 +2313,7 @@ zio_write_gang_done(zio_t *zio)
 | 
			
		||||
 	abd_put(zio->io_abd);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -335,7 +333,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_write_gang_block(zio_t *pio)
 | 
			
		||||
 {
 | 
			
		||||
 	spa_t *spa = pio->io_spa;
 | 
			
		||||
@@ -2349,7 +2370,7 @@ zio_write_gang_block(zio_t *pio)
 | 
			
		||||
@@ -2349,7 +2372,7 @@ zio_write_gang_block(zio_t *pio)
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
 		pio->io_error = error;
 | 
			
		||||
@ -344,7 +342,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	if (pio == gio) {
 | 
			
		||||
@@ -2423,7 +2444,7 @@ zio_write_gang_block(zio_t *pio)
 | 
			
		||||
@@ -2423,7 +2446,7 @@ zio_write_gang_block(zio_t *pio)
 | 
			
		||||
 
 | 
			
		||||
 	zio_nowait(zio);
 | 
			
		||||
 
 | 
			
		||||
@ -353,7 +351,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -2444,7 +2465,7 @@ zio_write_gang_block(zio_t *pio)
 | 
			
		||||
@@ -2444,7 +2467,7 @@ zio_write_gang_block(zio_t *pio)
 | 
			
		||||
  * used for nopwrite, assuming that the salt and the checksums
 | 
			
		||||
  * themselves remain secret.
 | 
			
		||||
  */
 | 
			
		||||
@ -362,7 +360,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_nop_write(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	blkptr_t *bp = zio->io_bp;
 | 
			
		||||
@@ -2471,7 +2492,7 @@ zio_nop_write(zio_t *zio)
 | 
			
		||||
@@ -2471,7 +2494,7 @@ zio_nop_write(zio_t *zio)
 | 
			
		||||
 	    BP_GET_COMPRESS(bp) != BP_GET_COMPRESS(bp_orig) ||
 | 
			
		||||
 	    BP_GET_DEDUP(bp) != BP_GET_DEDUP(bp_orig) ||
 | 
			
		||||
 	    zp->zp_copies != BP_GET_NDVAS(bp_orig))
 | 
			
		||||
@ -371,7 +369,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * If the checksums match then reset the pipeline so that we
 | 
			
		||||
@@ -2491,7 +2512,7 @@ zio_nop_write(zio_t *zio)
 | 
			
		||||
@@ -2491,7 +2514,7 @@ zio_nop_write(zio_t *zio)
 | 
			
		||||
 		zio->io_flags |= ZIO_FLAG_NOPWRITE;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@ -380,7 +378,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -2519,7 +2540,7 @@ zio_ddt_child_read_done(zio_t *zio)
 | 
			
		||||
@@ -2519,7 +2542,7 @@ zio_ddt_child_read_done(zio_t *zio)
 | 
			
		||||
 	mutex_exit(&pio->io_lock);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -389,7 +387,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_ddt_read_start(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	blkptr_t *bp = zio->io_bp;
 | 
			
		||||
@@ -2540,7 +2561,7 @@ zio_ddt_read_start(zio_t *zio)
 | 
			
		||||
@@ -2540,7 +2563,7 @@ zio_ddt_read_start(zio_t *zio)
 | 
			
		||||
 		zio->io_vsd = dde;
 | 
			
		||||
 
 | 
			
		||||
 		if (ddp_self == NULL)
 | 
			
		||||
@ -398,7 +396,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 
 | 
			
		||||
 		for (p = 0; p < DDT_PHYS_TYPES; p++, ddp++) {
 | 
			
		||||
 			if (ddp->ddp_phys_birth == 0 || ddp == ddp_self)
 | 
			
		||||
@@ -2553,23 +2574,23 @@ zio_ddt_read_start(zio_t *zio)
 | 
			
		||||
@@ -2553,23 +2576,23 @@ zio_ddt_read_start(zio_t *zio)
 | 
			
		||||
 			    zio->io_priority, ZIO_DDT_CHILD_FLAGS(zio) |
 | 
			
		||||
 			    ZIO_FLAG_DONT_PROPAGATE, &zio->io_bookmark));
 | 
			
		||||
 		}
 | 
			
		||||
@ -426,7 +424,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT(BP_GET_DEDUP(bp));
 | 
			
		||||
@@ -2581,12 +2602,12 @@ zio_ddt_read_done(zio_t *zio)
 | 
			
		||||
@@ -2581,12 +2604,12 @@ zio_ddt_read_done(zio_t *zio)
 | 
			
		||||
 		ddt_entry_t *dde = zio->io_vsd;
 | 
			
		||||
 		if (ddt == NULL) {
 | 
			
		||||
 			ASSERT(spa_load_state(zio->io_spa) != SPA_LOAD_NONE);
 | 
			
		||||
@ -441,7 +439,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 		}
 | 
			
		||||
 		if (dde->dde_repair_abd != NULL) {
 | 
			
		||||
 			abd_copy(zio->io_abd, dde->dde_repair_abd,
 | 
			
		||||
@@ -2599,7 +2620,7 @@ zio_ddt_read_done(zio_t *zio)
 | 
			
		||||
@@ -2599,7 +2622,7 @@ zio_ddt_read_done(zio_t *zio)
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT(zio->io_vsd == NULL);
 | 
			
		||||
 
 | 
			
		||||
@ -450,7 +448,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static boolean_t
 | 
			
		||||
@@ -2780,7 +2801,7 @@ zio_ddt_ditto_write_done(zio_t *zio)
 | 
			
		||||
@@ -2780,7 +2803,7 @@ zio_ddt_ditto_write_done(zio_t *zio)
 | 
			
		||||
 	ddt_exit(ddt);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -459,7 +457,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_ddt_write(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	spa_t *spa = zio->io_spa;
 | 
			
		||||
@@ -2822,7 +2843,7 @@ zio_ddt_write(zio_t *zio)
 | 
			
		||||
@@ -2822,7 +2845,7 @@ zio_ddt_write(zio_t *zio)
 | 
			
		||||
 		}
 | 
			
		||||
 		zio->io_pipeline = ZIO_WRITE_PIPELINE;
 | 
			
		||||
 		ddt_exit(ddt);
 | 
			
		||||
@ -468,7 +466,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	ditto_copies = ddt_ditto_copies_needed(ddt, dde, ddp);
 | 
			
		||||
@@ -2848,7 +2869,7 @@ zio_ddt_write(zio_t *zio)
 | 
			
		||||
@@ -2848,7 +2871,7 @@ zio_ddt_write(zio_t *zio)
 | 
			
		||||
 			zio->io_bp_override = NULL;
 | 
			
		||||
 			BP_ZERO(bp);
 | 
			
		||||
 			ddt_exit(ddt);
 | 
			
		||||
@ -477,7 +475,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
 		dio = zio_write(zio, spa, txg, bp, zio->io_orig_abd,
 | 
			
		||||
@@ -2890,12 +2911,12 @@ zio_ddt_write(zio_t *zio)
 | 
			
		||||
@@ -2890,12 +2913,12 @@ zio_ddt_write(zio_t *zio)
 | 
			
		||||
 	if (dio)
 | 
			
		||||
 		zio_nowait(dio);
 | 
			
		||||
 
 | 
			
		||||
@ -492,7 +490,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_ddt_free(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	spa_t *spa = zio->io_spa;
 | 
			
		||||
@@ -2916,7 +2937,7 @@ zio_ddt_free(zio_t *zio)
 | 
			
		||||
@@ -2916,7 +2939,7 @@ zio_ddt_free(zio_t *zio)
 | 
			
		||||
 	}
 | 
			
		||||
 	ddt_exit(ddt);
 | 
			
		||||
 
 | 
			
		||||
@ -501,7 +499,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -2953,7 +2974,7 @@ zio_io_to_allocate(spa_t *spa)
 | 
			
		||||
@@ -2953,7 +2976,7 @@ zio_io_to_allocate(spa_t *spa)
 | 
			
		||||
 	return (zio);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -510,7 +508,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_dva_throttle(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	spa_t *spa = zio->io_spa;
 | 
			
		||||
@@ -2963,7 +2984,7 @@ zio_dva_throttle(zio_t *zio)
 | 
			
		||||
@@ -2963,7 +2986,7 @@ zio_dva_throttle(zio_t *zio)
 | 
			
		||||
 	    !spa_normal_class(zio->io_spa)->mc_alloc_throttle_enabled ||
 | 
			
		||||
 	    zio->io_child_type == ZIO_CHILD_GANG ||
 | 
			
		||||
 	    zio->io_flags & ZIO_FLAG_NODATA) {
 | 
			
		||||
@ -519,7 +517,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT(zio->io_child_type > ZIO_CHILD_GANG);
 | 
			
		||||
@@ -2979,22 +3000,7 @@ zio_dva_throttle(zio_t *zio)
 | 
			
		||||
@@ -2979,22 +3002,7 @@ zio_dva_throttle(zio_t *zio)
 | 
			
		||||
 	nio = zio_io_to_allocate(zio->io_spa);
 | 
			
		||||
 	mutex_exit(&spa->spa_alloc_lock);
 | 
			
		||||
 
 | 
			
		||||
@ -543,7 +541,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
@@ -3013,7 +3019,7 @@ zio_allocate_dispatch(spa_t *spa)
 | 
			
		||||
@@ -3013,7 +3021,7 @@ zio_allocate_dispatch(spa_t *spa)
 | 
			
		||||
 	zio_taskq_dispatch(zio, ZIO_TASKQ_ISSUE, B_TRUE);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -552,7 +550,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_dva_allocate(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	spa_t *spa = zio->io_spa;
 | 
			
		||||
@@ -3054,18 +3060,18 @@ zio_dva_allocate(zio_t *zio)
 | 
			
		||||
@@ -3054,18 +3062,18 @@ zio_dva_allocate(zio_t *zio)
 | 
			
		||||
 		zio->io_error = error;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@ -575,7 +573,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_dva_claim(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	int error;
 | 
			
		||||
@@ -3074,7 +3080,7 @@ zio_dva_claim(zio_t *zio)
 | 
			
		||||
@@ -3074,7 +3082,7 @@ zio_dva_claim(zio_t *zio)
 | 
			
		||||
 	if (error)
 | 
			
		||||
 		zio->io_error = error;
 | 
			
		||||
 
 | 
			
		||||
@ -584,7 +582,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -3172,7 +3178,7 @@ zio_free_zil(spa_t *spa, uint64_t txg, blkptr_t *bp)
 | 
			
		||||
@@ -3172,7 +3180,7 @@ zio_free_zil(spa_t *spa, uint64_t txg, blkptr_t *bp)
 | 
			
		||||
  * force the underlying vdev layers to call either zio_execute() or
 | 
			
		||||
  * zio_interrupt() to ensure that the pipeline continues with the correct I/O.
 | 
			
		||||
  */
 | 
			
		||||
@ -593,7 +591,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_vdev_io_start(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	vdev_t *vd = zio->io_vd;
 | 
			
		||||
@@ -3192,7 +3198,7 @@ zio_vdev_io_start(zio_t *zio)
 | 
			
		||||
@@ -3192,7 +3200,7 @@ zio_vdev_io_start(zio_t *zio)
 | 
			
		||||
 		 * The mirror_ops handle multiple DVAs in a single BP.
 | 
			
		||||
 		 */
 | 
			
		||||
 		vdev_mirror_ops.vdev_op_io_start(zio);
 | 
			
		||||
@ -602,7 +600,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT3P(zio->io_logical, !=, zio);
 | 
			
		||||
@@ -3269,31 +3275,31 @@ zio_vdev_io_start(zio_t *zio)
 | 
			
		||||
@@ -3269,31 +3277,31 @@ zio_vdev_io_start(zio_t *zio)
 | 
			
		||||
 	    !vdev_dtl_contains(vd, DTL_PARTIAL, zio->io_txg, 1)) {
 | 
			
		||||
 		ASSERT(zio->io_type == ZIO_TYPE_WRITE);
 | 
			
		||||
 		zio_vdev_io_bypass(zio);
 | 
			
		||||
@ -640,7 +638,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_vdev_io_done(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	vdev_t *vd = zio->io_vd;
 | 
			
		||||
@@ -3301,7 +3307,7 @@ zio_vdev_io_done(zio_t *zio)
 | 
			
		||||
@@ -3301,7 +3309,7 @@ zio_vdev_io_done(zio_t *zio)
 | 
			
		||||
 	boolean_t unexpected_error = B_FALSE;
 | 
			
		||||
 
 | 
			
		||||
 	if (zio_wait_for_children(zio, ZIO_CHILD_VDEV_BIT, ZIO_WAIT_DONE)) {
 | 
			
		||||
@ -649,7 +647,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT(zio->io_type == ZIO_TYPE_READ || zio->io_type == ZIO_TYPE_WRITE);
 | 
			
		||||
@@ -3337,7 +3343,7 @@ zio_vdev_io_done(zio_t *zio)
 | 
			
		||||
@@ -3337,7 +3345,7 @@ zio_vdev_io_done(zio_t *zio)
 | 
			
		||||
 	if (unexpected_error)
 | 
			
		||||
 		VERIFY(vdev_probe(vd, zio) == NULL);
 | 
			
		||||
 
 | 
			
		||||
@ -658,7 +656,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -3366,13 +3372,13 @@ zio_vsd_default_cksum_report(zio_t *zio, zio_cksum_report_t *zcr, void *ignored)
 | 
			
		||||
@@ -3366,13 +3374,13 @@ zio_vsd_default_cksum_report(zio_t *zio, zio_cksum_report_t *zcr, void *ignored)
 | 
			
		||||
 	zcr->zcr_free = zio_abd_free;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -674,7 +672,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	if (vd == NULL && !(zio->io_flags & ZIO_FLAG_CONFIG_WRITER))
 | 
			
		||||
@@ -3402,7 +3408,7 @@ zio_vdev_io_assess(zio_t *zio)
 | 
			
		||||
@@ -3402,7 +3410,7 @@ zio_vdev_io_assess(zio_t *zio)
 | 
			
		||||
 		zio->io_stage = ZIO_STAGE_VDEV_IO_START >> 1;
 | 
			
		||||
 		zio_taskq_dispatch(zio, ZIO_TASKQ_ISSUE,
 | 
			
		||||
 		    zio_requeue_io_start_cut_in_line);
 | 
			
		||||
@ -683,7 +681,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
@@ -3442,7 +3448,7 @@ zio_vdev_io_assess(zio_t *zio)
 | 
			
		||||
@@ -3442,7 +3450,7 @@ zio_vdev_io_assess(zio_t *zio)
 | 
			
		||||
 		zio->io_physdone(zio->io_logical);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@ -692,7 +690,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
@@ -3477,7 +3483,7 @@ zio_vdev_io_bypass(zio_t *zio)
 | 
			
		||||
@@ -3477,7 +3485,7 @@ zio_vdev_io_bypass(zio_t *zio)
 | 
			
		||||
  * Generate and verify checksums
 | 
			
		||||
  * ==========================================================================
 | 
			
		||||
  */
 | 
			
		||||
@ -701,7 +699,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_checksum_generate(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	blkptr_t *bp = zio->io_bp;
 | 
			
		||||
@@ -3491,7 +3497,7 @@ zio_checksum_generate(zio_t *zio)
 | 
			
		||||
@@ -3491,7 +3499,7 @@ zio_checksum_generate(zio_t *zio)
 | 
			
		||||
 		checksum = zio->io_prop.zp_checksum;
 | 
			
		||||
 
 | 
			
		||||
 		if (checksum == ZIO_CHECKSUM_OFF)
 | 
			
		||||
@ -710,7 +708,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 
 | 
			
		||||
 		ASSERT(checksum == ZIO_CHECKSUM_LABEL);
 | 
			
		||||
 	} else {
 | 
			
		||||
@@ -3505,10 +3511,10 @@ zio_checksum_generate(zio_t *zio)
 | 
			
		||||
@@ -3505,10 +3513,10 @@ zio_checksum_generate(zio_t *zio)
 | 
			
		||||
 
 | 
			
		||||
 	zio_checksum_compute(zio, checksum, zio->io_abd, zio->io_size);
 | 
			
		||||
 
 | 
			
		||||
@ -723,7 +721,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_checksum_verify(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	zio_bad_cksum_t info;
 | 
			
		||||
@@ -3523,7 +3529,7 @@ zio_checksum_verify(zio_t *zio)
 | 
			
		||||
@@ -3523,7 +3531,7 @@ zio_checksum_verify(zio_t *zio)
 | 
			
		||||
 		 * We're either verifying a label checksum, or nothing at all.
 | 
			
		||||
 		 */
 | 
			
		||||
 		if (zio->io_prop.zp_checksum == ZIO_CHECKSUM_OFF)
 | 
			
		||||
@ -732,7 +730,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 
 | 
			
		||||
 		ASSERT(zio->io_prop.zp_checksum == ZIO_CHECKSUM_LABEL);
 | 
			
		||||
 	}
 | 
			
		||||
@@ -3538,7 +3544,7 @@ zio_checksum_verify(zio_t *zio)
 | 
			
		||||
@@ -3538,7 +3546,7 @@ zio_checksum_verify(zio_t *zio)
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@ -741,7 +739,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -3581,7 +3587,7 @@ zio_worst_error(int e1, int e2)
 | 
			
		||||
@@ -3581,7 +3589,7 @@ zio_worst_error(int e1, int e2)
 | 
			
		||||
  * I/O completion
 | 
			
		||||
  * ==========================================================================
 | 
			
		||||
  */
 | 
			
		||||
@ -750,7 +748,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_ready(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	blkptr_t *bp = zio->io_bp;
 | 
			
		||||
@@ -3590,7 +3596,7 @@ zio_ready(zio_t *zio)
 | 
			
		||||
@@ -3590,7 +3598,7 @@ zio_ready(zio_t *zio)
 | 
			
		||||
 
 | 
			
		||||
 	if (zio_wait_for_children(zio, ZIO_CHILD_GANG_BIT | ZIO_CHILD_DDT_BIT,
 | 
			
		||||
 	    ZIO_WAIT_READY)) {
 | 
			
		||||
@ -759,7 +757,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	if (zio->io_ready) {
 | 
			
		||||
@@ -3636,7 +3642,7 @@ zio_ready(zio_t *zio)
 | 
			
		||||
@@ -3636,7 +3644,7 @@ zio_ready(zio_t *zio)
 | 
			
		||||
 	 */
 | 
			
		||||
 	for (; pio != NULL; pio = pio_next) {
 | 
			
		||||
 		pio_next = zio_walk_parents(zio, &zl);
 | 
			
		||||
@ -768,7 +766,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	if (zio->io_flags & ZIO_FLAG_NODATA) {
 | 
			
		||||
@@ -3652,7 +3658,7 @@ zio_ready(zio_t *zio)
 | 
			
		||||
@@ -3652,7 +3660,7 @@ zio_ready(zio_t *zio)
 | 
			
		||||
 	    zio->io_spa->spa_syncing_txg == zio->io_txg)
 | 
			
		||||
 		zio_handle_ignored_writes(zio);
 | 
			
		||||
 
 | 
			
		||||
@ -777,7 +775,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -3716,7 +3722,7 @@ zio_dva_throttle_done(zio_t *zio)
 | 
			
		||||
@@ -3716,7 +3724,7 @@ zio_dva_throttle_done(zio_t *zio)
 | 
			
		||||
 	zio_allocate_dispatch(zio->io_spa);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -786,7 +784,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 zio_done(zio_t *zio)
 | 
			
		||||
 {
 | 
			
		||||
 	/*
 | 
			
		||||
@@ -3733,7 +3739,7 @@ zio_done(zio_t *zio)
 | 
			
		||||
@@ -3733,7 +3741,7 @@ zio_done(zio_t *zio)
 | 
			
		||||
 	 * wait for them and then repeat this pipeline stage.
 | 
			
		||||
 	 */
 | 
			
		||||
 	if (zio_wait_for_children(zio, ZIO_CHILD_ALL_BITS, ZIO_WAIT_DONE)) {
 | 
			
		||||
@ -795,7 +793,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
@@ -3957,7 +3963,12 @@ zio_done(zio_t *zio)
 | 
			
		||||
@@ -3957,7 +3965,12 @@ zio_done(zio_t *zio)
 | 
			
		||||
 			if ((pio->io_flags & ZIO_FLAG_GODFATHER) &&
 | 
			
		||||
 			    (zio->io_reexecute & ZIO_REEXECUTE_SUSPEND)) {
 | 
			
		||||
 				zio_remove_child(pio, zio, remove_zl);
 | 
			
		||||
@ -809,7 +807,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 			}
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
@@ -3969,7 +3980,11 @@ zio_done(zio_t *zio)
 | 
			
		||||
@@ -3969,7 +3982,11 @@ zio_done(zio_t *zio)
 | 
			
		||||
 			 */
 | 
			
		||||
 			ASSERT(!(zio->io_flags & ZIO_FLAG_GODFATHER));
 | 
			
		||||
 			zio->io_flags |= ZIO_FLAG_DONT_PROPAGATE;
 | 
			
		||||
@ -822,7 +820,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 		} else if (zio->io_reexecute & ZIO_REEXECUTE_SUSPEND) {
 | 
			
		||||
 			/*
 | 
			
		||||
 			 * We'd fail again if we reexecuted now, so suspend
 | 
			
		||||
@@ -3987,7 +4002,7 @@ zio_done(zio_t *zio)
 | 
			
		||||
@@ -3987,7 +4004,7 @@ zio_done(zio_t *zio)
 | 
			
		||||
 			    (task_func_t *)zio_reexecute, zio, 0,
 | 
			
		||||
 			    &zio->io_tqent);
 | 
			
		||||
 		}
 | 
			
		||||
@ -831,7 +829,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT(zio->io_child_count == 0);
 | 
			
		||||
@@ -4023,12 +4038,17 @@ zio_done(zio_t *zio)
 | 
			
		||||
@@ -4023,12 +4040,17 @@ zio_done(zio_t *zio)
 | 
			
		||||
 	zio->io_state[ZIO_WAIT_DONE] = 1;
 | 
			
		||||
 	mutex_exit(&zio->io_lock);
 | 
			
		||||
 
 | 
			
		||||
@ -850,7 +848,7 @@ index 9a465e1b..b08b4747 100644
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	if (zio->io_waiter != NULL) {
 | 
			
		||||
@@ -4040,7 +4060,7 @@ zio_done(zio_t *zio)
 | 
			
		||||
@@ -4040,7 +4062,7 @@ zio_done(zio_t *zio)
 | 
			
		||||
 		zio_destroy(zio);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@ -0,0 +1,221 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Olaf Faaland <faaland1@llnl.gov>
 | 
			
		||||
Date: Mon, 20 Aug 2018 10:05:23 -0700
 | 
			
		||||
Subject: [PATCH] Skip import activity test in more zdb code paths
 | 
			
		||||
 | 
			
		||||
Since zdb opens the pools read-only, it cannot damage the pool in the
 | 
			
		||||
event the pool is already imported either on the same host or on
 | 
			
		||||
another one.
 | 
			
		||||
 | 
			
		||||
If the pool vdev structure is changing while zdb is importing the
 | 
			
		||||
pool, it may cause zdb to crash.  However this is unlikely, and in any
 | 
			
		||||
case it's a user space process and can simply be run again.
 | 
			
		||||
 | 
			
		||||
For this reason, zdb should disable the multihost activity test on
 | 
			
		||||
import that is normally run.
 | 
			
		||||
 | 
			
		||||
This commit fixes a few zdb code paths where that had been overlooked.
 | 
			
		||||
It also adds tests to ensure that several common use cases handle this
 | 
			
		||||
properly in the future.
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Reviewed-by: Gu Zheng <guzheng2331314@163.com>
 | 
			
		||||
Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
 | 
			
		||||
Closes #7797
 | 
			
		||||
Closes #7801
 | 
			
		||||
---
 | 
			
		||||
 cmd/zdb/zdb.c                                      | 39 +++++++-----
 | 
			
		||||
 tests/runfiles/linux.run                           |  3 +-
 | 
			
		||||
 tests/zfs-tests/tests/functional/mmp/Makefile.am   |  1 +
 | 
			
		||||
 .../zfs-tests/tests/functional/mmp/mmp_on_zdb.ksh  | 74 ++++++++++++++++++++++
 | 
			
		||||
 4 files changed, 101 insertions(+), 16 deletions(-)
 | 
			
		||||
 create mode 100755 tests/zfs-tests/tests/functional/mmp/mmp_on_zdb.ksh
 | 
			
		||||
 | 
			
		||||
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
 | 
			
		||||
index 17a0ae25..bb9fd3f1 100644
 | 
			
		||||
--- a/cmd/zdb/zdb.c
 | 
			
		||||
+++ b/cmd/zdb/zdb.c
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
  * Copyright (c) 2011, 2016 by Delphix. All rights reserved.
 | 
			
		||||
  * Copyright (c) 2014 Integros [integros.com]
 | 
			
		||||
  * Copyright 2016 Nexenta Systems, Inc.
 | 
			
		||||
- * Copyright (c) 2017 Lawrence Livermore National Security, LLC.
 | 
			
		||||
+ * Copyright (c) 2017, 2018 Lawrence Livermore National Security, LLC.
 | 
			
		||||
  * Copyright (c) 2015, 2017, Intel Corporation.
 | 
			
		||||
  */
 | 
			
		||||
 
 | 
			
		||||
@@ -3660,6 +3660,22 @@ dump_simulated_ddt(spa_t *spa)
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void
 | 
			
		||||
+zdb_set_skip_mmp(char *target)
 | 
			
		||||
+{
 | 
			
		||||
+	spa_t *spa;
 | 
			
		||||
+
 | 
			
		||||
+	/*
 | 
			
		||||
+	 * Disable the activity check to allow examination of
 | 
			
		||||
+	 * active pools.
 | 
			
		||||
+	 */
 | 
			
		||||
+	mutex_enter(&spa_namespace_lock);
 | 
			
		||||
+	if ((spa = spa_lookup(target)) != NULL) {
 | 
			
		||||
+		spa->spa_import_flags |= ZFS_IMPORT_SKIP_MMP;
 | 
			
		||||
+	}
 | 
			
		||||
+	mutex_exit(&spa_namespace_lock);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static void
 | 
			
		||||
 dump_zpool(spa_t *spa)
 | 
			
		||||
 {
 | 
			
		||||
 	dsl_pool_t *dp = spa_get_dsl(spa);
 | 
			
		||||
@@ -4412,14 +4428,15 @@ main(int argc, char **argv)
 | 
			
		||||
 				    target, strerror(ENOMEM));
 | 
			
		||||
 			}
 | 
			
		||||
 
 | 
			
		||||
-			/*
 | 
			
		||||
-			 * Disable the activity check to allow examination of
 | 
			
		||||
-			 * active pools.
 | 
			
		||||
-			 */
 | 
			
		||||
 			if (dump_opt['C'] > 1) {
 | 
			
		||||
 				(void) printf("\nConfiguration for import:\n");
 | 
			
		||||
 				dump_nvlist(cfg, 8);
 | 
			
		||||
 			}
 | 
			
		||||
+
 | 
			
		||||
+			/*
 | 
			
		||||
+			 * Disable the activity check to allow examination of
 | 
			
		||||
+			 * active pools.
 | 
			
		||||
+			 */
 | 
			
		||||
 			error = spa_import(target_pool, cfg, NULL,
 | 
			
		||||
 			    flags | ZFS_IMPORT_SKIP_MMP);
 | 
			
		||||
 		}
 | 
			
		||||
@@ -4430,16 +4447,7 @@ main(int argc, char **argv)
 | 
			
		||||
 
 | 
			
		||||
 	if (error == 0) {
 | 
			
		||||
 		if (target_is_spa || dump_opt['R']) {
 | 
			
		||||
-			/*
 | 
			
		||||
-			 * Disable the activity check to allow examination of
 | 
			
		||||
-			 * active pools.
 | 
			
		||||
-			 */
 | 
			
		||||
-			mutex_enter(&spa_namespace_lock);
 | 
			
		||||
-			if ((spa = spa_lookup(target)) != NULL) {
 | 
			
		||||
-				spa->spa_import_flags |= ZFS_IMPORT_SKIP_MMP;
 | 
			
		||||
-			}
 | 
			
		||||
-			mutex_exit(&spa_namespace_lock);
 | 
			
		||||
-
 | 
			
		||||
+			zdb_set_skip_mmp(target);
 | 
			
		||||
 			error = spa_open_rewind(target, &spa, FTAG, policy,
 | 
			
		||||
 			    NULL);
 | 
			
		||||
 			if (error) {
 | 
			
		||||
@@ -4462,6 +4470,7 @@ main(int argc, char **argv)
 | 
			
		||||
 				}
 | 
			
		||||
 			}
 | 
			
		||||
 		} else {
 | 
			
		||||
+			zdb_set_skip_mmp(target);
 | 
			
		||||
 			error = open_objset(target, DMU_OST_ANY, FTAG, &os);
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run
 | 
			
		||||
index d8fe6f3a..ddf01aaf 100644
 | 
			
		||||
--- a/tests/runfiles/linux.run
 | 
			
		||||
+++ b/tests/runfiles/linux.run
 | 
			
		||||
@@ -499,7 +499,8 @@ tags = ['functional', 'mmap']
 | 
			
		||||
 [tests/functional/mmp]
 | 
			
		||||
 tests = ['mmp_on_thread', 'mmp_on_uberblocks', 'mmp_on_off', 'mmp_interval',
 | 
			
		||||
     'mmp_active_import', 'mmp_inactive_import', 'mmp_exported_import',
 | 
			
		||||
-    'mmp_write_uberblocks', 'mmp_reset_interval', 'multihost_history']
 | 
			
		||||
+    'mmp_write_uberblocks', 'mmp_reset_interval', 'multihost_history',
 | 
			
		||||
+    'mmp_on_zdb']
 | 
			
		||||
 tags = ['functional', 'mmp']
 | 
			
		||||
 
 | 
			
		||||
 [tests/functional/mount]
 | 
			
		||||
diff --git a/tests/zfs-tests/tests/functional/mmp/Makefile.am b/tests/zfs-tests/tests/functional/mmp/Makefile.am
 | 
			
		||||
index ecf16f80..f2d0ad0e 100644
 | 
			
		||||
--- a/tests/zfs-tests/tests/functional/mmp/Makefile.am
 | 
			
		||||
+++ b/tests/zfs-tests/tests/functional/mmp/Makefile.am
 | 
			
		||||
@@ -10,6 +10,7 @@ dist_pkgdata_SCRIPTS = \
 | 
			
		||||
 	mmp_exported_import.ksh \
 | 
			
		||||
 	mmp_write_uberblocks.ksh \
 | 
			
		||||
 	mmp_reset_interval.ksh \
 | 
			
		||||
+	mmp_on_zdb.ksh \
 | 
			
		||||
 	setup.ksh \
 | 
			
		||||
 	cleanup.ksh
 | 
			
		||||
 
 | 
			
		||||
diff --git a/tests/zfs-tests/tests/functional/mmp/mmp_on_zdb.ksh b/tests/zfs-tests/tests/functional/mmp/mmp_on_zdb.ksh
 | 
			
		||||
new file mode 100755
 | 
			
		||||
index 00000000..b646475a
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/tests/zfs-tests/tests/functional/mmp/mmp_on_zdb.ksh
 | 
			
		||||
@@ -0,0 +1,74 @@
 | 
			
		||||
+#!/bin/ksh
 | 
			
		||||
+
 | 
			
		||||
+#
 | 
			
		||||
+# This file and its contents are supplied under the terms of the
 | 
			
		||||
+# Common Development and Distribution License ("CDDL"), version 1.0.
 | 
			
		||||
+# You may only use this file in accordance with the terms of version
 | 
			
		||||
+# 1.0 of the CDDL.
 | 
			
		||||
+#
 | 
			
		||||
+# A full copy of the text of the CDDL should have accompanied this
 | 
			
		||||
+# source.  A copy of the CDDL is also available via the Internet at
 | 
			
		||||
+# http://www.illumos.org/license/CDDL.
 | 
			
		||||
+#
 | 
			
		||||
+
 | 
			
		||||
+#
 | 
			
		||||
+# Copyright (c) 2018 Lawrence Livermore National Security, LLC.
 | 
			
		||||
+# Copyright (c) 2018 by Nutanix. All rights reserved.
 | 
			
		||||
+#
 | 
			
		||||
+
 | 
			
		||||
+. $STF_SUITE/include/libtest.shlib
 | 
			
		||||
+. $STF_SUITE/tests/functional/mmp/mmp.cfg
 | 
			
		||||
+. $STF_SUITE/tests/functional/mmp/mmp.kshlib
 | 
			
		||||
+
 | 
			
		||||
+#
 | 
			
		||||
+# Description:
 | 
			
		||||
+# zdb will work while multihost is enabled.
 | 
			
		||||
+#
 | 
			
		||||
+# Strategy:
 | 
			
		||||
+# 1. Create a pool
 | 
			
		||||
+# 2. Enable multihost
 | 
			
		||||
+# 3. Run zdb -d with pool and dataset arguments.
 | 
			
		||||
+# 4. Create a checkpoint
 | 
			
		||||
+# 5. Run zdb -kd with pool and dataset arguments.
 | 
			
		||||
+# 6. Discard the checkpoint
 | 
			
		||||
+# 7. Export the pool
 | 
			
		||||
+# 8. Run zdb -ed with pool and dataset arguments.
 | 
			
		||||
+#
 | 
			
		||||
+
 | 
			
		||||
+function cleanup
 | 
			
		||||
+{
 | 
			
		||||
+	datasetexists $TESTPOOL && destroy_pool $TESTPOOL
 | 
			
		||||
+	for DISK in $DISKS; do
 | 
			
		||||
+		zpool labelclear -f $DEV_RDSKDIR/$DISK
 | 
			
		||||
+	done
 | 
			
		||||
+	log_must mmp_clear_hostid
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+log_assert "Verify zdb -d works while multihost is enabled"
 | 
			
		||||
+log_onexit cleanup
 | 
			
		||||
+
 | 
			
		||||
+verify_runnable "global"
 | 
			
		||||
+verify_disk_count "$DISKS" 2
 | 
			
		||||
+
 | 
			
		||||
+default_mirror_setup_noexit $DISKS
 | 
			
		||||
+log_must mmp_set_hostid $HOSTID1
 | 
			
		||||
+log_must zpool set multihost=on $TESTPOOL
 | 
			
		||||
+log_must zfs snap $TESTPOOL/$TESTFS@snap
 | 
			
		||||
+
 | 
			
		||||
+log_must zdb -d $TESTPOOL
 | 
			
		||||
+log_must zdb -d $TESTPOOL/
 | 
			
		||||
+log_must zdb -d $TESTPOOL/$TESTFS
 | 
			
		||||
+log_must zdb -d $TESTPOOL/$TESTFS@snap
 | 
			
		||||
+
 | 
			
		||||
+log_must zpool export $TESTPOOL
 | 
			
		||||
+
 | 
			
		||||
+log_must zdb -ed $TESTPOOL
 | 
			
		||||
+log_must zdb -ed $TESTPOOL/
 | 
			
		||||
+log_must zdb -ed $TESTPOOL/$TESTFS
 | 
			
		||||
+log_must zdb -ed $TESTPOOL/$TESTFS@snap
 | 
			
		||||
+
 | 
			
		||||
+log_must zpool import $TESTPOOL
 | 
			
		||||
+
 | 
			
		||||
+cleanup
 | 
			
		||||
+
 | 
			
		||||
+log_pass "zdb -d works while multihost is enabled"
 | 
			
		||||
							
								
								
									
										180
									
								
								zfs-patches/0011-Fix-statfs-2-for-32-bit-user-space.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								zfs-patches/0011-Fix-statfs-2-for-32-bit-user-space.patch
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,180 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Date: Mon, 24 Sep 2018 17:11:25 -0700
 | 
			
		||||
Subject: [PATCH] Fix statfs(2) for 32-bit user space
 | 
			
		||||
 | 
			
		||||
When handling a 32-bit statfs() system call the returned fields,
 | 
			
		||||
although 64-bit in the kernel, must be limited to 32-bits or an
 | 
			
		||||
EOVERFLOW error will be returned.
 | 
			
		||||
 | 
			
		||||
This is less of an issue for block counts since the default
 | 
			
		||||
reported block size in 128KiB. But since it is possible to
 | 
			
		||||
set a smaller block size, these values will be scaled as
 | 
			
		||||
needed to fit in a 32-bit unsigned long.
 | 
			
		||||
 | 
			
		||||
Unlike most other filesystems the total possible file counts
 | 
			
		||||
are more likely to overflow because they are calculated based
 | 
			
		||||
on the available free space in the pool. In order to prevent
 | 
			
		||||
this the reported value must be capped at 2^32-1. This is
 | 
			
		||||
only for statfs(2) reporting, there are no changes to the
 | 
			
		||||
internal ZFS limits.
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Andreas Dilger <andreas.dilger@whamcloud.com>
 | 
			
		||||
Reviewed-by: Richard Yao <ryao@gentoo.org>
 | 
			
		||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Issue #7927
 | 
			
		||||
Closes #7122
 | 
			
		||||
Closes #7937
 | 
			
		||||
---
 | 
			
		||||
 config/kernel-in-compat-syscall.m4 | 20 ++++++++++++++++++++
 | 
			
		||||
 config/kernel.m4                   |  1 +
 | 
			
		||||
 include/linux/vfs_compat.h         | 18 ++++++++++++++++++
 | 
			
		||||
 module/zfs/zfs_vfsops.c            |  8 +++-----
 | 
			
		||||
 module/zfs/zpl_super.c             | 22 ++++++++++++++++++++++
 | 
			
		||||
 5 files changed, 64 insertions(+), 5 deletions(-)
 | 
			
		||||
 create mode 100644 config/kernel-in-compat-syscall.m4
 | 
			
		||||
 | 
			
		||||
diff --git a/config/kernel-in-compat-syscall.m4 b/config/kernel-in-compat-syscall.m4
 | 
			
		||||
new file mode 100644
 | 
			
		||||
index 00000000..9fca9da2
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/config/kernel-in-compat-syscall.m4
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
+dnl #
 | 
			
		||||
+dnl # 4.5 API change
 | 
			
		||||
+dnl # Added in_compat_syscall() which can be overridden on a per-
 | 
			
		||||
+dnl # architecture basis.  Prior to this is_compat_task() was the
 | 
			
		||||
+dnl # provided interface.
 | 
			
		||||
+dnl #
 | 
			
		||||
+AC_DEFUN([ZFS_AC_KERNEL_IN_COMPAT_SYSCALL], [
 | 
			
		||||
+	AC_MSG_CHECKING([whether in_compat_syscall() is available])
 | 
			
		||||
+	ZFS_LINUX_TRY_COMPILE([
 | 
			
		||||
+		#include <linux/compat.h>
 | 
			
		||||
+	],[
 | 
			
		||||
+		in_compat_syscall();
 | 
			
		||||
+	],[
 | 
			
		||||
+		AC_MSG_RESULT(yes)
 | 
			
		||||
+		AC_DEFINE(HAVE_IN_COMPAT_SYSCALL, 1,
 | 
			
		||||
+		    [in_compat_syscall() is available])
 | 
			
		||||
+	],[
 | 
			
		||||
+		AC_MSG_RESULT(no)
 | 
			
		||||
+	])
 | 
			
		||||
+])
 | 
			
		||||
diff --git a/config/kernel.m4 b/config/kernel.m4
 | 
			
		||||
index c7ca260c..3777f45c 100644
 | 
			
		||||
--- a/config/kernel.m4
 | 
			
		||||
+++ b/config/kernel.m4
 | 
			
		||||
@@ -129,6 +129,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
 | 
			
		||||
 	ZFS_AC_KERNEL_GLOBAL_PAGE_STATE
 | 
			
		||||
 	ZFS_AC_KERNEL_ACL_HAS_REFCOUNT
 | 
			
		||||
 	ZFS_AC_KERNEL_USERNS_CAPABILITIES
 | 
			
		||||
+	ZFS_AC_KERNEL_IN_COMPAT_SYSCALL
 | 
			
		||||
 
 | 
			
		||||
 	AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
 | 
			
		||||
 		KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
 | 
			
		||||
diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h
 | 
			
		||||
index c8203bd5..90b3cca7 100644
 | 
			
		||||
--- a/include/linux/vfs_compat.h
 | 
			
		||||
+++ b/include/linux/vfs_compat.h
 | 
			
		||||
@@ -30,6 +30,7 @@
 | 
			
		||||
 #include <sys/taskq.h>
 | 
			
		||||
 #include <sys/cred.h>
 | 
			
		||||
 #include <linux/backing-dev.h>
 | 
			
		||||
+#include <linux/compat.h>
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
  * 2.6.28 API change,
 | 
			
		||||
@@ -626,4 +627,21 @@ inode_set_iversion(struct inode *ip, u64 val)
 | 
			
		||||
 }
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
+/*
 | 
			
		||||
+ * Returns true when called in the context of a 32-bit system call.
 | 
			
		||||
+ */
 | 
			
		||||
+static inline int
 | 
			
		||||
+zpl_is_32bit_api(void)
 | 
			
		||||
+{
 | 
			
		||||
+#ifdef CONFIG_COMPAT
 | 
			
		||||
+#ifdef HAVE_IN_COMPAT_SYSCALL
 | 
			
		||||
+	return (in_compat_syscall());
 | 
			
		||||
+#else
 | 
			
		||||
+	return (is_compat_task());
 | 
			
		||||
+#endif
 | 
			
		||||
+#else
 | 
			
		||||
+	return (BITS_PER_LONG == 32);
 | 
			
		||||
+#endif
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 #endif /* _ZFS_VFS_H */
 | 
			
		||||
diff --git a/module/zfs/zfs_vfsops.c b/module/zfs/zfs_vfsops.c
 | 
			
		||||
index 76113393..bcdfa26b 100644
 | 
			
		||||
--- a/module/zfs/zfs_vfsops.c
 | 
			
		||||
+++ b/module/zfs/zfs_vfsops.c
 | 
			
		||||
@@ -1245,15 +1245,13 @@ zfs_statvfs(struct dentry *dentry, struct kstatfs *statp)
 | 
			
		||||
 {
 | 
			
		||||
 	zfsvfs_t *zfsvfs = dentry->d_sb->s_fs_info;
 | 
			
		||||
 	uint64_t refdbytes, availbytes, usedobjs, availobjs;
 | 
			
		||||
-	uint64_t fsid;
 | 
			
		||||
-	uint32_t bshift;
 | 
			
		||||
 
 | 
			
		||||
 	ZFS_ENTER(zfsvfs);
 | 
			
		||||
 
 | 
			
		||||
 	dmu_objset_space(zfsvfs->z_os,
 | 
			
		||||
 	    &refdbytes, &availbytes, &usedobjs, &availobjs);
 | 
			
		||||
 
 | 
			
		||||
-	fsid = dmu_objset_fsid_guid(zfsvfs->z_os);
 | 
			
		||||
+	uint64_t fsid = dmu_objset_fsid_guid(zfsvfs->z_os);
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * The underlying storage pool actually uses multiple block
 | 
			
		||||
 	 * size.  Under Solaris frsize (fragment size) is reported as
 | 
			
		||||
@@ -1265,7 +1263,7 @@ zfs_statvfs(struct dentry *dentry, struct kstatfs *statp)
 | 
			
		||||
 	 */
 | 
			
		||||
 	statp->f_frsize = zfsvfs->z_max_blksz;
 | 
			
		||||
 	statp->f_bsize = zfsvfs->z_max_blksz;
 | 
			
		||||
-	bshift = fls(statp->f_bsize) - 1;
 | 
			
		||||
+	uint32_t bshift = fls(statp->f_bsize) - 1;
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * The following report "total" blocks of various kinds in
 | 
			
		||||
@@ -1282,7 +1280,7 @@ zfs_statvfs(struct dentry *dentry, struct kstatfs *statp)
 | 
			
		||||
 	 * static metadata.  ZFS doesn't preallocate files, so the best
 | 
			
		||||
 	 * we can do is report the max that could possibly fit in f_files,
 | 
			
		||||
 	 * and that minus the number actually used in f_ffree.
 | 
			
		||||
-	 * For f_ffree, report the smaller of the number of object available
 | 
			
		||||
+	 * For f_ffree, report the smaller of the number of objects available
 | 
			
		||||
 	 * and the number of blocks (each object will take at least a block).
 | 
			
		||||
 	 */
 | 
			
		||||
 	statp->f_ffree = MIN(availobjs, availbytes >> DNODE_SHIFT);
 | 
			
		||||
diff --git a/module/zfs/zpl_super.c b/module/zfs/zpl_super.c
 | 
			
		||||
index 5c426b0a..216c7940 100644
 | 
			
		||||
--- a/module/zfs/zpl_super.c
 | 
			
		||||
+++ b/module/zfs/zpl_super.c
 | 
			
		||||
@@ -181,6 +181,28 @@ zpl_statfs(struct dentry *dentry, struct kstatfs *statp)
 | 
			
		||||
 	spl_fstrans_unmark(cookie);
 | 
			
		||||
 	ASSERT3S(error, <=, 0);
 | 
			
		||||
 
 | 
			
		||||
+	/*
 | 
			
		||||
+	 * If required by a 32-bit system call, dynamically scale the
 | 
			
		||||
+	 * block size up to 16MiB and decrease the block counts.  This
 | 
			
		||||
+	 * allows for a maximum size of 64EiB to be reported.  The file
 | 
			
		||||
+	 * counts must be artificially capped at 2^32-1.
 | 
			
		||||
+	 */
 | 
			
		||||
+	if (unlikely(zpl_is_32bit_api())) {
 | 
			
		||||
+		while (statp->f_blocks > UINT32_MAX &&
 | 
			
		||||
+		    statp->f_bsize < SPA_MAXBLOCKSIZE) {
 | 
			
		||||
+			statp->f_frsize <<= 1;
 | 
			
		||||
+			statp->f_bsize <<= 1;
 | 
			
		||||
+
 | 
			
		||||
+			statp->f_blocks >>= 1;
 | 
			
		||||
+			statp->f_bfree >>= 1;
 | 
			
		||||
+			statp->f_bavail >>= 1;
 | 
			
		||||
+		}
 | 
			
		||||
+
 | 
			
		||||
+		uint64_t usedobjs = statp->f_files - statp->f_ffree;
 | 
			
		||||
+		statp->f_ffree = MIN(statp->f_ffree, UINT32_MAX - usedobjs);
 | 
			
		||||
+		statp->f_files = statp->f_ffree + usedobjs;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
 	return (error);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -0,0 +1,86 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Gregor Kopka <mailfrom-github@kopka.net>
 | 
			
		||||
Date: Wed, 26 Sep 2018 01:29:16 +0200
 | 
			
		||||
Subject: [PATCH] Zpool iostat: remove latency/queue scaling
 | 
			
		||||
 | 
			
		||||
Bandwidth and iops are average per second while *_wait are averages
 | 
			
		||||
per request for latency or, for queue depths, an instantaneous
 | 
			
		||||
measurement at the end of an interval (according to man zpool).
 | 
			
		||||
 | 
			
		||||
When calculating the first two it makes sense to do
 | 
			
		||||
x/interval_duration (x being the increase in total bytes or number of
 | 
			
		||||
requests over the duration of the interval, interval_duration in
 | 
			
		||||
seconds) to 'scale' from amount/interval_duration to amount/second.
 | 
			
		||||
 | 
			
		||||
But applying the same math for the latter (*_wait latencies/queue) is
 | 
			
		||||
wrong as there is no interval_duration component in the values (these
 | 
			
		||||
are time/requests to get to average_time/request or already an
 | 
			
		||||
absulute number).
 | 
			
		||||
 | 
			
		||||
This bug leads to the only correct continuous *_wait figures for both
 | 
			
		||||
latencies and queue depths from 'zpool iostat -l/q' being with
 | 
			
		||||
duration=1 as then the wrong math cancels itself (x/1 is a nop).
 | 
			
		||||
 | 
			
		||||
This removes temporal scaling from latency and queue depth figures.
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
 | 
			
		||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Signed-off-by: Gregor Kopka <gregor@kopka.net>
 | 
			
		||||
Closes #7945
 | 
			
		||||
Closes #7694
 | 
			
		||||
---
 | 
			
		||||
 cmd/zpool/zpool_main.c | 12 ++++++------
 | 
			
		||||
 1 file changed, 6 insertions(+), 6 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c
 | 
			
		||||
index a4fd0321..591e2e5c 100644
 | 
			
		||||
--- a/cmd/zpool/zpool_main.c
 | 
			
		||||
+++ b/cmd/zpool/zpool_main.c
 | 
			
		||||
@@ -3493,7 +3493,7 @@ single_histo_average(uint64_t *histo, unsigned int buckets)
 | 
			
		||||
 
 | 
			
		||||
 static void
 | 
			
		||||
 print_iostat_queues(iostat_cbdata_t *cb, nvlist_t *oldnv,
 | 
			
		||||
-    nvlist_t *newnv, double scale)
 | 
			
		||||
+    nvlist_t *newnv)
 | 
			
		||||
 {
 | 
			
		||||
 	int i;
 | 
			
		||||
 	uint64_t val;
 | 
			
		||||
@@ -3523,7 +3523,7 @@ print_iostat_queues(iostat_cbdata_t *cb, nvlist_t *oldnv,
 | 
			
		||||
 		format = ZFS_NICENUM_1024;
 | 
			
		||||
 
 | 
			
		||||
 	for (i = 0; i < ARRAY_SIZE(names); i++) {
 | 
			
		||||
-		val = nva[i].data[0] * scale;
 | 
			
		||||
+		val = nva[i].data[0];
 | 
			
		||||
 		print_one_stat(val, format, column_width, cb->cb_scripted);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -3532,7 +3532,7 @@ print_iostat_queues(iostat_cbdata_t *cb, nvlist_t *oldnv,
 | 
			
		||||
 
 | 
			
		||||
 static void
 | 
			
		||||
 print_iostat_latency(iostat_cbdata_t *cb, nvlist_t *oldnv,
 | 
			
		||||
-    nvlist_t *newnv, double scale)
 | 
			
		||||
+    nvlist_t *newnv)
 | 
			
		||||
 {
 | 
			
		||||
 	int i;
 | 
			
		||||
 	uint64_t val;
 | 
			
		||||
@@ -3562,7 +3562,7 @@ print_iostat_latency(iostat_cbdata_t *cb, nvlist_t *oldnv,
 | 
			
		||||
 	/* Print our avg latencies on the line */
 | 
			
		||||
 	for (i = 0; i < ARRAY_SIZE(names); i++) {
 | 
			
		||||
 		/* Compute average latency for a latency histo */
 | 
			
		||||
-		val = single_histo_average(nva[i].data, nva[i].count) * scale;
 | 
			
		||||
+		val = single_histo_average(nva[i].data, nva[i].count);
 | 
			
		||||
 		print_one_stat(val, format, column_width, cb->cb_scripted);
 | 
			
		||||
 	}
 | 
			
		||||
 	free_calc_stats(nva, ARRAY_SIZE(names));
 | 
			
		||||
@@ -3701,9 +3701,9 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
 | 
			
		||||
 		print_iostat_default(calcvs, cb, scale);
 | 
			
		||||
 	}
 | 
			
		||||
 	if (cb->cb_flags & IOS_LATENCY_M)
 | 
			
		||||
-		print_iostat_latency(cb, oldnv, newnv, scale);
 | 
			
		||||
+		print_iostat_latency(cb, oldnv, newnv);
 | 
			
		||||
 	if (cb->cb_flags & IOS_QUEUES_M)
 | 
			
		||||
-		print_iostat_queues(cb, oldnv, newnv, scale);
 | 
			
		||||
+		print_iostat_queues(cb, oldnv, newnv);
 | 
			
		||||
 	if (cb->cb_flags & IOS_ANYHISTO_M) {
 | 
			
		||||
 		printf("\n");
 | 
			
		||||
 		print_iostat_histos(cb, oldnv, newnv, scale, name);
 | 
			
		||||
@ -0,0 +1,878 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Tim Schumacher <timschumi@gmx.de>
 | 
			
		||||
Date: Wed, 26 Sep 2018 19:29:26 +0200
 | 
			
		||||
Subject: [PATCH] Linux 4.19-rc3+ compat: Remove refcount_t compat
 | 
			
		||||
 | 
			
		||||
torvalds/linux@59b57717f ("blkcg: delay blkg destruction until
 | 
			
		||||
after writeback has finished") added a refcount_t to the blkcg
 | 
			
		||||
structure. Due to the refcount_t compatibility code, zfs_refcount_t
 | 
			
		||||
was used by mistake.
 | 
			
		||||
 | 
			
		||||
Resolve this by removing the compatibility code and replacing the
 | 
			
		||||
occurrences of refcount_t with zfs_refcount_t.
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Franz Pletz <fpletz@fnordicwalking.de>
 | 
			
		||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Signed-off-by: Tim Schumacher <timschumi@gmx.de>
 | 
			
		||||
Closes #7885
 | 
			
		||||
Closes #7932
 | 
			
		||||
---
 | 
			
		||||
 cmd/ztest/ztest.c           |  6 +++---
 | 
			
		||||
 include/linux/vfs_compat.h  |  5 -----
 | 
			
		||||
 include/sys/abd.h           |  2 +-
 | 
			
		||||
 include/sys/arc.h           |  2 +-
 | 
			
		||||
 include/sys/arc_impl.h      |  8 +++----
 | 
			
		||||
 include/sys/dbuf.h          |  2 +-
 | 
			
		||||
 include/sys/dmu_tx.h        |  4 ++--
 | 
			
		||||
 include/sys/dnode.h         |  4 ++--
 | 
			
		||||
 include/sys/dsl_dataset.h   |  2 +-
 | 
			
		||||
 include/sys/metaslab_impl.h |  5 ++---
 | 
			
		||||
 include/sys/refcount.h      | 52 ++++++++++++++++++++-------------------------
 | 
			
		||||
 include/sys/rrwlock.h       |  4 ++--
 | 
			
		||||
 include/sys/sa_impl.h       |  2 +-
 | 
			
		||||
 include/sys/spa_impl.h      |  6 +++---
 | 
			
		||||
 include/sys/zap.h           |  2 +-
 | 
			
		||||
 include/sys/zfs_znode.h     |  2 +-
 | 
			
		||||
 module/zfs/arc.c            | 12 +++++------
 | 
			
		||||
 module/zfs/dbuf.c           | 10 ++++-----
 | 
			
		||||
 module/zfs/dmu.c            |  2 +-
 | 
			
		||||
 module/zfs/dmu_tx.c         |  6 +++---
 | 
			
		||||
 module/zfs/dnode.c          |  6 +++---
 | 
			
		||||
 module/zfs/dsl_dataset.c    |  2 +-
 | 
			
		||||
 module/zfs/metaslab.c       |  4 ++--
 | 
			
		||||
 module/zfs/refcount.c       | 30 +++++++++++++-------------
 | 
			
		||||
 module/zfs/rrwlock.c        |  4 ++--
 | 
			
		||||
 module/zfs/sa.c             |  2 +-
 | 
			
		||||
 module/zfs/spa_misc.c       |  8 +++----
 | 
			
		||||
 module/zfs/zfs_ctldir.c     | 10 ++++-----
 | 
			
		||||
 module/zfs/zfs_znode.c      |  2 +-
 | 
			
		||||
 29 files changed, 97 insertions(+), 109 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/cmd/ztest/ztest.c b/cmd/ztest/ztest.c
 | 
			
		||||
index a410eeef..24967a76 100644
 | 
			
		||||
--- a/cmd/ztest/ztest.c
 | 
			
		||||
+++ b/cmd/ztest/ztest.c
 | 
			
		||||
@@ -1189,7 +1189,7 @@ ztest_spa_prop_set_uint64(zpool_prop_t prop, uint64_t value)
 | 
			
		||||
  */
 | 
			
		||||
 typedef struct {
 | 
			
		||||
 	list_node_t z_lnode;
 | 
			
		||||
-	refcount_t z_refcnt;
 | 
			
		||||
+	zfs_refcount_t z_refcnt;
 | 
			
		||||
 	uint64_t z_object;
 | 
			
		||||
 	zfs_rlock_t z_range_lock;
 | 
			
		||||
 } ztest_znode_t;
 | 
			
		||||
@@ -1248,13 +1248,13 @@ ztest_znode_get(ztest_ds_t *zd, uint64_t object)
 | 
			
		||||
 	for (zp = list_head(&zll->z_list); (zp);
 | 
			
		||||
 	    zp = list_next(&zll->z_list, zp)) {
 | 
			
		||||
 		if (zp->z_object == object) {
 | 
			
		||||
-			refcount_add(&zp->z_refcnt, RL_TAG);
 | 
			
		||||
+			zfs_refcount_add(&zp->z_refcnt, RL_TAG);
 | 
			
		||||
 			break;
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
 	if (zp == NULL) {
 | 
			
		||||
 		zp = ztest_znode_init(object);
 | 
			
		||||
-		refcount_add(&zp->z_refcnt, RL_TAG);
 | 
			
		||||
+		zfs_refcount_add(&zp->z_refcnt, RL_TAG);
 | 
			
		||||
 		list_insert_head(&zll->z_list, zp);
 | 
			
		||||
 	}
 | 
			
		||||
 	mutex_exit(&zll->z_lock);
 | 
			
		||||
diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h
 | 
			
		||||
index 90b3cca7..c01f5850 100644
 | 
			
		||||
--- a/include/linux/vfs_compat.h
 | 
			
		||||
+++ b/include/linux/vfs_compat.h
 | 
			
		||||
@@ -297,9 +297,6 @@ lseek_execute(
 | 
			
		||||
  * This is several orders of magnitude larger than expected grace period.
 | 
			
		||||
  * At 60 seconds the kernel will also begin issuing RCU stall warnings.
 | 
			
		||||
  */
 | 
			
		||||
-#ifdef refcount_t
 | 
			
		||||
-#undef refcount_t
 | 
			
		||||
-#endif
 | 
			
		||||
 
 | 
			
		||||
 #include <linux/posix_acl.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -430,8 +427,6 @@ typedef mode_t zpl_equivmode_t;
 | 
			
		||||
 #define	zpl_posix_acl_valid(ip, acl)  posix_acl_valid(acl)
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
-#define	refcount_t	zfs_refcount_t
 | 
			
		||||
-
 | 
			
		||||
 #endif /* CONFIG_FS_POSIX_ACL */
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
diff --git a/include/sys/abd.h b/include/sys/abd.h
 | 
			
		||||
index cd710501..4898606a 100644
 | 
			
		||||
--- a/include/sys/abd.h
 | 
			
		||||
+++ b/include/sys/abd.h
 | 
			
		||||
@@ -52,7 +52,7 @@ typedef struct abd {
 | 
			
		||||
 	abd_flags_t	abd_flags;
 | 
			
		||||
 	uint_t		abd_size;	/* excludes scattered abd_offset */
 | 
			
		||||
 	struct abd	*abd_parent;
 | 
			
		||||
-	refcount_t	abd_children;
 | 
			
		||||
+	zfs_refcount_t	abd_children;
 | 
			
		||||
 	union {
 | 
			
		||||
 		struct abd_scatter {
 | 
			
		||||
 			uint_t		abd_offset;
 | 
			
		||||
diff --git a/include/sys/arc.h b/include/sys/arc.h
 | 
			
		||||
index 1ea4937b..943ebfb5 100644
 | 
			
		||||
--- a/include/sys/arc.h
 | 
			
		||||
+++ b/include/sys/arc.h
 | 
			
		||||
@@ -76,7 +76,7 @@ struct arc_prune {
 | 
			
		||||
 	void			*p_private;
 | 
			
		||||
 	uint64_t		p_adjust;
 | 
			
		||||
 	list_node_t		p_node;
 | 
			
		||||
-	refcount_t		p_refcnt;
 | 
			
		||||
+	zfs_refcount_t		p_refcnt;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 typedef enum arc_strategy {
 | 
			
		||||
diff --git a/include/sys/arc_impl.h b/include/sys/arc_impl.h
 | 
			
		||||
index c6363f2a..ed2b0abe 100644
 | 
			
		||||
--- a/include/sys/arc_impl.h
 | 
			
		||||
+++ b/include/sys/arc_impl.h
 | 
			
		||||
@@ -74,12 +74,12 @@ typedef struct arc_state {
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * total amount of evictable data in this state
 | 
			
		||||
 	 */
 | 
			
		||||
-	refcount_t arcs_esize[ARC_BUFC_NUMTYPES];
 | 
			
		||||
+	zfs_refcount_t arcs_esize[ARC_BUFC_NUMTYPES];
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * total amount of data in this state; this includes: evictable,
 | 
			
		||||
 	 * non-evictable, ARC_BUFC_DATA, and ARC_BUFC_METADATA.
 | 
			
		||||
 	 */
 | 
			
		||||
-	refcount_t arcs_size;
 | 
			
		||||
+	zfs_refcount_t arcs_size;
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * supports the "dbufs" kstat
 | 
			
		||||
 	 */
 | 
			
		||||
@@ -163,7 +163,7 @@ typedef struct l1arc_buf_hdr {
 | 
			
		||||
 	uint32_t		b_l2_hits;
 | 
			
		||||
 
 | 
			
		||||
 	/* self protecting */
 | 
			
		||||
-	refcount_t		b_refcnt;
 | 
			
		||||
+	zfs_refcount_t		b_refcnt;
 | 
			
		||||
 
 | 
			
		||||
 	arc_callback_t		*b_acb;
 | 
			
		||||
 	abd_t			*b_pabd;
 | 
			
		||||
@@ -180,7 +180,7 @@ typedef struct l2arc_dev {
 | 
			
		||||
 	kmutex_t		l2ad_mtx;	/* lock for buffer list */
 | 
			
		||||
 	list_t			l2ad_buflist;	/* buffer list */
 | 
			
		||||
 	list_node_t		l2ad_node;	/* device list node */
 | 
			
		||||
-	refcount_t		l2ad_alloc;	/* allocated bytes */
 | 
			
		||||
+	zfs_refcount_t		l2ad_alloc;	/* allocated bytes */
 | 
			
		||||
 } l2arc_dev_t;
 | 
			
		||||
 
 | 
			
		||||
 typedef struct l2arc_buf_hdr {
 | 
			
		||||
diff --git a/include/sys/dbuf.h b/include/sys/dbuf.h
 | 
			
		||||
index f3f2007d..127acad3 100644
 | 
			
		||||
--- a/include/sys/dbuf.h
 | 
			
		||||
+++ b/include/sys/dbuf.h
 | 
			
		||||
@@ -212,7 +212,7 @@ typedef struct dmu_buf_impl {
 | 
			
		||||
 	 * If nonzero, the buffer can't be destroyed.
 | 
			
		||||
 	 * Protected by db_mtx.
 | 
			
		||||
 	 */
 | 
			
		||||
-	refcount_t db_holds;
 | 
			
		||||
+	zfs_refcount_t db_holds;
 | 
			
		||||
 
 | 
			
		||||
 	/* buffer holding our data */
 | 
			
		||||
 	arc_buf_t *db_buf;
 | 
			
		||||
diff --git a/include/sys/dmu_tx.h b/include/sys/dmu_tx.h
 | 
			
		||||
index 74b7e111..96bbcb05 100644
 | 
			
		||||
--- a/include/sys/dmu_tx.h
 | 
			
		||||
+++ b/include/sys/dmu_tx.h
 | 
			
		||||
@@ -97,8 +97,8 @@ typedef struct dmu_tx_hold {
 | 
			
		||||
 	dmu_tx_t *txh_tx;
 | 
			
		||||
 	list_node_t txh_node;
 | 
			
		||||
 	struct dnode *txh_dnode;
 | 
			
		||||
-	refcount_t txh_space_towrite;
 | 
			
		||||
-	refcount_t txh_memory_tohold;
 | 
			
		||||
+	zfs_refcount_t txh_space_towrite;
 | 
			
		||||
+	zfs_refcount_t txh_memory_tohold;
 | 
			
		||||
 	enum dmu_tx_hold_type txh_type;
 | 
			
		||||
 	uint64_t txh_arg1;
 | 
			
		||||
 	uint64_t txh_arg2;
 | 
			
		||||
diff --git a/include/sys/dnode.h b/include/sys/dnode.h
 | 
			
		||||
index 2dd087b3..1e77e0a3 100644
 | 
			
		||||
--- a/include/sys/dnode.h
 | 
			
		||||
+++ b/include/sys/dnode.h
 | 
			
		||||
@@ -266,8 +266,8 @@ struct dnode {
 | 
			
		||||
 	uint8_t *dn_dirtyctx_firstset;		/* dbg: contents meaningless */
 | 
			
		||||
 
 | 
			
		||||
 	/* protected by own devices */
 | 
			
		||||
-	refcount_t dn_tx_holds;
 | 
			
		||||
-	refcount_t dn_holds;
 | 
			
		||||
+	zfs_refcount_t dn_tx_holds;
 | 
			
		||||
+	zfs_refcount_t dn_holds;
 | 
			
		||||
 
 | 
			
		||||
 	kmutex_t dn_dbufs_mtx;
 | 
			
		||||
 	/*
 | 
			
		||||
diff --git a/include/sys/dsl_dataset.h b/include/sys/dsl_dataset.h
 | 
			
		||||
index 1281674b..d96f526d 100644
 | 
			
		||||
--- a/include/sys/dsl_dataset.h
 | 
			
		||||
+++ b/include/sys/dsl_dataset.h
 | 
			
		||||
@@ -186,7 +186,7 @@ typedef struct dsl_dataset {
 | 
			
		||||
 	 * Owning counts as a long hold.  See the comments above
 | 
			
		||||
 	 * dsl_pool_hold() for details.
 | 
			
		||||
 	 */
 | 
			
		||||
-	refcount_t ds_longholds;
 | 
			
		||||
+	zfs_refcount_t ds_longholds;
 | 
			
		||||
 
 | 
			
		||||
 	/* no locking; only for making guesses */
 | 
			
		||||
 	uint64_t ds_trysnap_txg;
 | 
			
		||||
diff --git a/include/sys/metaslab_impl.h b/include/sys/metaslab_impl.h
 | 
			
		||||
index f8a713a4..60151937 100644
 | 
			
		||||
--- a/include/sys/metaslab_impl.h
 | 
			
		||||
+++ b/include/sys/metaslab_impl.h
 | 
			
		||||
@@ -179,8 +179,7 @@ struct metaslab_class {
 | 
			
		||||
 	 * number of allocations allowed.
 | 
			
		||||
 	 */
 | 
			
		||||
 	uint64_t		mc_alloc_max_slots;
 | 
			
		||||
-	refcount_t		mc_alloc_slots;
 | 
			
		||||
-
 | 
			
		||||
+	zfs_refcount_t		mc_alloc_slots;
 | 
			
		||||
 	uint64_t		mc_alloc_groups; /* # of allocatable groups */
 | 
			
		||||
 
 | 
			
		||||
 	uint64_t		mc_alloc;	/* total allocated space */
 | 
			
		||||
@@ -230,7 +229,7 @@ struct metaslab_group {
 | 
			
		||||
 	 * are unable to handle their share of allocations.
 | 
			
		||||
 	 */
 | 
			
		||||
 	uint64_t		mg_max_alloc_queue_depth;
 | 
			
		||||
-	refcount_t		mg_alloc_queue_depth;
 | 
			
		||||
+	zfs_refcount_t		mg_alloc_queue_depth;
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * A metalab group that can no longer allocate the minimum block
 | 
			
		||||
diff --git a/include/sys/refcount.h b/include/sys/refcount.h
 | 
			
		||||
index a96220b2..5c5198d8 100644
 | 
			
		||||
--- a/include/sys/refcount.h
 | 
			
		||||
+++ b/include/sys/refcount.h
 | 
			
		||||
@@ -41,17 +41,6 @@ extern "C" {
 | 
			
		||||
  */
 | 
			
		||||
 #define	FTAG ((char *)__func__)
 | 
			
		||||
 
 | 
			
		||||
-/*
 | 
			
		||||
- * Starting with 4.11, torvalds/linux@f405df5, the linux kernel defines a
 | 
			
		||||
- * refcount_t type of its own.  The macro below effectively changes references
 | 
			
		||||
- * in the ZFS code from refcount_t to zfs_refcount_t at compile time, so that
 | 
			
		||||
- * existing code need not be altered, reducing conflicts when landing openZFS
 | 
			
		||||
- * patches.
 | 
			
		||||
- */
 | 
			
		||||
-
 | 
			
		||||
-#define	refcount_t	zfs_refcount_t
 | 
			
		||||
-#define	refcount_add	zfs_refcount_add
 | 
			
		||||
-
 | 
			
		||||
 #ifdef	ZFS_DEBUG
 | 
			
		||||
 typedef struct reference {
 | 
			
		||||
 	list_node_t ref_link;
 | 
			
		||||
@@ -69,23 +58,28 @@ typedef struct refcount {
 | 
			
		||||
 	uint64_t rc_removed_count;
 | 
			
		||||
 } zfs_refcount_t;
 | 
			
		||||
 
 | 
			
		||||
-/* Note: refcount_t must be initialized with refcount_create[_untracked]() */
 | 
			
		||||
-
 | 
			
		||||
-void refcount_create(refcount_t *rc);
 | 
			
		||||
-void refcount_create_untracked(refcount_t *rc);
 | 
			
		||||
-void refcount_create_tracked(refcount_t *rc);
 | 
			
		||||
-void refcount_destroy(refcount_t *rc);
 | 
			
		||||
-void refcount_destroy_many(refcount_t *rc, uint64_t number);
 | 
			
		||||
-int refcount_is_zero(refcount_t *rc);
 | 
			
		||||
-int64_t refcount_count(refcount_t *rc);
 | 
			
		||||
-int64_t zfs_refcount_add(refcount_t *rc, void *holder_tag);
 | 
			
		||||
-int64_t refcount_remove(refcount_t *rc, void *holder_tag);
 | 
			
		||||
-int64_t refcount_add_many(refcount_t *rc, uint64_t number, void *holder_tag);
 | 
			
		||||
-int64_t refcount_remove_many(refcount_t *rc, uint64_t number, void *holder_tag);
 | 
			
		||||
-void refcount_transfer(refcount_t *dst, refcount_t *src);
 | 
			
		||||
-void refcount_transfer_ownership(refcount_t *, void *, void *);
 | 
			
		||||
-boolean_t refcount_held(refcount_t *, void *);
 | 
			
		||||
-boolean_t refcount_not_held(refcount_t *, void *);
 | 
			
		||||
+/*
 | 
			
		||||
+ * Note: zfs_refcount_t must be initialized with
 | 
			
		||||
+ * refcount_create[_untracked]()
 | 
			
		||||
+ */
 | 
			
		||||
+
 | 
			
		||||
+void refcount_create(zfs_refcount_t *rc);
 | 
			
		||||
+void refcount_create_untracked(zfs_refcount_t *rc);
 | 
			
		||||
+void refcount_create_tracked(zfs_refcount_t *rc);
 | 
			
		||||
+void refcount_destroy(zfs_refcount_t *rc);
 | 
			
		||||
+void refcount_destroy_many(zfs_refcount_t *rc, uint64_t number);
 | 
			
		||||
+int refcount_is_zero(zfs_refcount_t *rc);
 | 
			
		||||
+int64_t refcount_count(zfs_refcount_t *rc);
 | 
			
		||||
+int64_t zfs_refcount_add(zfs_refcount_t *rc, void *holder_tag);
 | 
			
		||||
+int64_t refcount_remove(zfs_refcount_t *rc, void *holder_tag);
 | 
			
		||||
+int64_t refcount_add_many(zfs_refcount_t *rc, uint64_t number,
 | 
			
		||||
+    void *holder_tag);
 | 
			
		||||
+int64_t refcount_remove_many(zfs_refcount_t *rc, uint64_t number,
 | 
			
		||||
+    void *holder_tag);
 | 
			
		||||
+void refcount_transfer(zfs_refcount_t *dst, zfs_refcount_t *src);
 | 
			
		||||
+void refcount_transfer_ownership(zfs_refcount_t *, void *, void *);
 | 
			
		||||
+boolean_t refcount_held(zfs_refcount_t *, void *);
 | 
			
		||||
+boolean_t refcount_not_held(zfs_refcount_t *, void *);
 | 
			
		||||
 
 | 
			
		||||
 void refcount_init(void);
 | 
			
		||||
 void refcount_fini(void);
 | 
			
		||||
@@ -94,7 +88,7 @@ void refcount_fini(void);
 | 
			
		||||
 
 | 
			
		||||
 typedef struct refcount {
 | 
			
		||||
 	uint64_t rc_count;
 | 
			
		||||
-} refcount_t;
 | 
			
		||||
+} zfs_refcount_t;
 | 
			
		||||
 
 | 
			
		||||
 #define	refcount_create(rc) ((rc)->rc_count = 0)
 | 
			
		||||
 #define	refcount_create_untracked(rc) ((rc)->rc_count = 0)
 | 
			
		||||
diff --git a/include/sys/rrwlock.h b/include/sys/rrwlock.h
 | 
			
		||||
index 7a328fd6..e1c1756c 100644
 | 
			
		||||
--- a/include/sys/rrwlock.h
 | 
			
		||||
+++ b/include/sys/rrwlock.h
 | 
			
		||||
@@ -57,8 +57,8 @@ typedef struct rrwlock {
 | 
			
		||||
 	kmutex_t	rr_lock;
 | 
			
		||||
 	kcondvar_t	rr_cv;
 | 
			
		||||
 	kthread_t	*rr_writer;
 | 
			
		||||
-	refcount_t	rr_anon_rcount;
 | 
			
		||||
-	refcount_t	rr_linked_rcount;
 | 
			
		||||
+	zfs_refcount_t	rr_anon_rcount;
 | 
			
		||||
+	zfs_refcount_t	rr_linked_rcount;
 | 
			
		||||
 	boolean_t	rr_writer_wanted;
 | 
			
		||||
 	boolean_t	rr_track_all;
 | 
			
		||||
 } rrwlock_t;
 | 
			
		||||
diff --git a/include/sys/sa_impl.h b/include/sys/sa_impl.h
 | 
			
		||||
index b68b7610..7eddd875 100644
 | 
			
		||||
--- a/include/sys/sa_impl.h
 | 
			
		||||
+++ b/include/sys/sa_impl.h
 | 
			
		||||
@@ -110,7 +110,7 @@ typedef struct sa_idx_tab {
 | 
			
		||||
 	list_node_t	sa_next;
 | 
			
		||||
 	sa_lot_t	*sa_layout;
 | 
			
		||||
 	uint16_t	*sa_variable_lengths;
 | 
			
		||||
-	refcount_t	sa_refcount;
 | 
			
		||||
+	zfs_refcount_t	sa_refcount;
 | 
			
		||||
 	uint32_t	*sa_idx_tab;	/* array of offsets */
 | 
			
		||||
 } sa_idx_tab_t;
 | 
			
		||||
 
 | 
			
		||||
diff --git a/include/sys/spa_impl.h b/include/sys/spa_impl.h
 | 
			
		||||
index fa7490ac..62ac8f67 100644
 | 
			
		||||
--- a/include/sys/spa_impl.h
 | 
			
		||||
+++ b/include/sys/spa_impl.h
 | 
			
		||||
@@ -78,7 +78,7 @@ typedef struct spa_config_lock {
 | 
			
		||||
 	kthread_t	*scl_writer;
 | 
			
		||||
 	int		scl_write_wanted;
 | 
			
		||||
 	kcondvar_t	scl_cv;
 | 
			
		||||
-	refcount_t	scl_count;
 | 
			
		||||
+	zfs_refcount_t	scl_count;
 | 
			
		||||
 } spa_config_lock_t;
 | 
			
		||||
 
 | 
			
		||||
 typedef struct spa_config_dirent {
 | 
			
		||||
@@ -281,12 +281,12 @@ struct spa {
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * spa_refcount & spa_config_lock must be the last elements
 | 
			
		||||
-	 * because refcount_t changes size based on compilation options.
 | 
			
		||||
+	 * because zfs_refcount_t changes size based on compilation options.
 | 
			
		||||
 	 * In order for the MDB module to function correctly, the other
 | 
			
		||||
 	 * fields must remain in the same location.
 | 
			
		||||
 	 */
 | 
			
		||||
 	spa_config_lock_t spa_config_lock[SCL_LOCKS]; /* config changes */
 | 
			
		||||
-	refcount_t	spa_refcount;		/* number of opens */
 | 
			
		||||
+	zfs_refcount_t	spa_refcount;		/* number of opens */
 | 
			
		||||
 
 | 
			
		||||
 	taskq_t		*spa_upgrade_taskq;	/* taskq for upgrade jobs */
 | 
			
		||||
 };
 | 
			
		||||
diff --git a/include/sys/zap.h b/include/sys/zap.h
 | 
			
		||||
index 43b7fbd2..7acc3bec 100644
 | 
			
		||||
--- a/include/sys/zap.h
 | 
			
		||||
+++ b/include/sys/zap.h
 | 
			
		||||
@@ -226,7 +226,7 @@ int zap_lookup_norm_by_dnode(dnode_t *dn, const char *name,
 | 
			
		||||
     boolean_t *ncp);
 | 
			
		||||
 
 | 
			
		||||
 int zap_count_write_by_dnode(dnode_t *dn, const char *name,
 | 
			
		||||
-    int add, refcount_t *towrite, refcount_t *tooverwrite);
 | 
			
		||||
+    int add, zfs_refcount_t *towrite, zfs_refcount_t *tooverwrite);
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
  * Create an attribute with the given name and value.
 | 
			
		||||
diff --git a/include/sys/zfs_znode.h b/include/sys/zfs_znode.h
 | 
			
		||||
index 26d1eb37..33bc20d1 100644
 | 
			
		||||
--- a/include/sys/zfs_znode.h
 | 
			
		||||
+++ b/include/sys/zfs_znode.h
 | 
			
		||||
@@ -209,7 +209,7 @@ typedef struct znode_hold {
 | 
			
		||||
 	uint64_t	zh_obj;		/* object id */
 | 
			
		||||
 	kmutex_t	zh_lock;	/* lock serializing object access */
 | 
			
		||||
 	avl_node_t	zh_node;	/* avl tree linkage */
 | 
			
		||||
-	refcount_t	zh_refcount;	/* active consumer reference count */
 | 
			
		||||
+	zfs_refcount_t	zh_refcount;	/* active consumer reference count */
 | 
			
		||||
 } znode_hold_t;
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
 | 
			
		||||
index bcf74dd6..7518d5c8 100644
 | 
			
		||||
--- a/module/zfs/arc.c
 | 
			
		||||
+++ b/module/zfs/arc.c
 | 
			
		||||
@@ -1966,7 +1966,7 @@ add_reference(arc_buf_hdr_t *hdr, void *tag)
 | 
			
		||||
 
 | 
			
		||||
 	state = hdr->b_l1hdr.b_state;
 | 
			
		||||
 
 | 
			
		||||
-	if ((refcount_add(&hdr->b_l1hdr.b_refcnt, tag) == 1) &&
 | 
			
		||||
+	if ((zfs_refcount_add(&hdr->b_l1hdr.b_refcnt, tag) == 1) &&
 | 
			
		||||
 	    (state != arc_anon)) {
 | 
			
		||||
 		/* We don't use the L2-only state list. */
 | 
			
		||||
 		if (state != arc_l2c_only) {
 | 
			
		||||
@@ -2505,7 +2505,7 @@ arc_return_buf(arc_buf_t *buf, void *tag)
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT3P(buf->b_data, !=, NULL);
 | 
			
		||||
 	ASSERT(HDR_HAS_L1HDR(hdr));
 | 
			
		||||
-	(void) refcount_add(&hdr->b_l1hdr.b_refcnt, tag);
 | 
			
		||||
+	(void) zfs_refcount_add(&hdr->b_l1hdr.b_refcnt, tag);
 | 
			
		||||
 	(void) refcount_remove(&hdr->b_l1hdr.b_refcnt, arc_onloan_tag);
 | 
			
		||||
 
 | 
			
		||||
 	arc_loaned_bytes_update(-arc_buf_size(buf));
 | 
			
		||||
@@ -2519,7 +2519,7 @@ arc_loan_inuse_buf(arc_buf_t *buf, void *tag)
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT3P(buf->b_data, !=, NULL);
 | 
			
		||||
 	ASSERT(HDR_HAS_L1HDR(hdr));
 | 
			
		||||
-	(void) refcount_add(&hdr->b_l1hdr.b_refcnt, arc_onloan_tag);
 | 
			
		||||
+	(void) zfs_refcount_add(&hdr->b_l1hdr.b_refcnt, arc_onloan_tag);
 | 
			
		||||
 	(void) refcount_remove(&hdr->b_l1hdr.b_refcnt, tag);
 | 
			
		||||
 
 | 
			
		||||
 	arc_loaned_bytes_update(arc_buf_size(buf));
 | 
			
		||||
@@ -3533,7 +3533,7 @@ arc_prune_async(int64_t adjust)
 | 
			
		||||
 		if (refcount_count(&ap->p_refcnt) >= 2)
 | 
			
		||||
 			continue;
 | 
			
		||||
 
 | 
			
		||||
-		refcount_add(&ap->p_refcnt, ap->p_pfunc);
 | 
			
		||||
+		zfs_refcount_add(&ap->p_refcnt, ap->p_pfunc);
 | 
			
		||||
 		ap->p_adjust = adjust;
 | 
			
		||||
 		if (taskq_dispatch(arc_prune_taskq, arc_prune_task,
 | 
			
		||||
 		    ap, TQ_SLEEP) == TASKQID_INVALID) {
 | 
			
		||||
@@ -5549,7 +5549,7 @@ arc_add_prune_callback(arc_prune_func_t *func, void *private)
 | 
			
		||||
 	refcount_create(&p->p_refcnt);
 | 
			
		||||
 
 | 
			
		||||
 	mutex_enter(&arc_prune_mtx);
 | 
			
		||||
-	refcount_add(&p->p_refcnt, &arc_prune_list);
 | 
			
		||||
+	zfs_refcount_add(&p->p_refcnt, &arc_prune_list);
 | 
			
		||||
 	list_insert_head(&arc_prune_list, p);
 | 
			
		||||
 	mutex_exit(&arc_prune_mtx);
 | 
			
		||||
 
 | 
			
		||||
@@ -5815,7 +5815,7 @@ arc_release(arc_buf_t *buf, void *tag)
 | 
			
		||||
 		nhdr->b_l1hdr.b_mfu_hits = 0;
 | 
			
		||||
 		nhdr->b_l1hdr.b_mfu_ghost_hits = 0;
 | 
			
		||||
 		nhdr->b_l1hdr.b_l2_hits = 0;
 | 
			
		||||
-		(void) refcount_add(&nhdr->b_l1hdr.b_refcnt, tag);
 | 
			
		||||
+		(void) zfs_refcount_add(&nhdr->b_l1hdr.b_refcnt, tag);
 | 
			
		||||
 		buf->b_hdr = nhdr;
 | 
			
		||||
 
 | 
			
		||||
 		mutex_exit(&buf->b_evict_lock);
 | 
			
		||||
diff --git a/module/zfs/dbuf.c b/module/zfs/dbuf.c
 | 
			
		||||
index 6edb39d6..5101c848 100644
 | 
			
		||||
--- a/module/zfs/dbuf.c
 | 
			
		||||
+++ b/module/zfs/dbuf.c
 | 
			
		||||
@@ -104,7 +104,7 @@ static boolean_t dbuf_evict_thread_exit;
 | 
			
		||||
  * become eligible for arc eviction.
 | 
			
		||||
  */
 | 
			
		||||
 static multilist_t *dbuf_cache;
 | 
			
		||||
-static refcount_t dbuf_cache_size;
 | 
			
		||||
+static zfs_refcount_t dbuf_cache_size;
 | 
			
		||||
 unsigned long  dbuf_cache_max_bytes = 100 * 1024 * 1024;
 | 
			
		||||
 
 | 
			
		||||
 /* Cap the size of the dbuf cache to log2 fraction of arc size. */
 | 
			
		||||
@@ -2384,7 +2384,7 @@ dbuf_create(dnode_t *dn, uint8_t level, uint64_t blkid,
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT(dn->dn_object == DMU_META_DNODE_OBJECT ||
 | 
			
		||||
 	    refcount_count(&dn->dn_holds) > 0);
 | 
			
		||||
-	(void) refcount_add(&dn->dn_holds, db);
 | 
			
		||||
+	(void) zfs_refcount_add(&dn->dn_holds, db);
 | 
			
		||||
 	atomic_inc_32(&dn->dn_dbufs_count);
 | 
			
		||||
 
 | 
			
		||||
 	dprintf_dbuf(db, "db=%p\n", db);
 | 
			
		||||
@@ -2749,7 +2749,7 @@ __dbuf_hold_impl(struct dbuf_hold_impl_data *dh)
 | 
			
		||||
 		(void) refcount_remove_many(&dbuf_cache_size,
 | 
			
		||||
 		    dh->dh_db->db.db_size, dh->dh_db);
 | 
			
		||||
 	}
 | 
			
		||||
-	(void) refcount_add(&dh->dh_db->db_holds, dh->dh_tag);
 | 
			
		||||
+	(void) zfs_refcount_add(&dh->dh_db->db_holds, dh->dh_tag);
 | 
			
		||||
 	DBUF_VERIFY(dh->dh_db);
 | 
			
		||||
 	mutex_exit(&dh->dh_db->db_mtx);
 | 
			
		||||
 
 | 
			
		||||
@@ -2873,7 +2873,7 @@ dbuf_rm_spill(dnode_t *dn, dmu_tx_t *tx)
 | 
			
		||||
 void
 | 
			
		||||
 dbuf_add_ref(dmu_buf_impl_t *db, void *tag)
 | 
			
		||||
 {
 | 
			
		||||
-	int64_t holds = refcount_add(&db->db_holds, tag);
 | 
			
		||||
+	int64_t holds = zfs_refcount_add(&db->db_holds, tag);
 | 
			
		||||
 	VERIFY3S(holds, >, 1);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -2893,7 +2893,7 @@ dbuf_try_add_ref(dmu_buf_t *db_fake, objset_t *os, uint64_t obj, uint64_t blkid,
 | 
			
		||||
 
 | 
			
		||||
 	if (found_db != NULL) {
 | 
			
		||||
 		if (db == found_db && dbuf_refcount(db) > db->db_dirtycnt) {
 | 
			
		||||
-			(void) refcount_add(&db->db_holds, tag);
 | 
			
		||||
+			(void) zfs_refcount_add(&db->db_holds, tag);
 | 
			
		||||
 			result = B_TRUE;
 | 
			
		||||
 		}
 | 
			
		||||
 		mutex_exit(&found_db->db_mtx);
 | 
			
		||||
diff --git a/module/zfs/dmu.c b/module/zfs/dmu.c
 | 
			
		||||
index a09ac4f9..a76cdd9f 100644
 | 
			
		||||
--- a/module/zfs/dmu.c
 | 
			
		||||
+++ b/module/zfs/dmu.c
 | 
			
		||||
@@ -342,7 +342,7 @@ dmu_bonus_hold(objset_t *os, uint64_t object, void *tag, dmu_buf_t **dbp)
 | 
			
		||||
 	db = dn->dn_bonus;
 | 
			
		||||
 
 | 
			
		||||
 	/* as long as the bonus buf is held, the dnode will be held */
 | 
			
		||||
-	if (refcount_add(&db->db_holds, tag) == 1) {
 | 
			
		||||
+	if (zfs_refcount_add(&db->db_holds, tag) == 1) {
 | 
			
		||||
 		VERIFY(dnode_add_ref(dn, db));
 | 
			
		||||
 		atomic_inc_32(&dn->dn_dbufs_count);
 | 
			
		||||
 	}
 | 
			
		||||
diff --git a/module/zfs/dmu_tx.c b/module/zfs/dmu_tx.c
 | 
			
		||||
index 6ebff267..b1508ffa 100644
 | 
			
		||||
--- a/module/zfs/dmu_tx.c
 | 
			
		||||
+++ b/module/zfs/dmu_tx.c
 | 
			
		||||
@@ -114,7 +114,7 @@ dmu_tx_hold_dnode_impl(dmu_tx_t *tx, dnode_t *dn, enum dmu_tx_hold_type type,
 | 
			
		||||
 	dmu_tx_hold_t *txh;
 | 
			
		||||
 
 | 
			
		||||
 	if (dn != NULL) {
 | 
			
		||||
-		(void) refcount_add(&dn->dn_holds, tx);
 | 
			
		||||
+		(void) zfs_refcount_add(&dn->dn_holds, tx);
 | 
			
		||||
 		if (tx->tx_txg != 0) {
 | 
			
		||||
 			mutex_enter(&dn->dn_mtx);
 | 
			
		||||
 			/*
 | 
			
		||||
@@ -124,7 +124,7 @@ dmu_tx_hold_dnode_impl(dmu_tx_t *tx, dnode_t *dn, enum dmu_tx_hold_type type,
 | 
			
		||||
 			 */
 | 
			
		||||
 			ASSERT(dn->dn_assigned_txg == 0);
 | 
			
		||||
 			dn->dn_assigned_txg = tx->tx_txg;
 | 
			
		||||
-			(void) refcount_add(&dn->dn_tx_holds, tx);
 | 
			
		||||
+			(void) zfs_refcount_add(&dn->dn_tx_holds, tx);
 | 
			
		||||
 			mutex_exit(&dn->dn_mtx);
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
@@ -916,7 +916,7 @@ dmu_tx_try_assign(dmu_tx_t *tx, uint64_t txg_how)
 | 
			
		||||
 			if (dn->dn_assigned_txg == 0)
 | 
			
		||||
 				dn->dn_assigned_txg = tx->tx_txg;
 | 
			
		||||
 			ASSERT3U(dn->dn_assigned_txg, ==, tx->tx_txg);
 | 
			
		||||
-			(void) refcount_add(&dn->dn_tx_holds, tx);
 | 
			
		||||
+			(void) zfs_refcount_add(&dn->dn_tx_holds, tx);
 | 
			
		||||
 			mutex_exit(&dn->dn_mtx);
 | 
			
		||||
 		}
 | 
			
		||||
 		towrite += refcount_count(&txh->txh_space_towrite);
 | 
			
		||||
diff --git a/module/zfs/dnode.c b/module/zfs/dnode.c
 | 
			
		||||
index 4a169c49..77d38c36 100644
 | 
			
		||||
--- a/module/zfs/dnode.c
 | 
			
		||||
+++ b/module/zfs/dnode.c
 | 
			
		||||
@@ -1267,7 +1267,7 @@ dnode_hold_impl(objset_t *os, uint64_t object, int flag, int slots,
 | 
			
		||||
 		if ((flag & DNODE_MUST_BE_FREE) && type != DMU_OT_NONE)
 | 
			
		||||
 			return (SET_ERROR(EEXIST));
 | 
			
		||||
 		DNODE_VERIFY(dn);
 | 
			
		||||
-		(void) refcount_add(&dn->dn_holds, tag);
 | 
			
		||||
+		(void) zfs_refcount_add(&dn->dn_holds, tag);
 | 
			
		||||
 		*dnp = dn;
 | 
			
		||||
 		return (0);
 | 
			
		||||
 	}
 | 
			
		||||
@@ -1484,7 +1484,7 @@ dnode_hold_impl(objset_t *os, uint64_t object, int flag, int slots,
 | 
			
		||||
 		return (type == DMU_OT_NONE ? ENOENT : EEXIST);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
-	if (refcount_add(&dn->dn_holds, tag) == 1)
 | 
			
		||||
+	if (zfs_refcount_add(&dn->dn_holds, tag) == 1)
 | 
			
		||||
 		dbuf_add_ref(db, dnh);
 | 
			
		||||
 
 | 
			
		||||
 	mutex_exit(&dn->dn_mtx);
 | 
			
		||||
@@ -1524,7 +1524,7 @@ dnode_add_ref(dnode_t *dn, void *tag)
 | 
			
		||||
 		mutex_exit(&dn->dn_mtx);
 | 
			
		||||
 		return (FALSE);
 | 
			
		||||
 	}
 | 
			
		||||
-	VERIFY(1 < refcount_add(&dn->dn_holds, tag));
 | 
			
		||||
+	VERIFY(1 < zfs_refcount_add(&dn->dn_holds, tag));
 | 
			
		||||
 	mutex_exit(&dn->dn_mtx);
 | 
			
		||||
 	return (TRUE);
 | 
			
		||||
 }
 | 
			
		||||
diff --git a/module/zfs/dsl_dataset.c b/module/zfs/dsl_dataset.c
 | 
			
		||||
index bd03b486..b7562bcd 100644
 | 
			
		||||
--- a/module/zfs/dsl_dataset.c
 | 
			
		||||
+++ b/module/zfs/dsl_dataset.c
 | 
			
		||||
@@ -645,7 +645,7 @@ void
 | 
			
		||||
 dsl_dataset_long_hold(dsl_dataset_t *ds, void *tag)
 | 
			
		||||
 {
 | 
			
		||||
 	ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool));
 | 
			
		||||
-	(void) refcount_add(&ds->ds_longholds, tag);
 | 
			
		||||
+	(void) zfs_refcount_add(&ds->ds_longholds, tag);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
diff --git a/module/zfs/metaslab.c b/module/zfs/metaslab.c
 | 
			
		||||
index ee24850d..40658d51 100644
 | 
			
		||||
--- a/module/zfs/metaslab.c
 | 
			
		||||
+++ b/module/zfs/metaslab.c
 | 
			
		||||
@@ -2663,7 +2663,7 @@ metaslab_group_alloc_increment(spa_t *spa, uint64_t vdev, void *tag, int flags)
 | 
			
		||||
 	if (!mg->mg_class->mc_alloc_throttle_enabled)
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
-	(void) refcount_add(&mg->mg_alloc_queue_depth, tag);
 | 
			
		||||
+	(void) zfs_refcount_add(&mg->mg_alloc_queue_depth, tag);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
@@ -3360,7 +3360,7 @@ metaslab_class_throttle_reserve(metaslab_class_t *mc, int slots, zio_t *zio,
 | 
			
		||||
 		 * them individually when an I/O completes.
 | 
			
		||||
 		 */
 | 
			
		||||
 		for (d = 0; d < slots; d++) {
 | 
			
		||||
-			reserved_slots = refcount_add(&mc->mc_alloc_slots, zio);
 | 
			
		||||
+			reserved_slots = zfs_refcount_add(&mc->mc_alloc_slots, zio);
 | 
			
		||||
 		}
 | 
			
		||||
 		zio->io_flags |= ZIO_FLAG_IO_ALLOCATING;
 | 
			
		||||
 		slot_reserved = B_TRUE;
 | 
			
		||||
diff --git a/module/zfs/refcount.c b/module/zfs/refcount.c
 | 
			
		||||
index a151acea..13f9bb6b 100644
 | 
			
		||||
--- a/module/zfs/refcount.c
 | 
			
		||||
+++ b/module/zfs/refcount.c
 | 
			
		||||
@@ -55,7 +55,7 @@ refcount_fini(void)
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-refcount_create(refcount_t *rc)
 | 
			
		||||
+refcount_create(zfs_refcount_t *rc)
 | 
			
		||||
 {
 | 
			
		||||
 	mutex_init(&rc->rc_mtx, NULL, MUTEX_DEFAULT, NULL);
 | 
			
		||||
 	list_create(&rc->rc_list, sizeof (reference_t),
 | 
			
		||||
@@ -68,21 +68,21 @@ refcount_create(refcount_t *rc)
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-refcount_create_tracked(refcount_t *rc)
 | 
			
		||||
+refcount_create_tracked(zfs_refcount_t *rc)
 | 
			
		||||
 {
 | 
			
		||||
 	refcount_create(rc);
 | 
			
		||||
 	rc->rc_tracked = B_TRUE;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-refcount_create_untracked(refcount_t *rc)
 | 
			
		||||
+refcount_create_untracked(zfs_refcount_t *rc)
 | 
			
		||||
 {
 | 
			
		||||
 	refcount_create(rc);
 | 
			
		||||
 	rc->rc_tracked = B_FALSE;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-refcount_destroy_many(refcount_t *rc, uint64_t number)
 | 
			
		||||
+refcount_destroy_many(zfs_refcount_t *rc, uint64_t number)
 | 
			
		||||
 {
 | 
			
		||||
 	reference_t *ref;
 | 
			
		||||
 
 | 
			
		||||
@@ -103,25 +103,25 @@ refcount_destroy_many(refcount_t *rc, uint64_t number)
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-refcount_destroy(refcount_t *rc)
 | 
			
		||||
+refcount_destroy(zfs_refcount_t *rc)
 | 
			
		||||
 {
 | 
			
		||||
 	refcount_destroy_many(rc, 0);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 int
 | 
			
		||||
-refcount_is_zero(refcount_t *rc)
 | 
			
		||||
+refcount_is_zero(zfs_refcount_t *rc)
 | 
			
		||||
 {
 | 
			
		||||
 	return (rc->rc_count == 0);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 int64_t
 | 
			
		||||
-refcount_count(refcount_t *rc)
 | 
			
		||||
+refcount_count(zfs_refcount_t *rc)
 | 
			
		||||
 {
 | 
			
		||||
 	return (rc->rc_count);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 int64_t
 | 
			
		||||
-refcount_add_many(refcount_t *rc, uint64_t number, void *holder)
 | 
			
		||||
+refcount_add_many(zfs_refcount_t *rc, uint64_t number, void *holder)
 | 
			
		||||
 {
 | 
			
		||||
 	reference_t *ref = NULL;
 | 
			
		||||
 	int64_t count;
 | 
			
		||||
@@ -143,13 +143,13 @@ refcount_add_many(refcount_t *rc, uint64_t number, void *holder)
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 int64_t
 | 
			
		||||
-zfs_refcount_add(refcount_t *rc, void *holder)
 | 
			
		||||
+zfs_refcount_add(zfs_refcount_t *rc, void *holder)
 | 
			
		||||
 {
 | 
			
		||||
 	return (refcount_add_many(rc, 1, holder));
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 int64_t
 | 
			
		||||
-refcount_remove_many(refcount_t *rc, uint64_t number, void *holder)
 | 
			
		||||
+refcount_remove_many(zfs_refcount_t *rc, uint64_t number, void *holder)
 | 
			
		||||
 {
 | 
			
		||||
 	reference_t *ref;
 | 
			
		||||
 	int64_t count;
 | 
			
		||||
@@ -197,13 +197,13 @@ refcount_remove_many(refcount_t *rc, uint64_t number, void *holder)
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 int64_t
 | 
			
		||||
-refcount_remove(refcount_t *rc, void *holder)
 | 
			
		||||
+refcount_remove(zfs_refcount_t *rc, void *holder)
 | 
			
		||||
 {
 | 
			
		||||
 	return (refcount_remove_many(rc, 1, holder));
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-refcount_transfer(refcount_t *dst, refcount_t *src)
 | 
			
		||||
+refcount_transfer(zfs_refcount_t *dst, zfs_refcount_t *src)
 | 
			
		||||
 {
 | 
			
		||||
 	int64_t count, removed_count;
 | 
			
		||||
 	list_t list, removed;
 | 
			
		||||
@@ -234,7 +234,7 @@ refcount_transfer(refcount_t *dst, refcount_t *src)
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-refcount_transfer_ownership(refcount_t *rc, void *current_holder,
 | 
			
		||||
+refcount_transfer_ownership(zfs_refcount_t *rc, void *current_holder,
 | 
			
		||||
     void *new_holder)
 | 
			
		||||
 {
 | 
			
		||||
 	reference_t *ref;
 | 
			
		||||
@@ -264,7 +264,7 @@ refcount_transfer_ownership(refcount_t *rc, void *current_holder,
 | 
			
		||||
  * might be held.
 | 
			
		||||
  */
 | 
			
		||||
 boolean_t
 | 
			
		||||
-refcount_held(refcount_t *rc, void *holder)
 | 
			
		||||
+refcount_held(zfs_refcount_t *rc, void *holder)
 | 
			
		||||
 {
 | 
			
		||||
 	reference_t *ref;
 | 
			
		||||
 
 | 
			
		||||
@@ -292,7 +292,7 @@ refcount_held(refcount_t *rc, void *holder)
 | 
			
		||||
  * since the reference might not be held.
 | 
			
		||||
  */
 | 
			
		||||
 boolean_t
 | 
			
		||||
-refcount_not_held(refcount_t *rc, void *holder)
 | 
			
		||||
+refcount_not_held(zfs_refcount_t *rc, void *holder)
 | 
			
		||||
 {
 | 
			
		||||
 	reference_t *ref;
 | 
			
		||||
 
 | 
			
		||||
diff --git a/module/zfs/rrwlock.c b/module/zfs/rrwlock.c
 | 
			
		||||
index 704f7606..effff330 100644
 | 
			
		||||
--- a/module/zfs/rrwlock.c
 | 
			
		||||
+++ b/module/zfs/rrwlock.c
 | 
			
		||||
@@ -183,9 +183,9 @@ rrw_enter_read_impl(rrwlock_t *rrl, boolean_t prio, void *tag)
 | 
			
		||||
 	if (rrl->rr_writer_wanted || rrl->rr_track_all) {
 | 
			
		||||
 		/* may or may not be a re-entrant enter */
 | 
			
		||||
 		rrn_add(rrl, tag);
 | 
			
		||||
-		(void) refcount_add(&rrl->rr_linked_rcount, tag);
 | 
			
		||||
+		(void) zfs_refcount_add(&rrl->rr_linked_rcount, tag);
 | 
			
		||||
 	} else {
 | 
			
		||||
-		(void) refcount_add(&rrl->rr_anon_rcount, tag);
 | 
			
		||||
+		(void) zfs_refcount_add(&rrl->rr_anon_rcount, tag);
 | 
			
		||||
 	}
 | 
			
		||||
 	ASSERT(rrl->rr_writer == NULL);
 | 
			
		||||
 	mutex_exit(&rrl->rr_lock);
 | 
			
		||||
diff --git a/module/zfs/sa.c b/module/zfs/sa.c
 | 
			
		||||
index 1fb1a8b5..df4f6fd8 100644
 | 
			
		||||
--- a/module/zfs/sa.c
 | 
			
		||||
+++ b/module/zfs/sa.c
 | 
			
		||||
@@ -1337,7 +1337,7 @@ sa_idx_tab_hold(objset_t *os, sa_idx_tab_t *idx_tab)
 | 
			
		||||
 	ASSERTV(sa_os_t *sa = os->os_sa);
 | 
			
		||||
 
 | 
			
		||||
 	ASSERT(MUTEX_HELD(&sa->sa_lock));
 | 
			
		||||
-	(void) refcount_add(&idx_tab->sa_refcount, NULL);
 | 
			
		||||
+	(void) zfs_refcount_add(&idx_tab->sa_refcount, NULL);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
diff --git a/module/zfs/spa_misc.c b/module/zfs/spa_misc.c
 | 
			
		||||
index cc1c641d..f6c9b40b 100644
 | 
			
		||||
--- a/module/zfs/spa_misc.c
 | 
			
		||||
+++ b/module/zfs/spa_misc.c
 | 
			
		||||
@@ -80,7 +80,7 @@
 | 
			
		||||
  *	definition they must have an existing reference, and will never need
 | 
			
		||||
  *	to lookup a spa_t by name.
 | 
			
		||||
  *
 | 
			
		||||
- * spa_refcount (per-spa refcount_t protected by mutex)
 | 
			
		||||
+ * spa_refcount (per-spa zfs_refcount_t protected by mutex)
 | 
			
		||||
  *
 | 
			
		||||
  *	This reference count keep track of any active users of the spa_t.  The
 | 
			
		||||
  *	spa_t cannot be destroyed or freed while this is non-zero.  Internally,
 | 
			
		||||
@@ -414,7 +414,7 @@ spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw)
 | 
			
		||||
 			}
 | 
			
		||||
 			scl->scl_writer = curthread;
 | 
			
		||||
 		}
 | 
			
		||||
-		(void) refcount_add(&scl->scl_count, tag);
 | 
			
		||||
+		(void) zfs_refcount_add(&scl->scl_count, tag);
 | 
			
		||||
 		mutex_exit(&scl->scl_lock);
 | 
			
		||||
 	}
 | 
			
		||||
 	return (1);
 | 
			
		||||
@@ -448,7 +448,7 @@ spa_config_enter(spa_t *spa, int locks, void *tag, krw_t rw)
 | 
			
		||||
 			}
 | 
			
		||||
 			scl->scl_writer = curthread;
 | 
			
		||||
 		}
 | 
			
		||||
-		(void) refcount_add(&scl->scl_count, tag);
 | 
			
		||||
+		(void) zfs_refcount_add(&scl->scl_count, tag);
 | 
			
		||||
 		mutex_exit(&scl->scl_lock);
 | 
			
		||||
 	}
 | 
			
		||||
 	ASSERT(wlocks_held <= locks);
 | 
			
		||||
@@ -768,7 +768,7 @@ spa_open_ref(spa_t *spa, void *tag)
 | 
			
		||||
 {
 | 
			
		||||
 	ASSERT(refcount_count(&spa->spa_refcount) >= spa->spa_minref ||
 | 
			
		||||
 	    MUTEX_HELD(&spa_namespace_lock));
 | 
			
		||||
-	(void) refcount_add(&spa->spa_refcount, tag);
 | 
			
		||||
+	(void) zfs_refcount_add(&spa->spa_refcount, tag);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
diff --git a/module/zfs/zfs_ctldir.c b/module/zfs/zfs_ctldir.c
 | 
			
		||||
index 0ab5b4f0..de3c5a41 100644
 | 
			
		||||
--- a/module/zfs/zfs_ctldir.c
 | 
			
		||||
+++ b/module/zfs/zfs_ctldir.c
 | 
			
		||||
@@ -120,7 +120,7 @@ typedef struct {
 | 
			
		||||
 	taskqid_t	se_taskqid;	/* scheduled unmount taskqid */
 | 
			
		||||
 	avl_node_t	se_node_name;	/* zfs_snapshots_by_name link */
 | 
			
		||||
 	avl_node_t	se_node_objsetid; /* zfs_snapshots_by_objsetid link */
 | 
			
		||||
-	refcount_t	se_refcount;	/* reference count */
 | 
			
		||||
+	zfs_refcount_t	se_refcount;	/* reference count */
 | 
			
		||||
 } zfs_snapentry_t;
 | 
			
		||||
 
 | 
			
		||||
 static void zfsctl_snapshot_unmount_delay_impl(zfs_snapentry_t *se, int delay);
 | 
			
		||||
@@ -169,7 +169,7 @@ zfsctl_snapshot_free(zfs_snapentry_t *se)
 | 
			
		||||
 static void
 | 
			
		||||
 zfsctl_snapshot_hold(zfs_snapentry_t *se)
 | 
			
		||||
 {
 | 
			
		||||
-	refcount_add(&se->se_refcount, NULL);
 | 
			
		||||
+	zfs_refcount_add(&se->se_refcount, NULL);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -192,7 +192,7 @@ static void
 | 
			
		||||
 zfsctl_snapshot_add(zfs_snapentry_t *se)
 | 
			
		||||
 {
 | 
			
		||||
 	ASSERT(RW_WRITE_HELD(&zfs_snapshot_lock));
 | 
			
		||||
-	refcount_add(&se->se_refcount, NULL);
 | 
			
		||||
+	zfs_refcount_add(&se->se_refcount, NULL);
 | 
			
		||||
 	avl_add(&zfs_snapshots_by_name, se);
 | 
			
		||||
 	avl_add(&zfs_snapshots_by_objsetid, se);
 | 
			
		||||
 }
 | 
			
		||||
@@ -269,7 +269,7 @@ zfsctl_snapshot_find_by_name(char *snapname)
 | 
			
		||||
 	search.se_name = snapname;
 | 
			
		||||
 	se = avl_find(&zfs_snapshots_by_name, &search, NULL);
 | 
			
		||||
 	if (se)
 | 
			
		||||
-		refcount_add(&se->se_refcount, NULL);
 | 
			
		||||
+		zfs_refcount_add(&se->se_refcount, NULL);
 | 
			
		||||
 
 | 
			
		||||
 	return (se);
 | 
			
		||||
 }
 | 
			
		||||
@@ -290,7 +290,7 @@ zfsctl_snapshot_find_by_objsetid(spa_t *spa, uint64_t objsetid)
 | 
			
		||||
 	search.se_objsetid = objsetid;
 | 
			
		||||
 	se = avl_find(&zfs_snapshots_by_objsetid, &search, NULL);
 | 
			
		||||
 	if (se)
 | 
			
		||||
-		refcount_add(&se->se_refcount, NULL);
 | 
			
		||||
+		zfs_refcount_add(&se->se_refcount, NULL);
 | 
			
		||||
 
 | 
			
		||||
 	return (se);
 | 
			
		||||
 }
 | 
			
		||||
diff --git a/module/zfs/zfs_znode.c b/module/zfs/zfs_znode.c
 | 
			
		||||
index e222c791..0ca10f82 100644
 | 
			
		||||
--- a/module/zfs/zfs_znode.c
 | 
			
		||||
+++ b/module/zfs/zfs_znode.c
 | 
			
		||||
@@ -272,7 +272,7 @@ zfs_znode_hold_enter(zfsvfs_t *zfsvfs, uint64_t obj)
 | 
			
		||||
 		ASSERT3U(zh->zh_obj, ==, obj);
 | 
			
		||||
 		found = B_TRUE;
 | 
			
		||||
 	}
 | 
			
		||||
-	refcount_add(&zh->zh_refcount, NULL);
 | 
			
		||||
+	zfs_refcount_add(&zh->zh_refcount, NULL);
 | 
			
		||||
 	mutex_exit(&zfsvfs->z_hold_locks[i]);
 | 
			
		||||
 
 | 
			
		||||
 	if (found == B_TRUE)
 | 
			
		||||
							
								
								
									
										2527
									
								
								zfs-patches/0014-Prefix-all-refcount-functions-with-zfs_.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2527
									
								
								zfs-patches/0014-Prefix-all-refcount-functions-with-zfs_.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										29
									
								
								zfs-patches/0015-Fix-arc_release-refcount.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								zfs-patches/0015-Fix-arc_release-refcount.patch
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Date: Mon, 8 Oct 2018 14:59:34 -0700
 | 
			
		||||
Subject: [PATCH] Fix arc_release() refcount
 | 
			
		||||
 | 
			
		||||
Update arc_release to use arc_buf_size().  This hunk was accidentally
 | 
			
		||||
dropped when porting compressed send/recv, 2aa34383b.
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
 | 
			
		||||
Signed-off-by: Tom Caputi <tcaputi@datto.com>
 | 
			
		||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Closes #8000
 | 
			
		||||
---
 | 
			
		||||
 module/zfs/arc.c | 2 +-
 | 
			
		||||
 1 file changed, 1 insertion(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
 | 
			
		||||
index 32ac0837..a7fb2429 100644
 | 
			
		||||
--- a/module/zfs/arc.c
 | 
			
		||||
+++ b/module/zfs/arc.c
 | 
			
		||||
@@ -5831,7 +5831,7 @@ arc_release(arc_buf_t *buf, void *tag)
 | 
			
		||||
 
 | 
			
		||||
 		mutex_exit(&buf->b_evict_lock);
 | 
			
		||||
 		(void) zfs_refcount_add_many(&arc_anon->arcs_size,
 | 
			
		||||
-		    HDR_GET_LSIZE(nhdr), buf);
 | 
			
		||||
+		    arc_buf_size(buf), buf);
 | 
			
		||||
 	} else {
 | 
			
		||||
 		mutex_exit(&buf->b_evict_lock);
 | 
			
		||||
 		ASSERT(zfs_refcount_count(&hdr->b_l1hdr.b_refcnt) == 1);
 | 
			
		||||
							
								
								
									
										59
									
								
								zfs-patches/0016-Allow-use-of-pool-GUID-as-root-pool.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								zfs-patches/0016-Allow-use-of-pool-GUID-as-root-pool.patch
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,59 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: George Melikov <mail@gmelikov.ru>
 | 
			
		||||
Date: Wed, 24 Oct 2018 06:06:40 +0300
 | 
			
		||||
Subject: [PATCH] Allow use of pool GUID as root pool
 | 
			
		||||
MIME-Version: 1.0
 | 
			
		||||
Content-Type: text/plain; charset=UTF-8
 | 
			
		||||
Content-Transfer-Encoding: 8bit
 | 
			
		||||
 | 
			
		||||
It's helpful if there are pools with same names,
 | 
			
		||||
but you need to use only one of them.
 | 
			
		||||
 | 
			
		||||
Main case is twin servers, meanwhile some software
 | 
			
		||||
requires the same name of pools (e.g. Proxmox).
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Kash Pande <kash@tripleback.net>
 | 
			
		||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Signed-off-by: George Melikov <mail@gmelikov.ru>
 | 
			
		||||
Signed-off-by: Igor ‘guardian’ Lidin of Moscow, Russia
 | 
			
		||||
Closes #8052
 | 
			
		||||
---
 | 
			
		||||
 contrib/initramfs/scripts/zfs | 11 ++++++++++-
 | 
			
		||||
 1 file changed, 10 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/contrib/initramfs/scripts/zfs b/contrib/initramfs/scripts/zfs
 | 
			
		||||
index 86329e76..dacd71d2 100644
 | 
			
		||||
--- a/contrib/initramfs/scripts/zfs
 | 
			
		||||
+++ b/contrib/initramfs/scripts/zfs
 | 
			
		||||
@@ -193,7 +193,7 @@ import_pool()
 | 
			
		||||
 
 | 
			
		||||
 	# Verify that the pool isn't already imported
 | 
			
		||||
 	# Make as sure as we can to not require '-f' to import.
 | 
			
		||||
-	"${ZPOOL}" status "$pool" > /dev/null 2>&1 && return 0
 | 
			
		||||
+	"${ZPOOL}" get name,guid -o value -H 2>/dev/null | grep -Fxq "$pool" && return 0
 | 
			
		||||
 
 | 
			
		||||
 	# For backwards compatibility, make sure that ZPOOL_IMPORT_PATH is set
 | 
			
		||||
 	# to something we can use later with the real import(s). We want to
 | 
			
		||||
@@ -772,6 +772,7 @@ mountroot()
 | 
			
		||||
 	#	root=zfs:<pool>/<dataset>	(uses this for rpool - first part, without 'zfs:')
 | 
			
		||||
 	#
 | 
			
		||||
 	# Option <dataset> could also be <snapshot>
 | 
			
		||||
+	# Option <pool> could also be <guid>
 | 
			
		||||
 
 | 
			
		||||
 	# ------------
 | 
			
		||||
 	# Support force option
 | 
			
		||||
@@ -889,6 +890,14 @@ mountroot()
 | 
			
		||||
 		/bin/sh
 | 
			
		||||
 	fi
 | 
			
		||||
 
 | 
			
		||||
+	# In case the pool was specified as guid, resolve guid to name
 | 
			
		||||
+	pool="$("${ZPOOL}" get name,guid -o name,value -H | \
 | 
			
		||||
+	    awk -v pool="${ZFS_RPOOL}" '$2 == pool { print $1 }')"
 | 
			
		||||
+	if [ -n "$pool" ]; then
 | 
			
		||||
+		ZFS_BOOTFS="${pool}/${ZFS_BOOTFS#*/}"
 | 
			
		||||
+		ZFS_RPOOL="${pool}"
 | 
			
		||||
+	fi
 | 
			
		||||
+
 | 
			
		||||
 	# Set elevator=noop on the root pool's vdevs' disks.  ZFS already
 | 
			
		||||
 	# does this for wholedisk vdevs (for all pools), so this is only
 | 
			
		||||
 	# important for partitions.
 | 
			
		||||
							
								
								
									
										67
									
								
								zfs-patches/0017-ZTS-Update-O_TMPFILE-support-check.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								zfs-patches/0017-ZTS-Update-O_TMPFILE-support-check.patch
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,67 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Date: Mon, 14 May 2018 20:36:30 -0700
 | 
			
		||||
Subject: [PATCH] ZTS: Update O_TMPFILE support check
 | 
			
		||||
 | 
			
		||||
In CentOS 7.5 the kernel provided a compatibility wrapper to support
 | 
			
		||||
O_TMPFILE.  This results in the test setup script correctly detecting
 | 
			
		||||
kernel support.  But the ZFS module was built without O_TMPFILE
 | 
			
		||||
support due to the non-standard CentOS kernel interface.
 | 
			
		||||
 | 
			
		||||
Handle this case by updating the setup check to fail either when
 | 
			
		||||
the kernel or the ZFS module fail to provide support.  The reason
 | 
			
		||||
will be clearly logged in the test results.
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Chunwei Chen <tuxoko@gmail.com>
 | 
			
		||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Closes #7528
 | 
			
		||||
---
 | 
			
		||||
 tests/zfs-tests/tests/functional/tmpfile/setup.ksh      | 11 +++++++----
 | 
			
		||||
 tests/zfs-tests/tests/functional/tmpfile/tmpfile_test.c | 11 ++++++-----
 | 
			
		||||
 2 files changed, 13 insertions(+), 9 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/tests/zfs-tests/tests/functional/tmpfile/setup.ksh b/tests/zfs-tests/tests/functional/tmpfile/setup.ksh
 | 
			
		||||
index 243a5b77..bc00a2a2 100755
 | 
			
		||||
--- a/tests/zfs-tests/tests/functional/tmpfile/setup.ksh
 | 
			
		||||
+++ b/tests/zfs-tests/tests/functional/tmpfile/setup.ksh
 | 
			
		||||
@@ -31,9 +31,12 @@
 | 
			
		||||
 
 | 
			
		||||
 . $STF_SUITE/include/libtest.shlib
 | 
			
		||||
 
 | 
			
		||||
-if ! $STF_SUITE/tests/functional/tmpfile/tmpfile_test /tmp; then
 | 
			
		||||
-	log_unsupported "The kernel doesn't support O_TMPFILE."
 | 
			
		||||
+DISK=${DISKS%% *}
 | 
			
		||||
+default_setup_noexit $DISK
 | 
			
		||||
+
 | 
			
		||||
+if ! $STF_SUITE/tests/functional/tmpfile/tmpfile_test $TESTDIR; then
 | 
			
		||||
+	default_cleanup_noexit
 | 
			
		||||
+	log_unsupported "The kernel/filesystem doesn't support O_TMPFILE"
 | 
			
		||||
 fi
 | 
			
		||||
 
 | 
			
		||||
-DISK=${DISKS%% *}
 | 
			
		||||
-default_setup $DISK
 | 
			
		||||
+log_pass
 | 
			
		||||
diff --git a/tests/zfs-tests/tests/functional/tmpfile/tmpfile_test.c b/tests/zfs-tests/tests/functional/tmpfile/tmpfile_test.c
 | 
			
		||||
index 5fb67b47..91527ac5 100644
 | 
			
		||||
--- a/tests/zfs-tests/tests/functional/tmpfile/tmpfile_test.c
 | 
			
		||||
+++ b/tests/zfs-tests/tests/functional/tmpfile/tmpfile_test.c
 | 
			
		||||
@@ -36,13 +36,14 @@ main(int argc, char *argv[])
 | 
			
		||||
 
 | 
			
		||||
 	fd = open(argv[1], O_TMPFILE | O_WRONLY, 0666);
 | 
			
		||||
 	if (fd < 0) {
 | 
			
		||||
-		/*
 | 
			
		||||
-		 * Only fail on EISDIR. If we get EOPNOTSUPP, that means
 | 
			
		||||
-		 * kernel support O_TMPFILE, but the path at argv[1] doesn't.
 | 
			
		||||
-		 */
 | 
			
		||||
 		if (errno == EISDIR) {
 | 
			
		||||
-			fprintf(stderr, "kernel doesn't support O_TMPFILE\n");
 | 
			
		||||
+			fprintf(stderr,
 | 
			
		||||
+			    "The kernel doesn't support O_TMPFILE\n");
 | 
			
		||||
 			return (1);
 | 
			
		||||
+		} else if (errno == EOPNOTSUPP) {
 | 
			
		||||
+			fprintf(stderr,
 | 
			
		||||
+			    "The filesystem doesn't support O_TMPFILE\n");
 | 
			
		||||
+			return (2);
 | 
			
		||||
 		}
 | 
			
		||||
 		perror("open");
 | 
			
		||||
 	} else {
 | 
			
		||||
@ -0,0 +1,35 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Date: Wed, 24 Oct 2018 23:26:08 -0700
 | 
			
		||||
Subject: [PATCH] Fix flake8 "invalid escape sequence 'x'" warning
 | 
			
		||||
 | 
			
		||||
From, https://lintlyci.github.io/Flake8Rules/rules/W605.html
 | 
			
		||||
 | 
			
		||||
As of Python 3.6, a backslash-character pair that is not a valid
 | 
			
		||||
escape sequence now generates a DeprecationWarning. Although this
 | 
			
		||||
will eventually become a SyntaxError, that will not be for several
 | 
			
		||||
Python releases.
 | 
			
		||||
 | 
			
		||||
Note 'float_pobj' was simply removed from arcstat.py since it
 | 
			
		||||
was entirely unused.
 | 
			
		||||
 | 
			
		||||
Reviewed-by: John Kennedy <john.kennedy@delphix.com>
 | 
			
		||||
Reviewed-by: Richard Elling <Richard.Elling@RichardElling.com>
 | 
			
		||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Closes #8056
 | 
			
		||||
---
 | 
			
		||||
 cmd/arcstat/arcstat.py | 1 -
 | 
			
		||||
 1 file changed, 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/cmd/arcstat/arcstat.py b/cmd/arcstat/arcstat.py
 | 
			
		||||
index b52a8c29..d7d3e9b7 100755
 | 
			
		||||
--- a/cmd/arcstat/arcstat.py
 | 
			
		||||
+++ b/cmd/arcstat/arcstat.py
 | 
			
		||||
@@ -112,7 +112,6 @@ cur = {}
 | 
			
		||||
 d = {}
 | 
			
		||||
 out = None
 | 
			
		||||
 kstat = None
 | 
			
		||||
-float_pobj = re.compile("^[0-9]+(\.[0-9]+)?$")
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
 def detailed_usage():
 | 
			
		||||
@ -0,0 +1,51 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Tony Hutter <hutter2@llnl.gov>
 | 
			
		||||
Date: Wed, 7 Nov 2018 15:48:24 -0800
 | 
			
		||||
Subject: [PATCH] Add BuildRequires gcc, make, elfutils-libelf-devel
 | 
			
		||||
 | 
			
		||||
This adds a BuildRequires for gcc, make, and elfutils-libelf-devel
 | 
			
		||||
into our spec files.  gcc has been a packaging requirement for
 | 
			
		||||
awhile now:
 | 
			
		||||
 | 
			
		||||
https://fedoraproject.org/wiki/Packaging:C_and_C%2B%2B
 | 
			
		||||
 | 
			
		||||
These additional BuildRequires allow us to mock build in
 | 
			
		||||
Fedora 29.
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Neal Gompa <ngompa@datto.com>
 | 
			
		||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
 | 
			
		||||
Signed-off-by:  Tony Hutter <hutter2@llnl.gov>
 | 
			
		||||
Closes #8095
 | 
			
		||||
Closes #8102
 | 
			
		||||
---
 | 
			
		||||
 rpm/generic/zfs-kmod.spec.in | 4 ++++
 | 
			
		||||
 rpm/generic/zfs.spec.in      | 1 +
 | 
			
		||||
 2 files changed, 5 insertions(+)
 | 
			
		||||
 | 
			
		||||
diff --git a/rpm/generic/zfs-kmod.spec.in b/rpm/generic/zfs-kmod.spec.in
 | 
			
		||||
index d4746f5b..ecf14ece 100644
 | 
			
		||||
--- a/rpm/generic/zfs-kmod.spec.in
 | 
			
		||||
+++ b/rpm/generic/zfs-kmod.spec.in
 | 
			
		||||
@@ -52,6 +52,10 @@ URL:            http://zfsonlinux.org/
 | 
			
		||||
 Source0:        %{module}-%{version}.tar.gz
 | 
			
		||||
 Source10:       kmodtool
 | 
			
		||||
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id} -u -n)
 | 
			
		||||
+%if 0%{?rhel}%{?fedora}
 | 
			
		||||
+BuildRequires:  gcc, make
 | 
			
		||||
+BuildRequires:  elfutils-libelf-devel
 | 
			
		||||
+%endif
 | 
			
		||||
 
 | 
			
		||||
 # The developments headers will conflict with the dkms packages.
 | 
			
		||||
 Conflicts:      %{module}-dkms
 | 
			
		||||
diff --git a/rpm/generic/zfs.spec.in b/rpm/generic/zfs.spec.in
 | 
			
		||||
index fa6f1571..c1b8f2c8 100644
 | 
			
		||||
--- a/rpm/generic/zfs.spec.in
 | 
			
		||||
+++ b/rpm/generic/zfs.spec.in
 | 
			
		||||
@@ -91,6 +91,7 @@ Provides:       %{name}-kmod-common = %{version}
 | 
			
		||||
 Conflicts:      zfs-fuse
 | 
			
		||||
 
 | 
			
		||||
 %if 0%{?rhel}%{?fedora}%{?suse_version}
 | 
			
		||||
+BuildRequires:  gcc, make
 | 
			
		||||
 BuildRequires:  zlib-devel
 | 
			
		||||
 BuildRequires:  libuuid-devel
 | 
			
		||||
 BuildRequires:  libblkid-devel
 | 
			
		||||
							
								
								
									
										55
									
								
								zfs-patches/0020-Tag-zfs-0.7.12.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								zfs-patches/0020-Tag-zfs-0.7.12.patch
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Tony Hutter <hutter2@llnl.gov>
 | 
			
		||||
Date: Thu, 8 Nov 2018 14:38:37 -0800
 | 
			
		||||
Subject: [PATCH] Tag zfs-0.7.12
 | 
			
		||||
 | 
			
		||||
META file and changelog updated.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
 | 
			
		||||
---
 | 
			
		||||
 META                         | 2 +-
 | 
			
		||||
 rpm/generic/zfs-kmod.spec.in | 3 +++
 | 
			
		||||
 rpm/generic/zfs.spec.in      | 3 +++
 | 
			
		||||
 3 files changed, 7 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/META b/META
 | 
			
		||||
index 4b0cdb9c..8631f885 100644
 | 
			
		||||
--- a/META
 | 
			
		||||
+++ b/META
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
 Meta:         1
 | 
			
		||||
 Name:         zfs
 | 
			
		||||
 Branch:       1.0
 | 
			
		||||
-Version:      0.7.11
 | 
			
		||||
+Version:      0.7.12
 | 
			
		||||
 Release:      1
 | 
			
		||||
 Release-Tags: relext
 | 
			
		||||
 License:      CDDL
 | 
			
		||||
diff --git a/rpm/generic/zfs-kmod.spec.in b/rpm/generic/zfs-kmod.spec.in
 | 
			
		||||
index ecf14ece..3b97e91d 100644
 | 
			
		||||
--- a/rpm/generic/zfs-kmod.spec.in
 | 
			
		||||
+++ b/rpm/generic/zfs-kmod.spec.in
 | 
			
		||||
@@ -195,6 +195,9 @@ chmod u+x ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/*/*/*
 | 
			
		||||
 rm -rf $RPM_BUILD_ROOT
 | 
			
		||||
 
 | 
			
		||||
 %changelog
 | 
			
		||||
+* Thu Nov 08 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.12-1
 | 
			
		||||
+- Released 0.7.12-1, detailed release notes are available at:
 | 
			
		||||
+- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.12
 | 
			
		||||
 * Thu Sep 13 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.11-1
 | 
			
		||||
 - Released 0.7.11-1, detailed release notes are available at:
 | 
			
		||||
 - https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.11
 | 
			
		||||
diff --git a/rpm/generic/zfs.spec.in b/rpm/generic/zfs.spec.in
 | 
			
		||||
index c1b8f2c8..f28793a8 100644
 | 
			
		||||
--- a/rpm/generic/zfs.spec.in
 | 
			
		||||
+++ b/rpm/generic/zfs.spec.in
 | 
			
		||||
@@ -372,6 +372,9 @@ systemctl --system daemon-reload >/dev/null || true
 | 
			
		||||
 %endif
 | 
			
		||||
 
 | 
			
		||||
 %changelog
 | 
			
		||||
+* Thu Nov 08 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.12-1
 | 
			
		||||
+- Released 0.7.12-1, detailed release notes are available at:
 | 
			
		||||
+- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.12
 | 
			
		||||
 * Thu Sep 13 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.11-1
 | 
			
		||||
 - Released 0.7.11-1, detailed release notes are available at:
 | 
			
		||||
 - https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.11
 | 
			
		||||
@ -1,9 +1,20 @@
 | 
			
		||||
0001-remove-DKMS-modules-and-dracut-build.patch
 | 
			
		||||
0002-import-with-d-dev-disk-by-id-in-scan-service.patch
 | 
			
		||||
0003-always-load-ZFS-module-on-boot.patch
 | 
			
		||||
0004-Fix-deadlock-between-zfs-umount-snapentry_expire.patch
 | 
			
		||||
0005-Fix-race-in-dnode_check_slots_free.patch
 | 
			
		||||
0006-Reduce-taskq-and-context-switch-cost-of-zio-pipe.patch
 | 
			
		||||
0004-Add-Breaks-Replaces-to-zfs-initramfs.patch
 | 
			
		||||
0005-Revert-Install-init-scripts-to-support-non-systemd-s.patch
 | 
			
		||||
0006-Fix-deadlock-between-zfs-umount-snapentry_expire.patch
 | 
			
		||||
0007-deadlock-between-mm_sem-and-tx-assign-in-zfs_write-a.patch
 | 
			
		||||
0008-Add-Breaks-Replaces-to-zfs-initramfs.patch
 | 
			
		||||
0009-Revert-Install-init-scripts-to-support-non-systemd-s.patch
 | 
			
		||||
0008-Fix-race-in-dnode_check_slots_free.patch
 | 
			
		||||
0009-Reduce-taskq-and-context-switch-cost-of-zio-pipe.patch
 | 
			
		||||
0010-Skip-import-activity-test-in-more-zdb-code-paths.patch
 | 
			
		||||
0011-Fix-statfs-2-for-32-bit-user-space.patch
 | 
			
		||||
0012-Zpool-iostat-remove-latency-queue-scaling.patch
 | 
			
		||||
0013-Linux-4.19-rc3-compat-Remove-refcount_t-compat.patch
 | 
			
		||||
0014-Prefix-all-refcount-functions-with-zfs_.patch
 | 
			
		||||
0015-Fix-arc_release-refcount.patch
 | 
			
		||||
0016-Allow-use-of-pool-GUID-as-root-pool.patch
 | 
			
		||||
0017-ZTS-Update-O_TMPFILE-support-check.patch
 | 
			
		||||
0018-Fix-flake8-invalid-escape-sequence-x-warning.patch
 | 
			
		||||
0019-Add-BuildRequires-gcc-make-elfutils-libelf-devel.patch
 | 
			
		||||
0020-Tag-zfs-0.7.12.patch
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user