Illumos #3006
[zfs.git] / module / zfs / dnode_sync.c
index 7d304b2..76e6037 100644 (file)
  *
  * CDDL HEADER END
  */
+
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
  */
 
 #include <sys/zfs_context.h>
@@ -272,7 +274,7 @@ free_children(dmu_buf_impl_t *db, uint64_t blkid, uint64_t nblks, int trunc,
                        continue;
                rw_enter(&dn->dn_struct_rwlock, RW_READER);
                err = dbuf_hold_impl(dn, db->db_level-1, i, TRUE, FTAG, &subdb);
-               ASSERT3U(err, ==, 0);
+               ASSERT0(err);
                rw_exit(&dn->dn_struct_rwlock);
 
                if (free_children(subdb, blkid, nblks, trunc, tx) == ALL) {
@@ -292,7 +294,7 @@ free_children(dmu_buf_impl_t *db, uint64_t blkid, uint64_t nblks, int trunc,
                        continue;
                else if (i == end && !trunc)
                        continue;
-               ASSERT3U(bp->blk_birth, ==, 0);
+               ASSERT0(bp->blk_birth);
        }
 #endif
        ASSERT(all || blocks_freed == 0 || db->db_last_dirty);
@@ -348,7 +350,7 @@ dnode_sync_free_range(dnode_t *dn, uint64_t blkid, uint64_t nblks, dmu_tx_t *tx)
                        continue;
                rw_enter(&dn->dn_struct_rwlock, RW_READER);
                err = dbuf_hold_impl(dn, dnlevel-1, i, TRUE, FTAG, &db);
-               ASSERT3U(err, ==, 0);
+               ASSERT0(err);
                rw_exit(&dn->dn_struct_rwlock);
 
                if (free_children(db, blkid, nblks, trunc, tx) == ALL) {
@@ -418,9 +420,13 @@ dnode_evict_dbufs(dnode_t *dn)
                if (evicting)
                        delay(1);
                pass++;
-               ASSERT(pass < 100); /* sanity check */
+               if ((pass % 100) == 0)
+                       dprintf("Exceeded %d passes evicting dbufs\n", pass);
        } while (progress);
 
+       if (pass >= 100)
+               dprintf("Required %d passes to evict dbufs\n", pass);
+
        rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
        if (dn->dn_bonus && refcount_is_zero(&dn->dn_bonus->db_holds)) {
                mutex_enter(&dn->dn_bonus->db_mtx);
@@ -469,7 +475,7 @@ dnode_sync_free(dnode_t *dn, dmu_tx_t *tx)
         * Our contents should have been freed in dnode_sync() by the
         * free range record inserted by the caller of dnode_free().
         */
-       ASSERT3U(DN_USED_BYTES(dn->dn_phys), ==, 0);
+       ASSERT0(DN_USED_BYTES(dn->dn_phys));
        ASSERT(BP_IS_HOLE(dn->dn_phys->dn_blkptr));
 
        dnode_undirty_dbufs(&dn->dn_dirty_records[txgoff]);
@@ -594,7 +600,7 @@ dnode_sync(dnode_t *dn, dmu_tx_t *tx)
        }
 
        if (dn->dn_next_bonustype[txgoff]) {
-               ASSERT(dn->dn_next_bonustype[txgoff] < DMU_OT_NUMTYPES);
+               ASSERT(DMU_OT_IS_VALID(dn->dn_next_bonustype[txgoff]));
                dnp->dn_bonustype = dn->dn_next_bonustype[txgoff];
                dn->dn_next_bonustype[txgoff] = 0;
        }
@@ -662,9 +668,10 @@ dnode_sync(dnode_t *dn, dmu_tx_t *tx)
                        int i;
                        ASSERT(dn->dn_next_nblkptr[txgoff] < dnp->dn_nblkptr);
                        /* the blkptrs we are losing better be unallocated */
-                       for (i = dn->dn_next_nblkptr[txgoff];
-                           i < dnp->dn_nblkptr; i++)
-                               ASSERT(BP_IS_HOLE(&dnp->dn_blkptr[i]));
+                       for (i = 0; i < dnp->dn_nblkptr; i++) {
+                               if (i >= dn->dn_next_nblkptr[txgoff])
+                                       ASSERT(BP_IS_HOLE(&dnp->dn_blkptr[i]));
+                       }
 #endif
                }
                mutex_enter(&dn->dn_mtx);