Skip to content

Commit

Permalink
zfs: Revert "ZFS_IOC_COUNT_FILLED does unnecessary txg_wait_synced()"
Browse files Browse the repository at this point in the history
This reverts commit 5198511.

It results in data corruption, see:
openzfs/zfs#14753

Sponsored by:	Rubicon Communications, LLC ("Netgate")
  • Loading branch information
mjguzik committed Apr 15, 2023
1 parent 46ac8f2 commit 63ee747
Showing 1 changed file with 5 additions and 16 deletions.
21 changes: 5 additions & 16 deletions sys/contrib/openzfs/module/zfs/dnode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 63ee747

Please sign in to comment.