mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-25 03:37:45 +03:00
Illumos 5314 - Remove "dbuf phys" db->db_data pointer aliases in ZFS
5314 Remove "dbuf phys" db->db_data pointer aliases in ZFS Author: Justin T. Gibbs <justing@spectralogic.com> Reviewed by: Andriy Gapon <avg@freebsd.org> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Will Andrews <willa@spectralogic.com> Approved by: Dan McDonald <danmcd@omniti.com> References: https://www.illumos.org/issues/5314 https://github.com/illumos/illumos-gate/commit/c137962 Ported-by: Chris Dunlop <chris@onthe.net.au> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
committed by
Brian Behlendorf
parent
945dd93525
commit
d683ddbb72
+78
-80
@@ -50,10 +50,11 @@
|
||||
|
||||
int fzap_default_block_shift = 14; /* 16k blocksize */
|
||||
|
||||
extern inline zap_phys_t *zap_f_phys(zap_t *zap);
|
||||
|
||||
static void zap_leaf_pageout(dmu_buf_t *db, void *vl);
|
||||
static uint64_t zap_allocate_blocks(zap_t *zap, int nblocks);
|
||||
|
||||
|
||||
void
|
||||
fzap_byteswap(void *vbuf, size_t size)
|
||||
{
|
||||
@@ -80,13 +81,12 @@ fzap_upgrade(zap_t *zap, dmu_tx_t *tx, zap_flags_t flags)
|
||||
ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
|
||||
zap->zap_ismicro = FALSE;
|
||||
|
||||
(void) dmu_buf_update_user(zap->zap_dbuf, zap, zap,
|
||||
&zap->zap_f.zap_phys, zap_evict);
|
||||
(void) dmu_buf_update_user(zap->zap_dbuf, zap, zap, zap_evict);
|
||||
|
||||
mutex_init(&zap->zap_f.zap_num_entries_mtx, 0, 0, 0);
|
||||
zap->zap_f.zap_block_shift = highbit64(zap->zap_dbuf->db_size) - 1;
|
||||
|
||||
zp = zap->zap_f.zap_phys;
|
||||
zp = zap_f_phys(zap);
|
||||
/*
|
||||
* explicitly zero it since it might be coming from an
|
||||
* initialized microzap
|
||||
@@ -117,7 +117,6 @@ fzap_upgrade(zap_t *zap, dmu_tx_t *tx, zap_flags_t flags)
|
||||
|
||||
l = kmem_zalloc(sizeof (zap_leaf_t), KM_SLEEP);
|
||||
l->l_dbuf = db;
|
||||
l->l_phys = db->db_data;
|
||||
|
||||
zap_leaf_init(l, zp->zap_normflags != 0);
|
||||
|
||||
@@ -325,10 +324,10 @@ zap_grow_ptrtbl(zap_t *zap, dmu_tx_t *tx)
|
||||
* If we are within 2 bits of running out, stop growing, since
|
||||
* this is already an aberrant condition.
|
||||
*/
|
||||
if (zap->zap_f.zap_phys->zap_ptrtbl.zt_shift >= zap_hashbits(zap) - 2)
|
||||
if (zap_f_phys(zap)->zap_ptrtbl.zt_shift >= zap_hashbits(zap) - 2)
|
||||
return (SET_ERROR(ENOSPC));
|
||||
|
||||
if (zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks == 0) {
|
||||
if (zap_f_phys(zap)->zap_ptrtbl.zt_numblks == 0) {
|
||||
/*
|
||||
* We are outgrowing the "embedded" ptrtbl (the one
|
||||
* stored in the header block). Give it its own entire
|
||||
@@ -338,9 +337,9 @@ zap_grow_ptrtbl(zap_t *zap, dmu_tx_t *tx)
|
||||
dmu_buf_t *db_new;
|
||||
int err;
|
||||
|
||||
ASSERT3U(zap->zap_f.zap_phys->zap_ptrtbl.zt_shift, ==,
|
||||
ASSERT3U(zap_f_phys(zap)->zap_ptrtbl.zt_shift, ==,
|
||||
ZAP_EMBEDDED_PTRTBL_SHIFT(zap));
|
||||
ASSERT0(zap->zap_f.zap_phys->zap_ptrtbl.zt_blk);
|
||||
ASSERT0(zap_f_phys(zap)->zap_ptrtbl.zt_blk);
|
||||
|
||||
newblk = zap_allocate_blocks(zap, 1);
|
||||
err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
|
||||
@@ -353,17 +352,17 @@ zap_grow_ptrtbl(zap_t *zap, dmu_tx_t *tx)
|
||||
db_new->db_data, 1 << ZAP_EMBEDDED_PTRTBL_SHIFT(zap));
|
||||
dmu_buf_rele(db_new, FTAG);
|
||||
|
||||
zap->zap_f.zap_phys->zap_ptrtbl.zt_blk = newblk;
|
||||
zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks = 1;
|
||||
zap->zap_f.zap_phys->zap_ptrtbl.zt_shift++;
|
||||
zap_f_phys(zap)->zap_ptrtbl.zt_blk = newblk;
|
||||
zap_f_phys(zap)->zap_ptrtbl.zt_numblks = 1;
|
||||
zap_f_phys(zap)->zap_ptrtbl.zt_shift++;
|
||||
|
||||
ASSERT3U(1ULL << zap->zap_f.zap_phys->zap_ptrtbl.zt_shift, ==,
|
||||
zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks <<
|
||||
ASSERT3U(1ULL << zap_f_phys(zap)->zap_ptrtbl.zt_shift, ==,
|
||||
zap_f_phys(zap)->zap_ptrtbl.zt_numblks <<
|
||||
(FZAP_BLOCK_SHIFT(zap)-3));
|
||||
|
||||
return (0);
|
||||
} else {
|
||||
return (zap_table_grow(zap, &zap->zap_f.zap_phys->zap_ptrtbl,
|
||||
return (zap_table_grow(zap, &zap_f_phys(zap)->zap_ptrtbl,
|
||||
zap_ptrtbl_transfer, tx));
|
||||
}
|
||||
}
|
||||
@@ -373,8 +372,8 @@ zap_increment_num_entries(zap_t *zap, int delta, dmu_tx_t *tx)
|
||||
{
|
||||
dmu_buf_will_dirty(zap->zap_dbuf, tx);
|
||||
mutex_enter(&zap->zap_f.zap_num_entries_mtx);
|
||||
ASSERT(delta > 0 || zap->zap_f.zap_phys->zap_num_entries >= -delta);
|
||||
zap->zap_f.zap_phys->zap_num_entries += delta;
|
||||
ASSERT(delta > 0 || zap_f_phys(zap)->zap_num_entries >= -delta);
|
||||
zap_f_phys(zap)->zap_num_entries += delta;
|
||||
mutex_exit(&zap->zap_f.zap_num_entries_mtx);
|
||||
}
|
||||
|
||||
@@ -383,8 +382,8 @@ zap_allocate_blocks(zap_t *zap, int nblocks)
|
||||
{
|
||||
uint64_t newblk;
|
||||
ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
|
||||
newblk = zap->zap_f.zap_phys->zap_freeblk;
|
||||
zap->zap_f.zap_phys->zap_freeblk += nblocks;
|
||||
newblk = zap_f_phys(zap)->zap_freeblk;
|
||||
zap_f_phys(zap)->zap_freeblk += nblocks;
|
||||
return (newblk);
|
||||
}
|
||||
|
||||
@@ -400,18 +399,17 @@ zap_create_leaf(zap_t *zap, dmu_tx_t *tx)
|
||||
rw_enter(&l->l_rwlock, RW_WRITER);
|
||||
l->l_blkid = zap_allocate_blocks(zap, 1);
|
||||
l->l_dbuf = NULL;
|
||||
l->l_phys = NULL;
|
||||
|
||||
VERIFY(0 == dmu_buf_hold(zap->zap_objset, zap->zap_object,
|
||||
l->l_blkid << FZAP_BLOCK_SHIFT(zap), NULL, &l->l_dbuf,
|
||||
DMU_READ_NO_PREFETCH));
|
||||
winner = dmu_buf_set_user(l->l_dbuf, l, &l->l_phys, zap_leaf_pageout);
|
||||
winner = dmu_buf_set_user(l->l_dbuf, l, zap_leaf_pageout);
|
||||
ASSERT(winner == NULL);
|
||||
dmu_buf_will_dirty(l->l_dbuf, tx);
|
||||
|
||||
zap_leaf_init(l, zap->zap_normflags != 0);
|
||||
|
||||
zap->zap_f.zap_phys->zap_num_leafs++;
|
||||
zap_f_phys(zap)->zap_num_leafs++;
|
||||
|
||||
return (l);
|
||||
}
|
||||
@@ -421,7 +419,7 @@ fzap_count(zap_t *zap, uint64_t *count)
|
||||
{
|
||||
ASSERT(!zap->zap_ismicro);
|
||||
mutex_enter(&zap->zap_f.zap_num_entries_mtx); /* unnecessary */
|
||||
*count = zap->zap_f.zap_phys->zap_num_entries;
|
||||
*count = zap_f_phys(zap)->zap_num_entries;
|
||||
mutex_exit(&zap->zap_f.zap_num_entries_mtx);
|
||||
return (0);
|
||||
}
|
||||
@@ -460,9 +458,8 @@ zap_open_leaf(uint64_t blkid, dmu_buf_t *db)
|
||||
l->l_blkid = blkid;
|
||||
l->l_bs = highbit64(db->db_size) - 1;
|
||||
l->l_dbuf = db;
|
||||
l->l_phys = NULL;
|
||||
|
||||
winner = dmu_buf_set_user(db, l, &l->l_phys, zap_leaf_pageout);
|
||||
winner = dmu_buf_set_user(db, l, zap_leaf_pageout);
|
||||
|
||||
rw_exit(&l->l_rwlock);
|
||||
if (winner != NULL) {
|
||||
@@ -476,7 +473,7 @@ zap_open_leaf(uint64_t blkid, dmu_buf_t *db)
|
||||
* chain. There should be no chained leafs (as we have removed
|
||||
* support for them).
|
||||
*/
|
||||
ASSERT0(l->l_phys->l_hdr.lh_pad1);
|
||||
ASSERT0(zap_leaf_phys(l)->l_hdr.lh_pad1);
|
||||
|
||||
/*
|
||||
* There should be more hash entries than there can be
|
||||
@@ -486,11 +483,11 @@ zap_open_leaf(uint64_t blkid, dmu_buf_t *db)
|
||||
|
||||
/* The chunks should begin at the end of the hash table */
|
||||
ASSERT3P(&ZAP_LEAF_CHUNK(l, 0), ==, (zap_leaf_chunk_t *)
|
||||
&l->l_phys->l_hash[ZAP_LEAF_HASH_NUMENTRIES(l)]);
|
||||
&zap_leaf_phys(l)->l_hash[ZAP_LEAF_HASH_NUMENTRIES(l)]);
|
||||
|
||||
/* The chunks should end at the end of the block */
|
||||
ASSERT3U((uintptr_t)&ZAP_LEAF_CHUNK(l, ZAP_LEAF_NUMCHUNKS(l)) -
|
||||
(uintptr_t)l->l_phys, ==, l->l_dbuf->db_size);
|
||||
(uintptr_t)zap_leaf_phys(l), ==, l->l_dbuf->db_size);
|
||||
|
||||
return (l);
|
||||
}
|
||||
@@ -523,16 +520,15 @@ zap_get_leaf_byblk(zap_t *zap, uint64_t blkid, dmu_tx_t *tx, krw_t lt,
|
||||
|
||||
rw_enter(&l->l_rwlock, lt);
|
||||
/*
|
||||
* Must lock before dirtying, otherwise l->l_phys could change,
|
||||
* Must lock before dirtying, otherwise zap_leaf_phys(l) could change,
|
||||
* causing ASSERT below to fail.
|
||||
*/
|
||||
if (lt == RW_WRITER)
|
||||
dmu_buf_will_dirty(db, tx);
|
||||
ASSERT3U(l->l_blkid, ==, blkid);
|
||||
ASSERT3P(l->l_dbuf, ==, db);
|
||||
ASSERT3P(l->l_phys, ==, l->l_dbuf->db_data);
|
||||
ASSERT3U(l->l_phys->l_hdr.lh_block_type, ==, ZBT_LEAF);
|
||||
ASSERT3U(l->l_phys->l_hdr.lh_magic, ==, ZAP_LEAF_MAGIC);
|
||||
ASSERT3U(zap_leaf_phys(l)->l_hdr.lh_block_type, ==, ZBT_LEAF);
|
||||
ASSERT3U(zap_leaf_phys(l)->l_hdr.lh_magic, ==, ZAP_LEAF_MAGIC);
|
||||
|
||||
*lp = l;
|
||||
return (0);
|
||||
@@ -543,13 +539,13 @@ zap_idx_to_blk(zap_t *zap, uint64_t idx, uint64_t *valp)
|
||||
{
|
||||
ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
|
||||
|
||||
if (zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks == 0) {
|
||||
if (zap_f_phys(zap)->zap_ptrtbl.zt_numblks == 0) {
|
||||
ASSERT3U(idx, <,
|
||||
(1ULL << zap->zap_f.zap_phys->zap_ptrtbl.zt_shift));
|
||||
(1ULL << zap_f_phys(zap)->zap_ptrtbl.zt_shift));
|
||||
*valp = ZAP_EMBEDDED_PTRTBL_ENT(zap, idx);
|
||||
return (0);
|
||||
} else {
|
||||
return (zap_table_load(zap, &zap->zap_f.zap_phys->zap_ptrtbl,
|
||||
return (zap_table_load(zap, &zap_f_phys(zap)->zap_ptrtbl,
|
||||
idx, valp));
|
||||
}
|
||||
}
|
||||
@@ -560,11 +556,11 @@ zap_set_idx_to_blk(zap_t *zap, uint64_t idx, uint64_t blk, dmu_tx_t *tx)
|
||||
ASSERT(tx != NULL);
|
||||
ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
|
||||
|
||||
if (zap->zap_f.zap_phys->zap_ptrtbl.zt_blk == 0) {
|
||||
if (zap_f_phys(zap)->zap_ptrtbl.zt_blk == 0) {
|
||||
ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) = blk;
|
||||
return (0);
|
||||
} else {
|
||||
return (zap_table_store(zap, &zap->zap_f.zap_phys->zap_ptrtbl,
|
||||
return (zap_table_store(zap, &zap_f_phys(zap)->zap_ptrtbl,
|
||||
idx, blk, tx));
|
||||
}
|
||||
}
|
||||
@@ -576,16 +572,17 @@ zap_deref_leaf(zap_t *zap, uint64_t h, dmu_tx_t *tx, krw_t lt, zap_leaf_t **lp)
|
||||
int err;
|
||||
|
||||
ASSERT(zap->zap_dbuf == NULL ||
|
||||
zap->zap_f.zap_phys == zap->zap_dbuf->db_data);
|
||||
ASSERT3U(zap->zap_f.zap_phys->zap_magic, ==, ZAP_MAGIC);
|
||||
idx = ZAP_HASH_IDX(h, zap->zap_f.zap_phys->zap_ptrtbl.zt_shift);
|
||||
zap_f_phys(zap) == zap->zap_dbuf->db_data);
|
||||
ASSERT3U(zap_f_phys(zap)->zap_magic, ==, ZAP_MAGIC);
|
||||
idx = ZAP_HASH_IDX(h, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
|
||||
err = zap_idx_to_blk(zap, idx, &blk);
|
||||
if (err != 0)
|
||||
return (err);
|
||||
err = zap_get_leaf_byblk(zap, blk, tx, lt, lp);
|
||||
|
||||
ASSERT(err || ZAP_HASH_IDX(h, (*lp)->l_phys->l_hdr.lh_prefix_len) ==
|
||||
(*lp)->l_phys->l_hdr.lh_prefix);
|
||||
ASSERT(err ||
|
||||
ZAP_HASH_IDX(h, zap_leaf_phys(*lp)->l_hdr.lh_prefix_len) ==
|
||||
zap_leaf_phys(*lp)->l_hdr.lh_prefix);
|
||||
return (err);
|
||||
}
|
||||
|
||||
@@ -597,16 +594,16 @@ zap_expand_leaf(zap_name_t *zn, zap_leaf_t *l, dmu_tx_t *tx, zap_leaf_t **lp)
|
||||
zap_leaf_t *nl;
|
||||
int prefix_diff, i, err;
|
||||
uint64_t sibling;
|
||||
int old_prefix_len = l->l_phys->l_hdr.lh_prefix_len;
|
||||
int old_prefix_len = zap_leaf_phys(l)->l_hdr.lh_prefix_len;
|
||||
|
||||
ASSERT3U(old_prefix_len, <=, zap->zap_f.zap_phys->zap_ptrtbl.zt_shift);
|
||||
ASSERT3U(old_prefix_len, <=, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
|
||||
ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
|
||||
|
||||
ASSERT3U(ZAP_HASH_IDX(hash, old_prefix_len), ==,
|
||||
l->l_phys->l_hdr.lh_prefix);
|
||||
zap_leaf_phys(l)->l_hdr.lh_prefix);
|
||||
|
||||
if (zap_tryupgradedir(zap, tx) == 0 ||
|
||||
old_prefix_len == zap->zap_f.zap_phys->zap_ptrtbl.zt_shift) {
|
||||
old_prefix_len == zap_f_phys(zap)->zap_ptrtbl.zt_shift) {
|
||||
/* We failed to upgrade, or need to grow the pointer table */
|
||||
objset_t *os = zap->zap_objset;
|
||||
uint64_t object = zap->zap_object;
|
||||
@@ -621,7 +618,7 @@ zap_expand_leaf(zap_name_t *zn, zap_leaf_t *l, dmu_tx_t *tx, zap_leaf_t **lp)
|
||||
ASSERT(!zap->zap_ismicro);
|
||||
|
||||
while (old_prefix_len ==
|
||||
zap->zap_f.zap_phys->zap_ptrtbl.zt_shift) {
|
||||
zap_f_phys(zap)->zap_ptrtbl.zt_shift) {
|
||||
err = zap_grow_ptrtbl(zap, tx);
|
||||
if (err)
|
||||
return (err);
|
||||
@@ -631,18 +628,18 @@ zap_expand_leaf(zap_name_t *zn, zap_leaf_t *l, dmu_tx_t *tx, zap_leaf_t **lp)
|
||||
if (err)
|
||||
return (err);
|
||||
|
||||
if (l->l_phys->l_hdr.lh_prefix_len != old_prefix_len) {
|
||||
if (zap_leaf_phys(l)->l_hdr.lh_prefix_len != old_prefix_len) {
|
||||
/* it split while our locks were down */
|
||||
*lp = l;
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
|
||||
ASSERT3U(old_prefix_len, <, zap->zap_f.zap_phys->zap_ptrtbl.zt_shift);
|
||||
ASSERT3U(old_prefix_len, <, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
|
||||
ASSERT3U(ZAP_HASH_IDX(hash, old_prefix_len), ==,
|
||||
l->l_phys->l_hdr.lh_prefix);
|
||||
zap_leaf_phys(l)->l_hdr.lh_prefix);
|
||||
|
||||
prefix_diff = zap->zap_f.zap_phys->zap_ptrtbl.zt_shift -
|
||||
prefix_diff = zap_f_phys(zap)->zap_ptrtbl.zt_shift -
|
||||
(old_prefix_len + 1);
|
||||
sibling = (ZAP_HASH_IDX(hash, old_prefix_len + 1) | 1) << prefix_diff;
|
||||
|
||||
@@ -664,7 +661,7 @@ zap_expand_leaf(zap_name_t *zn, zap_leaf_t *l, dmu_tx_t *tx, zap_leaf_t **lp)
|
||||
ASSERT0(err); /* we checked for i/o errors above */
|
||||
}
|
||||
|
||||
if (hash & (1ULL << (64 - l->l_phys->l_hdr.lh_prefix_len))) {
|
||||
if (hash & (1ULL << (64 - zap_leaf_phys(l)->l_hdr.lh_prefix_len))) {
|
||||
/* we want the sibling */
|
||||
zap_put_leaf(l);
|
||||
*lp = nl;
|
||||
@@ -680,13 +677,13 @@ static void
|
||||
zap_put_leaf_maybe_grow_ptrtbl(zap_name_t *zn, zap_leaf_t *l, dmu_tx_t *tx)
|
||||
{
|
||||
zap_t *zap = zn->zn_zap;
|
||||
int shift = zap->zap_f.zap_phys->zap_ptrtbl.zt_shift;
|
||||
int leaffull = (l->l_phys->l_hdr.lh_prefix_len == shift &&
|
||||
l->l_phys->l_hdr.lh_nfree < ZAP_LEAF_LOW_WATER);
|
||||
int shift = zap_f_phys(zap)->zap_ptrtbl.zt_shift;
|
||||
int leaffull = (zap_leaf_phys(l)->l_hdr.lh_prefix_len == shift &&
|
||||
zap_leaf_phys(l)->l_hdr.lh_nfree < ZAP_LEAF_LOW_WATER);
|
||||
|
||||
zap_put_leaf(l);
|
||||
|
||||
if (leaffull || zap->zap_f.zap_phys->zap_ptrtbl.zt_nextblk) {
|
||||
if (leaffull || zap_f_phys(zap)->zap_ptrtbl.zt_nextblk) {
|
||||
int err;
|
||||
|
||||
/*
|
||||
@@ -706,7 +703,7 @@ zap_put_leaf_maybe_grow_ptrtbl(zap_name_t *zn, zap_leaf_t *l, dmu_tx_t *tx)
|
||||
}
|
||||
|
||||
/* could have finished growing while our locks were down */
|
||||
if (zap->zap_f.zap_phys->zap_ptrtbl.zt_shift == shift)
|
||||
if (zap_f_phys(zap)->zap_ptrtbl.zt_shift == shift)
|
||||
(void) zap_grow_ptrtbl(zap, tx);
|
||||
}
|
||||
}
|
||||
@@ -937,7 +934,7 @@ fzap_prefetch(zap_name_t *zn)
|
||||
int bs;
|
||||
|
||||
idx = ZAP_HASH_IDX(zn->zn_hash,
|
||||
zap->zap_f.zap_phys->zap_ptrtbl.zt_shift);
|
||||
zap_f_phys(zap)->zap_ptrtbl.zt_shift);
|
||||
if (zap_idx_to_blk(zap, idx, &blk) != 0)
|
||||
return;
|
||||
bs = FZAP_BLOCK_SHIFT(zap);
|
||||
@@ -1169,8 +1166,8 @@ fzap_cursor_retrieve(zap_t *zap, zap_cursor_t *zc, zap_attribute_t *za)
|
||||
|
||||
if (zc->zc_leaf &&
|
||||
(ZAP_HASH_IDX(zc->zc_hash,
|
||||
zc->zc_leaf->l_phys->l_hdr.lh_prefix_len) !=
|
||||
zc->zc_leaf->l_phys->l_hdr.lh_prefix)) {
|
||||
zap_leaf_phys(zc->zc_leaf)->l_hdr.lh_prefix_len) !=
|
||||
zap_leaf_phys(zc->zc_leaf)->l_hdr.lh_prefix)) {
|
||||
rw_enter(&zc->zc_leaf->l_rwlock, RW_READER);
|
||||
zap_put_leaf(zc->zc_leaf);
|
||||
zc->zc_leaf = NULL;
|
||||
@@ -1191,10 +1188,11 @@ again:
|
||||
|
||||
if (err == ENOENT) {
|
||||
uint64_t nocare =
|
||||
(1ULL << (64 - l->l_phys->l_hdr.lh_prefix_len)) - 1;
|
||||
(1ULL << (64 - zap_leaf_phys(l)->l_hdr.lh_prefix_len)) - 1;
|
||||
zc->zc_hash = (zc->zc_hash & ~nocare) + nocare + 1;
|
||||
zc->zc_cd = 0;
|
||||
if (l->l_phys->l_hdr.lh_prefix_len == 0 || zc->zc_hash == 0) {
|
||||
if (zap_leaf_phys(l)->l_hdr.lh_prefix_len == 0 ||
|
||||
zc->zc_hash == 0) {
|
||||
zc->zc_hash = -1ULL;
|
||||
} else {
|
||||
zap_put_leaf(zc->zc_leaf);
|
||||
@@ -1286,25 +1284,25 @@ fzap_get_stats(zap_t *zap, zap_stats_t *zs)
|
||||
/*
|
||||
* Set zap_phys_t fields
|
||||
*/
|
||||
zs->zs_num_leafs = zap->zap_f.zap_phys->zap_num_leafs;
|
||||
zs->zs_num_entries = zap->zap_f.zap_phys->zap_num_entries;
|
||||
zs->zs_num_blocks = zap->zap_f.zap_phys->zap_freeblk;
|
||||
zs->zs_block_type = zap->zap_f.zap_phys->zap_block_type;
|
||||
zs->zs_magic = zap->zap_f.zap_phys->zap_magic;
|
||||
zs->zs_salt = zap->zap_f.zap_phys->zap_salt;
|
||||
zs->zs_num_leafs = zap_f_phys(zap)->zap_num_leafs;
|
||||
zs->zs_num_entries = zap_f_phys(zap)->zap_num_entries;
|
||||
zs->zs_num_blocks = zap_f_phys(zap)->zap_freeblk;
|
||||
zs->zs_block_type = zap_f_phys(zap)->zap_block_type;
|
||||
zs->zs_magic = zap_f_phys(zap)->zap_magic;
|
||||
zs->zs_salt = zap_f_phys(zap)->zap_salt;
|
||||
|
||||
/*
|
||||
* Set zap_ptrtbl fields
|
||||
*/
|
||||
zs->zs_ptrtbl_len = 1ULL << zap->zap_f.zap_phys->zap_ptrtbl.zt_shift;
|
||||
zs->zs_ptrtbl_nextblk = zap->zap_f.zap_phys->zap_ptrtbl.zt_nextblk;
|
||||
zs->zs_ptrtbl_len = 1ULL << zap_f_phys(zap)->zap_ptrtbl.zt_shift;
|
||||
zs->zs_ptrtbl_nextblk = zap_f_phys(zap)->zap_ptrtbl.zt_nextblk;
|
||||
zs->zs_ptrtbl_blks_copied =
|
||||
zap->zap_f.zap_phys->zap_ptrtbl.zt_blks_copied;
|
||||
zs->zs_ptrtbl_zt_blk = zap->zap_f.zap_phys->zap_ptrtbl.zt_blk;
|
||||
zs->zs_ptrtbl_zt_numblks = zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks;
|
||||
zs->zs_ptrtbl_zt_shift = zap->zap_f.zap_phys->zap_ptrtbl.zt_shift;
|
||||
zap_f_phys(zap)->zap_ptrtbl.zt_blks_copied;
|
||||
zs->zs_ptrtbl_zt_blk = zap_f_phys(zap)->zap_ptrtbl.zt_blk;
|
||||
zs->zs_ptrtbl_zt_numblks = zap_f_phys(zap)->zap_ptrtbl.zt_numblks;
|
||||
zs->zs_ptrtbl_zt_shift = zap_f_phys(zap)->zap_ptrtbl.zt_shift;
|
||||
|
||||
if (zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks == 0) {
|
||||
if (zap_f_phys(zap)->zap_ptrtbl.zt_numblks == 0) {
|
||||
/* the ptrtbl is entirely in the header block. */
|
||||
zap_stats_ptrtbl(zap, &ZAP_EMBEDDED_PTRTBL_ENT(zap, 0),
|
||||
1 << ZAP_EMBEDDED_PTRTBL_SHIFT(zap), zs);
|
||||
@@ -1312,16 +1310,16 @@ fzap_get_stats(zap_t *zap, zap_stats_t *zs)
|
||||
int b;
|
||||
|
||||
dmu_prefetch(zap->zap_objset, zap->zap_object,
|
||||
zap->zap_f.zap_phys->zap_ptrtbl.zt_blk << bs,
|
||||
zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks << bs);
|
||||
zap_f_phys(zap)->zap_ptrtbl.zt_blk << bs,
|
||||
zap_f_phys(zap)->zap_ptrtbl.zt_numblks << bs);
|
||||
|
||||
for (b = 0; b < zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks;
|
||||
for (b = 0; b < zap_f_phys(zap)->zap_ptrtbl.zt_numblks;
|
||||
b++) {
|
||||
dmu_buf_t *db;
|
||||
int err;
|
||||
|
||||
err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
|
||||
(zap->zap_f.zap_phys->zap_ptrtbl.zt_blk + b) << bs,
|
||||
(zap_f_phys(zap)->zap_ptrtbl.zt_blk + b) << bs,
|
||||
FTAG, &db, DMU_READ_NO_PREFETCH);
|
||||
if (err == 0) {
|
||||
zap_stats_ptrtbl(zap, db->db_data,
|
||||
@@ -1358,7 +1356,7 @@ fzap_count_write(zap_name_t *zn, int add, uint64_t *towrite,
|
||||
* could extend the table.
|
||||
*/
|
||||
if (add) {
|
||||
if (zap->zap_f.zap_phys->zap_ptrtbl.zt_blk == 0)
|
||||
if (zap_f_phys(zap)->zap_ptrtbl.zt_blk == 0)
|
||||
*towrite += zap->zap_dbuf->db_size;
|
||||
else
|
||||
*towrite += (zap->zap_dbuf->db_size * 3);
|
||||
|
||||
Reference in New Issue
Block a user