From 58769a4ebd462461131f19cccf25c3d19a4dbfb5 Mon Sep 17 00:00:00 2001 From: Tom Caputi Date: Thu, 10 Jan 2019 17:36:23 -0500 Subject: 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 --- module/zfs/dnode.c | 1 + 1 file changed, 1 insertion(+) 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); -- cgit v1.2.3