272 for (i = start; i <= end; i++, bp++) { |
272 for (i = start; i <= end; i++, bp++) { |
273 if (BP_IS_HOLE(bp)) |
273 if (BP_IS_HOLE(bp)) |
274 continue; |
274 continue; |
275 rw_enter(&dn->dn_struct_rwlock, RW_READER); |
275 rw_enter(&dn->dn_struct_rwlock, RW_READER); |
276 err = dbuf_hold_impl(dn, db->db_level-1, i, TRUE, FTAG, &subdb); |
276 err = dbuf_hold_impl(dn, db->db_level-1, i, TRUE, FTAG, &subdb); |
277 ASSERT3U(err, ==, 0); |
277 ASSERT0(err); |
278 rw_exit(&dn->dn_struct_rwlock); |
278 rw_exit(&dn->dn_struct_rwlock); |
279 |
279 |
280 if (free_children(subdb, blkid, nblks, trunc, tx) == ALL) { |
280 if (free_children(subdb, blkid, nblks, trunc, tx) == ALL) { |
281 ASSERT3P(subdb->db_blkptr, ==, bp); |
281 ASSERT3P(subdb->db_blkptr, ==, bp); |
282 blocks_freed += free_blocks(dn, bp, 1, tx); |
282 blocks_freed += free_blocks(dn, bp, 1, tx); |
292 for (i = start; i <= end; i++, bp++) { |
292 for (i = start; i <= end; i++, bp++) { |
293 if (i == start && blkid != 0) |
293 if (i == start && blkid != 0) |
294 continue; |
294 continue; |
295 else if (i == end && !trunc) |
295 else if (i == end && !trunc) |
296 continue; |
296 continue; |
297 ASSERT3U(bp->blk_birth, ==, 0); |
297 ASSERT0(bp->blk_birth); |
298 } |
298 } |
299 #endif |
299 #endif |
300 ASSERT(all || blocks_freed == 0 || db->db_last_dirty); |
300 ASSERT(all || blocks_freed == 0 || db->db_last_dirty); |
301 return (all ? ALL : blocks_freed); |
301 return (all ? ALL : blocks_freed); |
302 } |
302 } |
348 for (i = start; i <= end; i++, bp++) { |
348 for (i = start; i <= end; i++, bp++) { |
349 if (BP_IS_HOLE(bp)) |
349 if (BP_IS_HOLE(bp)) |
350 continue; |
350 continue; |
351 rw_enter(&dn->dn_struct_rwlock, RW_READER); |
351 rw_enter(&dn->dn_struct_rwlock, RW_READER); |
352 err = dbuf_hold_impl(dn, dnlevel-1, i, TRUE, FTAG, &db); |
352 err = dbuf_hold_impl(dn, dnlevel-1, i, TRUE, FTAG, &db); |
353 ASSERT3U(err, ==, 0); |
353 ASSERT0(err); |
354 rw_exit(&dn->dn_struct_rwlock); |
354 rw_exit(&dn->dn_struct_rwlock); |
355 |
355 |
356 if (free_children(db, blkid, nblks, trunc, tx) == ALL) { |
356 if (free_children(db, blkid, nblks, trunc, tx) == ALL) { |
357 ASSERT3P(db->db_blkptr, ==, bp); |
357 ASSERT3P(db->db_blkptr, ==, bp); |
358 (void) free_blocks(dn, bp, 1, tx); |
358 (void) free_blocks(dn, bp, 1, tx); |
469 |
469 |
470 /* |
470 /* |
471 * Our contents should have been freed in dnode_sync() by the |
471 * Our contents should have been freed in dnode_sync() by the |
472 * free range record inserted by the caller of dnode_free(). |
472 * free range record inserted by the caller of dnode_free(). |
473 */ |
473 */ |
474 ASSERT3U(DN_USED_BYTES(dn->dn_phys), ==, 0); |
474 ASSERT0(DN_USED_BYTES(dn->dn_phys)); |
475 ASSERT(BP_IS_HOLE(dn->dn_phys->dn_blkptr)); |
475 ASSERT(BP_IS_HOLE(dn->dn_phys->dn_blkptr)); |
476 |
476 |
477 dnode_undirty_dbufs(&dn->dn_dirty_records[txgoff]); |
477 dnode_undirty_dbufs(&dn->dn_dirty_records[txgoff]); |
478 dnode_evict_dbufs(dn); |
478 dnode_evict_dbufs(dn); |
479 ASSERT3P(list_head(&dn->dn_dbufs), ==, NULL); |
479 ASSERT3P(list_head(&dn->dn_dbufs), ==, NULL); |