mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 11:18:52 +03:00
Illumos 6267 - dn_bonus evicted too early
6267 dn_bonus evicted too early Reviewed by: Richard Yao <ryao@gentoo.org> Reviewed by: Xin LI <delphij@freebsd.org> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Approved by: Richard Lowe <richlowe@richlowe.net> References: https://www.illumos.org/issues/6267 https://github.com/illumos/illumos-gate/commit/d205810 Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Ported-by: Ned Bass bass6@llnl.gov Issue #3865 Issue #3443
This commit is contained in:
committed by
Brian Behlendorf
parent
33df62d052
commit
bc4501f75a
@@ -432,6 +432,7 @@ dnode_evict_dbufs(dnode_t *dn)
|
||||
db_next = AVL_NEXT(&dn->dn_dbufs, db_marker);
|
||||
avl_remove(&dn->dn_dbufs, db_marker);
|
||||
} else {
|
||||
db->db_pending_evict = TRUE;
|
||||
mutex_exit(&db->db_mtx);
|
||||
db_next = AVL_NEXT(&dn->dn_dbufs, db);
|
||||
}
|
||||
@@ -447,10 +448,14 @@ void
|
||||
dnode_evict_bonus(dnode_t *dn)
|
||||
{
|
||||
rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
|
||||
if (dn->dn_bonus && refcount_is_zero(&dn->dn_bonus->db_holds)) {
|
||||
mutex_enter(&dn->dn_bonus->db_mtx);
|
||||
dbuf_evict(dn->dn_bonus);
|
||||
dn->dn_bonus = NULL;
|
||||
if (dn->dn_bonus != NULL) {
|
||||
if (refcount_is_zero(&dn->dn_bonus->db_holds)) {
|
||||
mutex_enter(&dn->dn_bonus->db_mtx);
|
||||
dbuf_evict(dn->dn_bonus);
|
||||
dn->dn_bonus = NULL;
|
||||
} else {
|
||||
dn->dn_bonus->db_pending_evict = TRUE;
|
||||
}
|
||||
}
|
||||
rw_exit(&dn->dn_struct_rwlock);
|
||||
}
|
||||
@@ -502,7 +507,6 @@ dnode_sync_free(dnode_t *dn, dmu_tx_t *tx)
|
||||
|
||||
dnode_undirty_dbufs(&dn->dn_dirty_records[txgoff]);
|
||||
dnode_evict_dbufs(dn);
|
||||
ASSERT(avl_is_empty(&dn->dn_dbufs));
|
||||
|
||||
/*
|
||||
* XXX - It would be nice to assert this, but we may still
|
||||
|
||||
Reference in New Issue
Block a user