aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Hutter <[email protected]>2023-04-18 08:41:52 -0700
committerGitHub <[email protected]>2023-04-18 08:41:52 -0700
commitaccfdeb948dab87a9576084a582f5bfeda0bd2f2 (patch)
tree15f4fcc7d425a586bbc3a049d0d8089846cf28b0
parent8ed62440eff5a3ea93b0a9b6f0b7e5e7290b667a (diff)
Revert "ZFS_IOC_COUNT_FILLED does unnecessary txg_wait_synced()"
This reverts commit 4b3133e671b958fa2c915a4faf57812820124a7b. Users identified this commit as a possible source of data corruption: https://github.com/openzfs/zfs/issues/14753 Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Tony Hutter <[email protected]> Issue #14753 Closes #14761
-rw-r--r--module/zfs/dnode.c21
1 files changed, 5 insertions, 16 deletions
diff --git a/module/zfs/dnode.c b/module/zfs/dnode.c
index 367bfaa80..d15268cd7 100644
--- a/module/zfs/dnode.c
+++ b/module/zfs/dnode.c
@@ -1764,29 +1764,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);
@@ -2650,9 +2641,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;
}