From: Tom Caputi Date: Thu, 10 Jan 2019 22:36:23 +0000 (-0500) Subject: Don't allow dnode allocation if dn_holds != 0 X-Git-Tag: zfs-0.8.0-rc3~8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=58769a4ebd462461131f19cccf25c3d19a4dbfb5;p=zfs Don't allow dnode allocation if dn_holds != 0 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 Signed-off-by: Tom Caputi Closes #8249 --- diff --git a/module/zfs/dnode.c b/module/zfs/dnode.c index 0e9a4dabe..b7a7f90cf 100644 --- a/module/zfs/dnode.c +++ b/module/zfs/dnode.c @@ -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);