From 841cb5ee2ae8f1d617cd1f6713c8394e3bb30127 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Wed, 15 Nov 2017 10:19:32 -0800 Subject: [PATCH] Fix dirty check in dmu_offset_next() The correct way to determine if a dnode is dirty is to check if any of the dn->dn_dirty_link's are active. Relying solely on the dn->dn_dirtyctx can result in the dnode being mistakenly reported as clean. Reviewed-by: Chunwei Chen Reviewed-by: George Melikov Signed-off-by: Brian Behlendorf Closes #3125 Closes #6867 --- module/zfs/dmu.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/module/zfs/dmu.c b/module/zfs/dmu.c index 44705006e..6f09aa2f7 100644 --- a/module/zfs/dmu.c +++ b/module/zfs/dmu.c @@ -2043,12 +2043,10 @@ dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole, uint64_t *off) /* * Check if dnode is dirty */ - if (dn->dn_dirtyctx != DN_UNDIRTIED) { - for (i = 0; i < TXG_SIZE; i++) { - if (!list_is_empty(&dn->dn_dirty_records[i])) { - clean = B_FALSE; - break; - } + for (i = 0; i < TXG_SIZE; i++) { + if (list_link_active(&dn->dn_dirty_link[i])) { + clean = B_FALSE; + break; } } -- 2.40.0