558 ASSERT(tx != NULL);
559 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
560
561 if (zap_f_phys(zap)->zap_ptrtbl.zt_blk == 0) {
562 ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) = blk;
563 return (0);
564 } else {
565 return (zap_table_store(zap, &zap_f_phys(zap)->zap_ptrtbl,
566 idx, blk, tx));
567 }
568 }
569
570 static int
571 zap_deref_leaf(zap_t *zap, uint64_t h, dmu_tx_t *tx, krw_t lt, zap_leaf_t **lp)
572 {
573 uint64_t idx, blk;
574 int err;
575
576 ASSERT(zap->zap_dbuf == NULL ||
577 zap_f_phys(zap) == zap->zap_dbuf->db_data);
578 ASSERT3U(zap_f_phys(zap)->zap_magic, ==, ZAP_MAGIC);
579 idx = ZAP_HASH_IDX(h, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
580 err = zap_idx_to_blk(zap, idx, &blk);
581 if (err != 0)
582 return (err);
583 err = zap_get_leaf_byblk(zap, blk, tx, lt, lp);
584
585 ASSERT(err ||
586 ZAP_HASH_IDX(h, zap_leaf_phys(*lp)->l_hdr.lh_prefix_len) ==
587 zap_leaf_phys(*lp)->l_hdr.lh_prefix);
588 return (err);
589 }
590
591 static int
592 zap_expand_leaf(zap_name_t *zn, zap_leaf_t *l, dmu_tx_t *tx, zap_leaf_t **lp)
593 {
594 zap_t *zap = zn->zn_zap;
595 uint64_t hash = zn->zn_hash;
596 zap_leaf_t *nl;
597 int prefix_diff, i, err;
598 uint64_t sibling;
|
558 ASSERT(tx != NULL);
559 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
560
561 if (zap_f_phys(zap)->zap_ptrtbl.zt_blk == 0) {
562 ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) = blk;
563 return (0);
564 } else {
565 return (zap_table_store(zap, &zap_f_phys(zap)->zap_ptrtbl,
566 idx, blk, tx));
567 }
568 }
569
570 static int
571 zap_deref_leaf(zap_t *zap, uint64_t h, dmu_tx_t *tx, krw_t lt, zap_leaf_t **lp)
572 {
573 uint64_t idx, blk;
574 int err;
575
576 ASSERT(zap->zap_dbuf == NULL ||
577 zap_f_phys(zap) == zap->zap_dbuf->db_data);
578
579 /* Reality check for corrupt zap objects (leaf or header). */
580 if ((zap_f_phys(zap)->zap_block_type != ZBT_LEAF &&
581 zap_f_phys(zap)->zap_block_type != ZBT_HEADER) ||
582 zap_f_phys(zap)->zap_magic != ZAP_MAGIC) {
583 return (SET_ERROR(EIO));
584 }
585
586 idx = ZAP_HASH_IDX(h, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
587 err = zap_idx_to_blk(zap, idx, &blk);
588 if (err != 0)
589 return (err);
590 err = zap_get_leaf_byblk(zap, blk, tx, lt, lp);
591
592 ASSERT(err ||
593 ZAP_HASH_IDX(h, zap_leaf_phys(*lp)->l_hdr.lh_prefix_len) ==
594 zap_leaf_phys(*lp)->l_hdr.lh_prefix);
595 return (err);
596 }
597
598 static int
599 zap_expand_leaf(zap_name_t *zn, zap_leaf_t *l, dmu_tx_t *tx, zap_leaf_t **lp)
600 {
601 zap_t *zap = zn->zn_zap;
602 uint64_t hash = zn->zn_hash;
603 zap_leaf_t *nl;
604 int prefix_diff, i, err;
605 uint64_t sibling;
|