Print this page
6842 Fix empty xattr dir causing lockup
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>


 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;