if (IS_ERR(cow))
                return PTR_ERR(cow);
 
-       copy_extent_buffer(cow, buf, 0, 0, cow->len);
+       copy_extent_buffer_full(cow, buf);
        btrfs_set_header_bytenr(cow, cow->start);
        btrfs_set_header_generation(cow, trans->transid);
        btrfs_set_header_backref_rev(cow, BTRFS_MIXED_BACKREF_REV);
 
        /* cow is set to blocking by btrfs_init_new_buffer */
 
-       copy_extent_buffer(cow, buf, 0, 0, cow->len);
+       copy_extent_buffer_full(cow, buf);
        btrfs_set_header_bytenr(cow, cow->start);
        btrfs_set_header_generation(cow, trans->transid);
        btrfs_set_header_backref_rev(cow, BTRFS_MIXED_BACKREF_REV);
 
        }
 }
 
+void copy_extent_buffer_full(struct extent_buffer *dst,
+                            struct extent_buffer *src)
+{
+       int i;
+       unsigned num_pages;
+
+       ASSERT(dst->len == src->len);
+
+       num_pages = num_extent_pages(dst->start, dst->len);
+       for (i = 0; i < num_pages; i++)
+               copy_page(page_address(dst->pages[i]),
+                               page_address(src->pages[i]));
+}
+
 void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
                        unsigned long dst_offset, unsigned long src_offset,
                        unsigned long len)
 
                const void *src);
 void write_extent_buffer(struct extent_buffer *eb, const void *src,
                         unsigned long start, unsigned long len);
+void copy_extent_buffer_full(struct extent_buffer *dst,
+                            struct extent_buffer *src);
 void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
                        unsigned long dst_offset, unsigned long src_offset,
                        unsigned long len);