Permalink
Browse files

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 <behlendorf1@llnl.gov>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #8249
  • Loading branch information...
tcaputi authored and behlendorf committed Jan 10, 2019
1 parent 8bd2a28 commit 58769a4ebd462461131f19cccf25c3d19a4dbfb5
Showing with 1 addition and 0 deletions.
  1. +1 −0 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);

0 comments on commit 58769a4

Please sign in to comment.