Fix OpenZFS 9337 mismerge

This change reintroduces logic required by OpenZFS 9577. When
OpenZFS 9337, zfs get all is slow due to uncached metadata, was
merged in it ended up removing logic required by OpenZFS 9577,
remove zfs_dbuf_evict_key, and inadvertently reintroduced the
bug that 9577 was designed to fix.

This change re-enables the "evicting" flag to dbuf_rele_and_unlock
and dnode_rele_and_unlock and updates all callers to provide the
correct parameter.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: George Wilson <george.wilson@delphix.com>
Closes #7758
This commit is contained in:
George Wilson
2018-07-31 17:51:15 -04:00
committed by Brian Behlendorf
parent fd7265c646
commit 3d503a76e8
5 changed files with 16 additions and 15 deletions
+9 -8
View File
@@ -1212,7 +1212,7 @@ dbuf_read_done(zio_t *zio, const zbookmark_phys_t *zb, const blkptr_t *bp,
db->db_state = DB_UNCACHED;
}
cv_broadcast(&db->db_changed);
dbuf_rele_and_unlock(db, NULL);
dbuf_rele_and_unlock(db, NULL, B_FALSE);
}
@@ -2580,7 +2580,7 @@ dbuf_destroy(dmu_buf_impl_t *db)
* release any lock.
*/
mutex_enter(&dn->dn_mtx);
dnode_rele_and_unlock(dn, db);
dnode_rele_and_unlock(dn, db, B_TRUE);
db->db_dnode_handle = NULL;
dbuf_hash_remove(db);
@@ -2609,7 +2609,7 @@ dbuf_destroy(dmu_buf_impl_t *db)
*/
if (parent && parent != dndb) {
mutex_enter(&parent->db_mtx);
dbuf_rele_and_unlock(parent, db);
dbuf_rele_and_unlock(parent, db, B_TRUE);
}
}
@@ -3351,7 +3351,7 @@ void
dbuf_rele(dmu_buf_impl_t *db, void *tag)
{
mutex_enter(&db->db_mtx);
dbuf_rele_and_unlock(db, tag);
dbuf_rele_and_unlock(db, tag, B_FALSE);
}
void
@@ -3374,7 +3374,7 @@ dmu_buf_rele(dmu_buf_t *db, void *tag)
*
*/
void
dbuf_rele_and_unlock(dmu_buf_impl_t *db, void *tag)
dbuf_rele_and_unlock(dmu_buf_impl_t *db, void *tag, boolean_t evicting)
{
int64_t holds;
@@ -3495,7 +3495,8 @@ dbuf_rele_and_unlock(dmu_buf_impl_t *db, void *tag)
}
mutex_exit(&db->db_mtx);
if (db->db_caching_status == DB_DBUF_CACHE) {
if (db->db_caching_status == DB_DBUF_CACHE &&
!evicting) {
dbuf_evict_notify();
}
}
@@ -3848,7 +3849,7 @@ dbuf_sync_leaf(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
kmem_free(dr, sizeof (dbuf_dirty_record_t));
ASSERT(db->db_dirtycnt > 0);
db->db_dirtycnt -= 1;
dbuf_rele_and_unlock(db, (void *)(uintptr_t)txg);
dbuf_rele_and_unlock(db, (void *)(uintptr_t)txg, B_FALSE);
return;
}
@@ -4223,7 +4224,7 @@ dbuf_write_done(zio_t *zio, arc_buf_t *buf, void *vdb)
ASSERT(db->db_dirtycnt > 0);
db->db_dirtycnt -= 1;
db->db_data_pending = NULL;
dbuf_rele_and_unlock(db, (void *)(uintptr_t)tx->tx_txg);
dbuf_rele_and_unlock(db, (void *)(uintptr_t)tx->tx_txg, B_FALSE);
}
static void
+3 -3
View File
@@ -1576,11 +1576,11 @@ void
dnode_rele(dnode_t *dn, void *tag)
{
mutex_enter(&dn->dn_mtx);
dnode_rele_and_unlock(dn, tag);
dnode_rele_and_unlock(dn, tag, B_FALSE);
}
void
dnode_rele_and_unlock(dnode_t *dn, void *tag)
dnode_rele_and_unlock(dnode_t *dn, void *tag, boolean_t evicting)
{
uint64_t refs;
/* Get while the hold prevents the dnode from moving. */
@@ -1612,7 +1612,7 @@ dnode_rele_and_unlock(dnode_t *dn, void *tag)
* asserted anyway when the handle gets destroyed.
*/
mutex_enter(&db->db_mtx);
dbuf_rele_and_unlock(db, dnh);
dbuf_rele_and_unlock(db, dnh, evicting);
}
}
+2 -2
View File
@@ -457,7 +457,7 @@ dnode_evict_dbufs(dnode_t *dn)
* flow would look like:
*
* dbuf_destroy():
* dnode_rele_and_unlock(parent_dbuf):
* dnode_rele_and_unlock(parent_dbuf, evicting=TRUE):
* if (!cacheable || pending_evict)
* dbuf_destroy()
*/
@@ -521,7 +521,7 @@ dnode_undirty_dbufs(list_t *list)
list_destroy(&dr->dt.di.dr_children);
}
kmem_free(dr, sizeof (dbuf_dirty_record_t));
dbuf_rele_and_unlock(db, (void *)(uintptr_t)txg);
dbuf_rele_and_unlock(db, (void *)(uintptr_t)txg, B_FALSE);
}
}