Print this page
4374 dn_free_ranges should use range_tree_t
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Max Grossman <max.grossman@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Approved by: Dan McDonald <danmcd@omniti.com>

@@ -19,11 +19,11 @@
  * CDDL HEADER END
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
- * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
  * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
  * Copyright (c) 2013, Joyent, Inc. All rights reserved.
  */
 
 #include <sys/zfs_context.h>

@@ -38,10 +38,11 @@
 #include <sys/spa.h>
 #include <sys/zio.h>
 #include <sys/dmu_zfetch.h>
 #include <sys/sa.h>
 #include <sys/sa_impl.h>
+#include <sys/range_tree.h>
 
 /*
  * Number of times that zfs_free_range() took the slow path while doing
  * a zfs receive.  A nonzero value indicates a potential performance problem.
  */

@@ -1175,11 +1176,14 @@
          * happened after the free.
          */
         if (db->db_level == 0 && db->db_blkid != DMU_BONUS_BLKID &&
             db->db_blkid != DMU_SPILL_BLKID) {
                 mutex_enter(&dn->dn_mtx);
-                dnode_clear_range(dn, db->db_blkid, 1, tx);
+                if (dn->dn_free_ranges[txgoff] != NULL) {
+                        range_tree_clear(dn->dn_free_ranges[txgoff],
+                            db->db_blkid, 1);
+                }
                 mutex_exit(&dn->dn_mtx);
                 db->db_freed_in_flight = FALSE;
         }
 
         /*