]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix incorrect assertion in dnode_dirty_l1range
authorPaul Dagnelie <pcd@delphix.com>
Mon, 20 May 2019 00:30:33 +0000 (17:30 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 20 May 2019 00:30:33 +0000 (17:30 -0700)
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 <mahrens@delphix.com>
Reviewed-by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed-by: Sara Hartse <sara.hartse@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Paul Dagnelie <pcd@delphix.com>
Closes #8745

module/zfs/dnode.c

index 38ec646bacda45379fb7d73f4626ad5dd42f4ecf..c06f614e1993673983dc8fe664835a1ac5f2e0e3 100644 (file)
@@ -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);