Print this page
6841 Undirty freed spill blocks
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/dbuf.c
          +++ new/usr/src/uts/common/fs/zfs/dbuf.c
↓ open down ↓ 900 lines elided ↑ open up ↑
 901  901   * receive; see comment below for details.
 902  902   */
 903  903  void
 904  904  dbuf_free_range(dnode_t *dn, uint64_t start_blkid, uint64_t end_blkid,
 905  905      dmu_tx_t *tx)
 906  906  {
 907  907          dmu_buf_impl_t db_search;
 908  908          dmu_buf_impl_t *db, *db_next;
 909  909          uint64_t txg = tx->tx_txg;
 910  910          avl_index_t where;
      911 +        boolean_t freespill =
      912 +            (start_blkid == DMU_SPILL_BLKID || end_blkid == DMU_SPILL_BLKID);
 911  913  
 912      -        if (end_blkid > dn->dn_maxblkid && (end_blkid != DMU_SPILL_BLKID))
      914 +        if (end_blkid > dn->dn_maxblkid && !freespill)
 913  915                  end_blkid = dn->dn_maxblkid;
 914  916          dprintf_dnode(dn, "start=%llu end=%llu\n", start_blkid, end_blkid);
 915  917  
 916  918          db_search.db_level = 0;
 917  919          db_search.db_blkid = start_blkid;
 918  920          db_search.db_state = DB_SEARCH;
 919  921  
 920  922          mutex_enter(&dn->dn_dbufs_mtx);
 921      -        if (start_blkid >= dn->dn_unlisted_l0_blkid) {
      923 +        if (start_blkid >= dn->dn_unlisted_l0_blkid && !freespill) {
 922  924                  /* There can't be any dbufs in this range; no need to search. */
 923  925  #ifdef DEBUG
 924  926                  db = avl_find(&dn->dn_dbufs, &db_search, &where);
 925  927                  ASSERT3P(db, ==, NULL);
 926  928                  db = avl_nearest(&dn->dn_dbufs, where, AVL_AFTER);
 927  929                  ASSERT(db == NULL || db->db_level > 0);
 928  930  #endif
 929  931                  mutex_exit(&dn->dn_dbufs_mtx);
 930  932                  return;
 931  933          } else if (dmu_objset_is_receiving(dn->dn_objset)) {
↓ open down ↓ 2281 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX