summaryrefslogtreecommitdiff
path: root/sys-fs/zfs-kmod/files/2.1.10-Revert-ZFS_IOC_COUNT_FILLED-does-unnecessary-txg_wai.patch
blob: 150d1b5145d968d44ca928b72b111758d9b36f2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
From ac6b8f40981cb9328c22a3485e1a4b060ea89b1e Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Sun, 16 Apr 2023 04:49:04 +0100
Subject: [PATCH] Revert "ZFS_IOC_COUNT_FILLED does unnecessary
 txg_wait_synced()"

This reverts commit 4b3133e671b958fa2c915a4faf57812820124a7b.

See #14753 - possible corruption again, very similar symptoms to the
nightmare that was #11900 and same area of code.

We can safely revert it as it's an optimisation rather than a bugfix
in itself.

Bug: https://github.com/openzfs/zfs/issues/14753
Bug: https://github.com/openzfs/zfs/issues/11900
Signed-off-by: Sam James <sam@gentoo.org>
--- a/module/zfs/dnode.c
+++ b/module/zfs/dnode.c
@@ -1773,29 +1773,20 @@ dnode_try_claim(objset_t *os, uint64_t object, int slots)
 }
 
 /*
- * Checks if the dnode might contain any uncommitted changes to data blocks.
- * Dirty metadata (e.g. bonus buffer) does not count.
+ * Checks if the dnode contains any uncommitted dirty records.
  */
 boolean_t
 dnode_is_dirty(dnode_t *dn)
 {
 	mutex_enter(&dn->dn_mtx);
+
 	for (int i = 0; i < TXG_SIZE; i++) {
-		list_t *list = &dn->dn_dirty_records[i];
-		for (dbuf_dirty_record_t *dr = list_head(list);
-		    dr != NULL; dr = list_next(list, dr)) {
-			if (dr->dr_dbuf == NULL ||
-			    (dr->dr_dbuf->db_blkid != DMU_BONUS_BLKID &&
-			    dr->dr_dbuf->db_blkid != DMU_SPILL_BLKID)) {
-				mutex_exit(&dn->dn_mtx);
-				return (B_TRUE);
-			}
-		}
-		if (dn->dn_free_ranges[i] != NULL) {
+		if (multilist_link_active(&dn->dn_dirty_link[i])) {
 			mutex_exit(&dn->dn_mtx);
 			return (B_TRUE);
 		}
 	}
+
 	mutex_exit(&dn->dn_mtx);
 
 	return (B_FALSE);
@@ -2667,9 +2658,7 @@ dnode_next_offset(dnode_t *dn, int flags, uint64_t *offset,
 		rw_enter(&dn->dn_struct_rwlock, RW_READER);
 
 	if (dn->dn_phys->dn_nlevels == 0) {
-		if (!(flags & DNODE_FIND_HOLE)) {
-			error = SET_ERROR(ESRCH);
-		}
+		error = SET_ERROR(ESRCH);
 		goto out;
 	}
 
-- 
2.40.0