diff --git a/sys-fs/zfs-kmod/files/2.1.10-Revert-ZFS_IOC_COUNT_FILLED-does-unnecessary-txg_wai.patch b/sys-fs/zfs-kmod/files/2.1.10-Revert-ZFS_IOC_COUNT_FILLED-does-unnecessary-txg_wai.patch new file mode 100644 index 00000000..150d1b51 --- /dev/null +++ b/sys-fs/zfs-kmod/files/2.1.10-Revert-ZFS_IOC_COUNT_FILLED-does-unnecessary-txg_wai.patch @@ -0,0 +1,67 @@ +From ac6b8f40981cb9328c22a3485e1a4b060ea89b1e Mon Sep 17 00:00:00 2001 +From: Sam James +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 +--- 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 + diff --git a/sys-fs/zfs-kmod/zfs-kmod-2.1.10.ebuild b/sys-fs/zfs-kmod/zfs-kmod-2.1.10-r1.ebuild similarity index 97% rename from sys-fs/zfs-kmod/zfs-kmod-2.1.10.ebuild rename to sys-fs/zfs-kmod/zfs-kmod-2.1.10-r1.ebuild index 8f9eaa5b..bd0070f8 100644 --- a/sys-fs/zfs-kmod/zfs-kmod-2.1.10.ebuild +++ b/sys-fs/zfs-kmod/zfs-kmod-2.1.10-r1.ebuild @@ -60,6 +60,11 @@ RESTRICT="debug? ( strip ) test" DOCS=( AUTHORS COPYRIGHT META README.md ) +PATCHES=( + # https://github.com/openzfs/zfs/issues/14753 + "${FILESDIR}"/2.1.10-Revert-ZFS_IOC_COUNT_FILLED-does-unnecessary-txg_wai.patch +) + pkg_pretend() { use rootfs || return 0