From 1881cc01f5b716d7444fa6e0a5641b3c13c89fd8 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 4bf9b1a5ba73..108dfe15736d 100644 --- a/module/zfs/dmu.c +++ b/module/zfs/dmu.c @@ -2250,12 +2250,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; } }