btrfs: add optimized version of eb to eb copy
authorDavid Sterba <dsterba@suse.com>
Tue, 8 Nov 2016 17:30:31 +0000 (18:30 +0100)
committerDavid Sterba <dsterba@suse.com>
Wed, 30 Nov 2016 12:45:17 +0000 (13:45 +0100)
Using copy_extent_buffer is suitable for copying betwenn buffers from an
arbitrary offset and deals with page boundaries. This is not necessary
when doing a full extent_buffer-to-extent_buffer copy. We can utilize
the copy_page helper as well.

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ctree.c
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h

index be362b776138e909687d2189800e9a20bd0c83dd..25286a5912fc634e7a94cbaa8f1c6214fa97fbd4 100644 (file)
@@ -260,7 +260,7 @@ int btrfs_copy_root(struct btrfs_trans_handle *trans,
        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);
@@ -1129,7 +1129,7 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,
 
        /* 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);
index 9f8a1a331c6128fdeeb42a9115c8130f45a52bfe..d24af9dc76c7a315c1ebbd3b72ec3fd2472240af 100644 (file)
@@ -5546,6 +5546,20 @@ void memzero_extent_buffer(struct extent_buffer *eb, unsigned long start,
        }
 }
 
+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)
index 12fe17523df259a52d1de356819d521c271a0524..ae64c1917d0a30d5ac8f3767f7a3eb6d5ebcddc1 100644 (file)
@@ -410,6 +410,8 @@ void write_extent_buffer_chunk_tree_uuid(struct extent_buffer *eb,
                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);