Print this page
4082 zfs receive gets EFBIG from dmu_tx_hold_free()
Reviewed by: Eric Schrock <eric.schrock@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>

@@ -671,10 +671,20 @@
 
         err = dnode_hold(os, object, FTAG, &dn);
         if (err != 0)
                 return (err);
         err = dmu_free_long_range_impl(os, dn, offset, length);
+
+        /*
+         * It is important to zero out the maxblkid when freeing the entire
+         * file, so that (a) subsequent calls to dmu_free_long_range_impl()
+         * will take the fast path, and (b) dnode_reallocate() can verify
+         * that the entire file has been freed.
+         */
+        if (offset == 0 && length == DMU_OBJECT_END)
+                dn->dn_maxblkid = 0;
+
         dnode_rele(dn, FTAG);
         return (err);
 }
 
 int