Print this page
3752 want more verifiable dbuf user eviction
Submitted by:   Justin Gibbs <justing@spectralogic.com>
Submitted by:   Will Andrews <willa@spectralogic.com>

*** 375,384 **** --- 375,387 ---- void dnode_evict_dbufs(dnode_t *dn) { int progress; int pass = 0; + list_t evict_list; + + dmu_buf_create_user_evict_list(&evict_list); do { dmu_buf_impl_t *db, marker; int evicting = FALSE;
*** 400,414 **** progress = TRUE; evicting = TRUE; mutex_exit(&db->db_mtx); } else if (refcount_is_zero(&db->db_holds)) { progress = TRUE; ! dbuf_clear(db); /* exits db_mtx for us */ } else { mutex_exit(&db->db_mtx); } ! } list_remove(&dn->dn_dbufs, &marker); /* * NB: we need to drop dn_dbufs_mtx between passes so * that any DB_EVICTING dbufs can make progress. --- 403,418 ---- progress = TRUE; evicting = TRUE; mutex_exit(&db->db_mtx); } else if (refcount_is_zero(&db->db_holds)) { progress = TRUE; ! dbuf_clear(db, &evict_list); /* exits db_mtx */ } else { mutex_exit(&db->db_mtx); } ! ASSERT(MUTEX_NOT_HELD(&db->db_mtx)); ! dmu_buf_process_user_evicts(&evict_list); } list_remove(&dn->dn_dbufs, &marker); /* * NB: we need to drop dn_dbufs_mtx between passes so * that any DB_EVICTING dbufs can make progress.
*** 424,437 **** } while (progress); 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; } rw_exit(&dn->dn_struct_rwlock); } static void dnode_undirty_dbufs(list_t *list) { --- 428,442 ---- } while (progress); 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, &evict_list); dn->dn_bonus = NULL; } rw_exit(&dn->dn_struct_rwlock); + dmu_buf_destroy_user_evict_list(&evict_list); } static void dnode_undirty_dbufs(list_t *list) {