From e61b53475e859bd055d205a4d9659f576a9765d1 Mon Sep 17 00:00:00 2001 From: Paul Dagnelie Date: Sun, 19 May 2019 17:30:33 -0700 Subject: [PATCH] Fix incorrect assertion in dnode_dirty_l1range The db_dirtycnt of an EVICTING dbuf is always 0. However, it still appears in the dn_dbufs tree. If we call dnode_dirty_l1range on a range that contains an EVICTING dbuf, we will attempt to mark it dirty (which will fail because it's EVICTING, resulting in a new dbuf being created and dirtied). Later, in ZFS_DEBUG mode, we assert that all the dbufs in the range are dirty. If the EVICTING dbuf is still present, this will trip the assertion erroneously. Reviewed-by: Matt Ahrens Reviewed-by: Richard Elling Reviewed-by: Sara Hartse Reviewed-by: Brian Behlendorf Signed-off-by: Paul Dagnelie Closes #8745 --- module/zfs/dnode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/zfs/dnode.c b/module/zfs/dnode.c index 38ec646ba..c06f614e1 100644 --- a/module/zfs/dnode.c +++ b/module/zfs/dnode.c @@ -1967,7 +1967,8 @@ dnode_dirty_l1range(dnode_t *dn, uint64_t start_blkid, uint64_t end_blkid, for (; db != NULL; db = AVL_NEXT(&dn->dn_dbufs, db)) { if (db->db_level != 1 || db->db_blkid >= end_blkid) break; - ASSERT(db->db_dirtycnt > 0); + if (db->db_state != DB_EVICTING) + ASSERT(db->db_dirtycnt > 0); } #endif mutex_exit(&dn->dn_dbufs_mtx); -- 2.39.2