]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Don't allow dnode allocation if dn_holds != 0
authorTom Caputi <tcaputi@datto.com>
Thu, 10 Jan 2019 22:36:23 +0000 (17:36 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 10 Jan 2019 22:36:23 +0000 (14:36 -0800)
This patch simply fixes a small bug where dnode_hold_impl() could
attempt to allocate a dnode that was in the process of being freed,
but which still had active references. This patch simply adds the
required check.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #8249

module/zfs/dnode.c

index 0e9a4dabec50b8aa62fefdb7c46bed50f76e2f12..b7a7f90cf006c265e4065484975b29cfc7570d42 100644 (file)
@@ -1106,6 +1106,7 @@ dnode_check_slots_free(dnode_children_t *children, int idx, int slots)
                } else if (DN_SLOT_IS_PTR(dn)) {
                        mutex_enter(&dn->dn_mtx);
                        boolean_t can_free = (dn->dn_type == DMU_OT_NONE &&
+                           zfs_refcount_is_zero(&dn->dn_holds) &&
                            !DNODE_IS_DIRTY(dn));
                        mutex_exit(&dn->dn_mtx);