Print this page
3752 want more verifiable dbuf user eviction
Submitted by: Justin Gibbs <justing@spectralogic.com>
Submitted by: Will Andrews <willa@spectralogic.com>
@@ -43,11 +43,11 @@
uint64_t
zap_getflags(zap_t *zap)
{
if (zap->zap_ismicro)
return (0);
- return (zap->zap_u.zap_fat.zap_phys->zap_flags);
+ return (zap->zap_f_phys->zap_flags);
}
int
zap_hashbits(zap_t *zap)
{
@@ -382,11 +382,12 @@
/*
* Make sure that zap_ismicro is set before we let others see
* it, because zap_lockdir() checks zap_ismicro without the lock
* held.
*/
- winner = dmu_buf_set_user(db, zap, &zap->zap_m.zap_phys, zap_evict);
+ dmu_buf_init_user(&zap->db_evict, zap_evict);
+ winner = (zap_t *)dmu_buf_set_user(db, &zap->db_evict);
if (winner != NULL) {
rw_exit(&zap->zap_rwlock);
rw_destroy(&zap->zap_rwlock);
if (!zap->zap_ismicro)
@@ -394,19 +395,19 @@
kmem_free(zap, sizeof (zap_t));
return (winner);
}
if (zap->zap_ismicro) {
- zap->zap_salt = zap->zap_m.zap_phys->mz_salt;
- zap->zap_normflags = zap->zap_m.zap_phys->mz_normflags;
+ zap->zap_salt = zap->zap_m_phys->mz_salt;
+ zap->zap_normflags = zap->zap_m_phys->mz_normflags;
zap->zap_m.zap_num_chunks = db->db_size / MZAP_ENT_LEN - 1;
avl_create(&zap->zap_m.zap_avl, mze_compare,
sizeof (mzap_ent_t), offsetof(mzap_ent_t, mze_node));
for (i = 0; i < zap->zap_m.zap_num_chunks; i++) {
mzap_ent_phys_t *mze =
- &zap->zap_m.zap_phys->mz_chunk[i];
+ &zap->zap_m_phys->mz_chunk[i];
if (mze->mze_name[0]) {
zap_name_t *zn;
zap->zap_m.zap_num_entries++;
zn = zap_name_alloc(zap, mze->mze_name,
@@ -414,30 +415,30 @@
mze_insert(zap, i, zn->zn_hash);
zap_name_free(zn);
}
}
} else {
- zap->zap_salt = zap->zap_f.zap_phys->zap_salt;
- zap->zap_normflags = zap->zap_f.zap_phys->zap_normflags;
+ zap->zap_salt = zap->zap_f_phys->zap_salt;
+ zap->zap_normflags = zap->zap_f_phys->zap_normflags;
ASSERT3U(sizeof (struct zap_leaf_header), ==,
2*ZAP_LEAF_CHUNKSIZE);
/*
* The embedded pointer table should not overlap the
* other members.
*/
ASSERT3P(&ZAP_EMBEDDED_PTRTBL_ENT(zap, 0), >,
- &zap->zap_f.zap_phys->zap_salt);
+ &zap->zap_f_phys->zap_salt);
/*
* The embedded pointer table should end at the end of
* the block
*/
ASSERT3U((uintptr_t)&ZAP_EMBEDDED_PTRTBL_ENT(zap,
1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)) -
- (uintptr_t)zap->zap_f.zap_phys, ==,
+ (uintptr_t)zap->zap_f_phys, ==,
zap->zap_dbuf->db_size);
}
rw_exit(&zap->zap_rwlock);
return (zap);
}
@@ -463,11 +464,11 @@
dmu_object_info_from_db(db, &doi);
ASSERT3U(DMU_OT_BYTESWAP(doi.doi_type), ==, DMU_BSWAP_ZAP);
}
#endif
- zap = dmu_buf_get_user(db);
+ zap = (zap_t *)dmu_buf_get_user(db);
if (zap == NULL)
zap = mzap_open(os, obj, db);
/*
* We're checking zap_ismicro without the lock held, in order to
@@ -674,15 +675,14 @@
*/
return (dmu_object_free(os, zapobj, tx));
}
-_NOTE(ARGSUSED(0))
void
-zap_evict(dmu_buf_t *db, void *vzap)
+zap_evict(dmu_buf_user_t *dbu)
{
- zap_t *zap = vzap;
+ zap_t *zap = (zap_t *)dbu;
rw_destroy(&zap->zap_rwlock);
if (zap->zap_ismicro)
mze_destroy(zap);
@@ -936,22 +936,22 @@
ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
#ifdef ZFS_DEBUG
for (i = 0; i < zap->zap_m.zap_num_chunks; i++) {
- mzap_ent_phys_t *mze = &zap->zap_m.zap_phys->mz_chunk[i];
+ mzap_ent_phys_t *mze = &zap->zap_m_phys->mz_chunk[i];
ASSERT(strcmp(zn->zn_key_orig, mze->mze_name) != 0);
}
#endif
cd = mze_find_unused_cd(zap, zn->zn_hash);
/* given the limited size of the microzap, this can't happen */
ASSERT(cd < zap_maxcd(zap));
again:
for (i = start; i < zap->zap_m.zap_num_chunks; i++) {
- mzap_ent_phys_t *mze = &zap->zap_m.zap_phys->mz_chunk[i];
+ mzap_ent_phys_t *mze = &zap->zap_m_phys->mz_chunk[i];
if (mze->mze_name[0] == 0) {
mze->mze_value = value;
mze->mze_cd = cd;
(void) strcpy(mze->mze_name, zn->zn_key_orig);
zap->zap_m.zap_num_entries++;
@@ -1148,11 +1148,11 @@
mze = mze_find(zn);
if (mze == NULL) {
err = SET_ERROR(ENOENT);
} else {
zap->zap_m.zap_num_entries--;
- bzero(&zap->zap_m.zap_phys->mz_chunk[mze->mze_chunkid],
+ bzero(&zap->zap_m_phys->mz_chunk[mze->mze_chunkid],
sizeof (mzap_ent_phys_t));
mze_remove(zap, mze);
}
}
zap_name_free(zn);