Misc cleanups
David Sterba
maintainercover Misc cleanups
Hi,
here's a bunch of cleanups and potential speed improvements when copying extent buffer pages, there are some special cases. I haven't done any performance measurements though.
Patchset target is 4.10, can be found in branch misc-cleanups-4.10 in my repos.
----------------------------------------------------------------
David Sterba (12):
btrfs: reada, cleanup remove unneeded variable in __readahead_hook
btrfs: reada, remove unused parameter from __readahead_hook
btrfs: reada, sink start parameter to btree_readahead_hook
btrfs: reada, remove pointless BUG_ON in reada_find_extent
btrfs: reada, remove pointless BUG_ON check for fs_info
btrfs: remove trivial helper btrfs_find_tree_block
btrfs: delete unused member from superblock
btrfs: introduce helpers for updating eb uuids
btrfs: use new helpers to set uuids in eb
btrfs: use specialized page copying helpers in btrfs_clone_extent_buffer
btrfs: remove constant parameter to memset_extent_buffer and rename it
btrfs: add optimized version of eb to eb copy
fs/btrfs/ctree.c | 49 ++++++++++++++++------------------------ fs/btrfs/ctree.h | 3 +-- fs/btrfs/disk-io.c | 26 +++++++-------------- fs/btrfs/disk-io.h | 2 -- fs/btrfs/extent-tree.c | 4 ++-- fs/btrfs/extent_io.c | 47 +++++++++++++++++++++++++++++++++----- fs/btrfs/extent_io.h | 9 ++++++-- fs/btrfs/file-item.c | 2 +- fs/btrfs/free-space-cache.c | 4 ++-- fs/btrfs/inode.c | 2 +- fs/btrfs/ioctl.c | 10 ++++---- fs/btrfs/reada.c | 24 ++++++-------------- fs/btrfs/relocation.c | 2 +- fs/btrfs/tests/extent-io-tests.c | 2 +- fs/btrfs/volumes.c | 6 ++--- 15 files changed, 98 insertions(+), 94 deletions(-)
David Sterba
maintainerPATCH 1/12 btrfs: reada, cleanup remove unneeded variable in __readahead_hook
We can't touch the eb directly in case the function is called with a non-zero error, so we can read the eb level when needed.
--- fs/btrfs/reada.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
fs/btrfs/reada.c +1 -5
@@ -109,16 +109,12 @@ static void __readahead_hook(struct btrfs_fs_info *fs_info, struct reada_extent *re, struct extent_buffer *eb, u64 start, int err) { - int level = 0; int nritems;int i;u64 bytenr;u64 generation;struct list_head list; -if (eb) - level =btrfs_header_level (eb); -spin_lock (&re->lock);/* * just take the full list from the extent. afterwards we
@@ -143,7 +139,7 @@ static void __readahead_hook(struct btrfs_fs_info *fs_info,* trigger more readahead depending from the content, e.g. * fetch the checksums for the extents in the leaf. */ -if (!level) +if (!btrfs_header_level (eb)) goto cleanup; nritems =btrfs_header_nritems (eb);
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 2/12 btrfs: reada, remove unused parameter from __readahead_hook
In reply to David Sterba'start' is not used since "btrfs: reada: Pass reada_extent into __readahead_hook directly" (6e39dbe8b9e55280c).
--- fs/btrfs/reada.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
fs/btrfs/reada.c +4 -4
@@ -107,7 +107,7 @@ static int reada_add_block(struct reada_control *rc, u64 logical,/* in case of err, eb might be NULL */ static void __readahead_hook (struct btrfs_fs_info *fs_info,struct reada_extent *re,struct extent_buffer *eb, -u64 start,int err) +int err) {int nritems;int i;
@@ -231,7 +231,7 @@ int btree_readahead_hook(struct btrfs_fs_info *fs_info, goto start_machine; } -__readahead_hook (fs_info, re, eb, start, err); +__readahead_hook (fs_info, re, eb, err);reada_extent_put (fs_info, re);/* our ref */ start_machine:
@@ -713,9 +713,9 @@ static int reada_start_machine_dev(struct btrfs_fs_info *fs_info, ret =reada_tree_block_flagged (fs_info->extent_root, logical, mirror_num, &eb);if (ret) -__readahead_hook (fs_info, re,NULL , logical, ret); +__readahead_hook (fs_info, re,NULL , ret);else if (eb) -__readahead_hook (fs_info, re, eb, eb->start, ret); +__readahead_hook (fs_info, re, eb, ret);if (eb)free_extent_buffer (eb);
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 3/12 btrfs: reada, sink start parameter to btree_readahead_hook
In reply to David SterbaOriginally, the eb and start were passed separately in case eb is NULL. Since the readahead has been refactored in 4.6, this is not true anymore and we can get rid of the parameter.
--- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 4 ++-- fs/btrfs/reada.c | 8 ++------ 3 files changed, 5 insertions(+), 9 deletions(-)
fs/btrfs/ctree.h +1 -1
@@ -3661,7 +3661,7 @@ struct reada_control *btrfs_reada_add(struct btrfs_root *root,int btrfs_reada_wait (void *handle);void btrfs_reada_detach (void *handle);int btree_readahead_hook (struct btrfs_fs_info *fs_info, -struct extent_buffer *eb,u64 start,int err); +struct extent_buffer *eb,int err);static inline int is_fstree (u64 rootid) {
fs/btrfs/disk-io.c +2 -2
@@ -747,7 +747,7 @@ static int btree_readpage_end_io_hook(struct btrfs_io_bio *io_bio, err:if (reads_done &&test_and_clear_bit (EXTENT_BUFFER_READAHEAD , &eb->bflags)) -btree_readahead_hook (fs_info, eb, eb->start, ret); +btree_readahead_hook (fs_info, eb, ret);if (ret) {/*
@@ -772,7 +772,7 @@ static int btree_io_failed_hook(struct page *page, int failed_mirror) eb->read_mirror = failed_mirror;atomic_dec (&eb->io_pages);if (test_and_clear_bit (EXTENT_BUFFER_READAHEAD , &eb->bflags)) -btree_readahead_hook (eb->fs_info, eb, eb->start, -EIO ); +btree_readahead_hook (eb->fs_info, eb, -EIO );return -EIO ;/* we fixed nothing */ }
fs/btrfs/reada.c +2 -6
@@ -209,12 +209,8 @@ static void __readahead_hook(struct btrfs_fs_info *fs_info,return ; } -/* -* start is passed separately in case eb in NULL, which may be the case with -* failed I/O -*/ int btree_readahead_hook (struct btrfs_fs_info *fs_info, -struct extent_buffer *eb,u64 start,int err) +struct extent_buffer *eb,int err) {int ret =0 ;struct reada_extent *re;
@@ -222,7 +218,7 @@ int btree_readahead_hook(struct btrfs_fs_info *fs_info,/* find extent */ spin_lock (&fs_info->reada_lock); re =radix_tree_lookup (&fs_info->reada_tree, - start >>PAGE_SHIFT ); + eb->start >>PAGE_SHIFT );if (re) re->refcnt++;spin_unlock (&fs_info->reada_lock);
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 4/12 btrfs: reada, remove pointless BUG_ON in reada_find_extent
In reply to David SterbaThe lock is held, we make the same lookup that previously failed with EEXIST and we don't insert NULL pointers.
--- fs/btrfs/reada.c | 1 - 1 file changed, 1 deletion(-)
fs/btrfs/reada.c +0 -1
@@ -393,7 +393,6 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root, ret =radix_tree_insert (&fs_info->reada_tree, index, re);if (ret == -EEXIST ) { re_exist =radix_tree_lookup (&fs_info->reada_tree, index); -BUG_ON (!re_exist); re_exist->refcnt++;spin_unlock (&fs_info->reada_lock);btrfs_dev_replace_unlock (&fs_info->dev_replace,0 );
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 5/12 btrfs: reada, remove pointless BUG_ON check for fs_info
In reply to David SterbaWe dereference fs_info several times, besides that post-mount functions should never see a NULL fs_info.
--- fs/btrfs/reada.c | 1 - 1 file changed, 1 deletion(-)
fs/btrfs/reada.c +0 -1
@@ -439,7 +439,6 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,/* ignore whether the entry was inserted */ radix_tree_delete (&dev->reada_extents, index); } -BUG_ON (fs_info ==NULL );radix_tree_delete (&fs_info->reada_tree, index);spin_unlock (&fs_info->reada_lock);btrfs_dev_replace_unlock (&fs_info->dev_replace,0 );
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 6/12 btrfs: remove trivial helper btrfs_find_tree_block
In reply to David SterbaDuring the time, the function has been shrunk to the point that it just calls find_extent_buffer, just passing the parameters.
--- fs/btrfs/ctree.c | 10 +++++----- fs/btrfs/disk-io.c | 8 +------- fs/btrfs/disk-io.h | 2 -- fs/btrfs/extent-tree.c | 2 +- 4 files changed, 7 insertions(+), 15 deletions(-)
fs/btrfs/ctree.c +5 -5
@@ -1670,7 +1670,7 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans,continue ; } - cur =btrfs_find_tree_block (root->fs_info, blocknr); + cur =find_extent_buffer (root->fs_info, blocknr);if (cur) uptodate =btrfs_buffer_uptodate (cur, gen,0 );else
@@ -2255,7 +2255,7 @@ static void reada_for_search(struct btrfs_root *root, search =btrfs_node_blockptr (node, slot); blocksize = root->nodesize; - eb =btrfs_find_tree_block (root->fs_info, search); + eb =find_extent_buffer (root->fs_info, search);if (eb) {free_extent_buffer (eb);return ;
@@ -2314,7 +2314,7 @@ static noinline void reada_for_balance(struct btrfs_root *root,if (slot >0 ) { block1 =btrfs_node_blockptr (parent, slot -1 ); gen =btrfs_node_ptr_generation (parent, slot -1 ); - eb =btrfs_find_tree_block (root->fs_info, block1); + eb =find_extent_buffer (root->fs_info, block1);/* * if we get -eagain from btrfs_buffer_uptodate, we * don't want to return eagain here. That will loop
@@ -2327,7 +2327,7 @@ static noinline void reada_for_balance(struct btrfs_root *root,if (slot +1 < nritems) { block2 =btrfs_node_blockptr (parent, slot +1 ); gen =btrfs_node_ptr_generation (parent, slot +1 ); - eb =btrfs_find_tree_block (root->fs_info, block2); + eb =find_extent_buffer (root->fs_info, block2);if (eb &&btrfs_buffer_uptodate (eb, gen,1 ) !=0 ) block2 =0 ;free_extent_buffer (eb);
@@ -2445,7 +2445,7 @@ read_block_for_search(struct btrfs_trans_handle *trans, blocknr =btrfs_node_blockptr (b, slot); gen =btrfs_node_ptr_generation (b, slot); - tmp =btrfs_find_tree_block (root->fs_info, blocknr); + tmp =find_extent_buffer (root->fs_info, blocknr);if (tmp) {/* first we do an atomic uptodate check */ if (btrfs_buffer_uptodate (tmp, gen,1 ) >0 ) {
fs/btrfs/disk-io.c +1 -7
@@ -1191,12 +1191,6 @@ int reada_tree_block_flagged(struct btrfs_root *root, u64 bytenr,return 0 ; } -struct extent_buffer *btrfs_find_tree_block (struct btrfs_fs_info *fs_info, -u64 bytenr) -{ -return find_extent_buffer (fs_info, bytenr); -} -struct extent_buffer *btrfs_find_create_tree_block (struct btrfs_root *root,u64 bytenr) {
@@ -4452,7 +4446,7 @@ static int btrfs_destroy_marked_extents(struct btrfs_root *root,clear_extent_bits (dirty_pages, start, end, mark);while (start <= end) { - eb =btrfs_find_tree_block (root->fs_info, start); + eb =find_extent_buffer (root->fs_info, start); start += root->nodesize;if (!eb)continue ;
fs/btrfs/disk-io.h +0 -2
@@ -63,8 +63,6 @@ struct buffer_head *btrfs_read_dev_super(struct block_device *bdev);int btrfs_read_dev_one_super (struct block_device *bdev,int copy_num,struct buffer_head **bh_ret);int btrfs_commit_super (struct btrfs_root *root); -struct extent_buffer *btrfs_find_tree_block (struct btrfs_fs_info *fs_info, -u64 bytenr);struct btrfs_root *btrfs_read_fs_root (struct btrfs_root *tree_root,struct btrfs_key *location);int btrfs_init_fs_root (struct btrfs_root *root);
fs/btrfs/extent-tree.c +1 -1
@@ -8873,7 +8873,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, bytenr =btrfs_node_blockptr (path->nodes[level], path->slots[level]); blocksize = root->nodesize; - next =btrfs_find_tree_block (root->fs_info, bytenr); + next =find_extent_buffer (root->fs_info, bytenr);if (!next) { next =btrfs_find_create_tree_block (root, bytenr);if (IS_ERR (next))
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 7/12 btrfs: delete unused member from superblock
In reply to David Sterba __bdev' has never been used since
0b86a832a1f38abec695864ec2eaedc9d2383f1b (2008).
--- fs/btrfs/ctree.h | 1 - 1 file changed, 1 deletion(-)
fs/btrfs/ctree.h +0 -1
@@ -798,7 +798,6 @@ struct btrfs_fs_info {spinlock_t super_lock;struct btrfs_super_block *super_copy;struct btrfs_super_block *super_for_commit; -struct block_device *__bdev;struct super_block *sb;struct inode *btree_inode;struct backing_dev_info bdi;
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 8/12 btrfs: introduce helpers for updating eb uuids
In reply to David SterbaThe fsid and chunk tree uuid are always located in the first page, we don't need the to use write_extent_buffer.
--- fs/btrfs/extent_io.c | 21 +++++++++++++++++++++ fs/btrfs/extent_io.h | 3 +++ 2 files changed, 24 insertions(+)
fs/btrfs/extent_io.c +21 -0
@@ -5465,6 +5465,27 @@ int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,return ret; } +void write_extent_buffer_chunk_tree_uuid (struct extent_buffer *eb, +const void *srcv) +{ +char *kaddr; + +WARN_ON (!PageUptodate (eb->pages[0 ])); + kaddr =page_address (eb->pages[0 ]); +memcpy (kaddr + offsetof(struct btrfs_header , chunk_tree_uuid), srcv, +BTRFS_FSID_SIZE ); +} + +void write_extent_buffer_fsid (struct extent_buffer *eb,const void *srcv) +{ +char *kaddr; + +WARN_ON (!PageUptodate (eb->pages[0 ])); + kaddr =page_address (eb->pages[0 ]); +memcpy (kaddr + offsetof(struct btrfs_header , fsid), srcv, +BTRFS_FSID_SIZE ); +} +void write_extent_buffer (struct extent_buffer *eb,const void *srcv,unsigned long start,unsigned long len) {
fs/btrfs/extent_io.h +3 -0
@@ -405,6 +405,9 @@ void read_extent_buffer(struct extent_buffer *eb, void *dst,int read_extent_buffer_to_user (struct extent_buffer *eb,void __user *dst,unsigned long start,unsigned long len); +void write_extent_buffer_fsid (struct extent_buffer *eb,const void *src); +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(struct extent_buffer *dst, struct extent_buffer *src,
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 9/12 btrfs: use new helpers to set uuids in eb
In reply to David Sterba--- fs/btrfs/ctree.c | 29 +++++++++-------------------- fs/btrfs/disk-io.c | 10 +++------- fs/btrfs/ioctl.c | 8 +++----- fs/btrfs/volumes.c | 4 ++-- 4 files changed, 17 insertions(+), 34 deletions(-)
fs/btrfs/ctree.c +9 -20
@@ -271,8 +271,7 @@ int btrfs_copy_root(struct btrfs_trans_handle *trans,else btrfs_set_header_owner (cow, new_root_objectid); -write_extent_buffer (cow, root->fs_info->fsid,btrfs_header_fsid (), -BTRFS_FSID_SIZE ); +write_extent_buffer_fsid (cow, root->fs_info->fsid);WARN_ON (btrfs_header_generation (buf) > trans->transid);if (new_root_objectid ==BTRFS_TREE_RELOC_OBJECTID )
@@ -1141,8 +1140,7 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,else btrfs_set_header_owner (cow, root->root_key.objectid); -write_extent_buffer (cow, root->fs_info->fsid,btrfs_header_fsid (), -BTRFS_FSID_SIZE ); +write_extent_buffer_fsid (cow, root->fs_info->fsid); ret =update_ref_for_cow (trans, root, buf, cow, &last_ref);if (ret) {
@@ -3358,11 +3356,8 @@ static noinline int insert_new_root(struct btrfs_trans_handle *trans,btrfs_set_header_backref_rev (c,BTRFS_MIXED_BACKREF_REV );btrfs_set_header_owner (c, root->root_key.objectid); -write_extent_buffer (c, root->fs_info->fsid,btrfs_header_fsid (), -BTRFS_FSID_SIZE ); - -write_extent_buffer (c, root->fs_info->chunk_tree_uuid, -btrfs_header_chunk_tree_uuid (c),BTRFS_UUID_SIZE ); +write_extent_buffer_fsid (c, root->fs_info->fsid); +write_extent_buffer_chunk_tree_uuid (c, root->fs_info->chunk_tree_uuid);btrfs_set_node_key (c, &lower_key,0 );btrfs_set_node_blockptr (c,0 , lower->start);
@@ -3495,11 +3490,9 @@ static noinline int split_node(struct btrfs_trans_handle *trans,btrfs_set_header_generation (split, trans->transid);btrfs_set_header_backref_rev (split,BTRFS_MIXED_BACKREF_REV );btrfs_set_header_owner (split, root->root_key.objectid); -write_extent_buffer (split, root->fs_info->fsid, -btrfs_header_fsid (),BTRFS_FSID_SIZE ); -write_extent_buffer (split, root->fs_info->chunk_tree_uuid, -btrfs_header_chunk_tree_uuid (split), -BTRFS_UUID_SIZE ); +write_extent_buffer_fsid (split, root->fs_info->fsid); +write_extent_buffer_chunk_tree_uuid (split, + root->fs_info->chunk_tree_uuid); ret =tree_mod_log_eb_copy (root->fs_info, split, c,0 , mid, c_nritems - mid);
@@ -4283,12 +4276,8 @@ static noinline int split_leaf(struct btrfs_trans_handle *trans,btrfs_set_header_backref_rev (right,BTRFS_MIXED_BACKREF_REV );btrfs_set_header_owner (right, root->root_key.objectid);btrfs_set_header_level (right,0 ); -write_extent_buffer (right, fs_info->fsid, -btrfs_header_fsid (),BTRFS_FSID_SIZE ); - -write_extent_buffer (right, fs_info->chunk_tree_uuid, -btrfs_header_chunk_tree_uuid (right), -BTRFS_UUID_SIZE ); +write_extent_buffer_fsid (right, fs_info->fsid); +write_extent_buffer_chunk_tree_uuid (right, fs_info->chunk_tree_uuid);if (split ==0 ) {if (mid <= slot) {
fs/btrfs/disk-io.c +3 -7
@@ -1419,11 +1419,8 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans,btrfs_set_header_owner (leaf, objectid); root->node = leaf; -write_extent_buffer (leaf, fs_info->fsid,btrfs_header_fsid (), -BTRFS_FSID_SIZE ); -write_extent_buffer (leaf, fs_info->chunk_tree_uuid, -btrfs_header_chunk_tree_uuid (leaf), -BTRFS_UUID_SIZE ); +write_extent_buffer_fsid (leaf, fs_info->fsid); +write_extent_buffer_chunk_tree_uuid (leaf, fs_info->chunk_tree_uuid);btrfs_mark_buffer_dirty (leaf); root->commit_root =btrfs_root_node (root);
@@ -1506,8 +1503,7 @@ static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,btrfs_set_header_owner (leaf,BTRFS_TREE_LOG_OBJECTID ); root->node = leaf; -write_extent_buffer (root->node, root->fs_info->fsid, -btrfs_header_fsid (),BTRFS_FSID_SIZE ); +write_extent_buffer_fsid (root->node, root->fs_info->fsid);btrfs_mark_buffer_dirty (root->node);btrfs_tree_unlock (root->node);return root;
fs/btrfs/ioctl.c +3 -5
@@ -508,11 +508,9 @@ static noinline int create_subvol(struct inode *dir,btrfs_set_header_backref_rev (leaf,BTRFS_MIXED_BACKREF_REV );btrfs_set_header_owner (leaf, objectid); -write_extent_buffer (leaf, root->fs_info->fsid,btrfs_header_fsid (), -BTRFS_FSID_SIZE ); -write_extent_buffer (leaf, root->fs_info->chunk_tree_uuid, -btrfs_header_chunk_tree_uuid (leaf), -BTRFS_UUID_SIZE ); +write_extent_buffer_fsid (leaf, root->fs_info->fsid); +write_extent_buffer_chunk_tree_uuid (leaf, + root->fs_info->chunk_tree_uuid);btrfs_mark_buffer_dirty (leaf); inode_item = &root_item->inode;
fs/btrfs/volumes.c +2 -2
@@ -1595,8 +1595,8 @@ static int btrfs_alloc_dev_extent(struct btrfs_trans_handle *trans,btrfs_set_dev_extent_chunk_objectid (leaf, extent, chunk_objectid);btrfs_set_dev_extent_chunk_offset (leaf, extent, chunk_offset); -write_extent_buffer (leaf, root->fs_info->chunk_tree_uuid, -btrfs_dev_extent_chunk_tree_uuid (extent),BTRFS_UUID_SIZE ); +write_extent_buffer_chunk_tree_uuid (leaf, + root->fs_info->chunk_tree_uuid);btrfs_set_dev_extent_length (leaf, extent, num_bytes);btrfs_mark_buffer_dirty (leaf);
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 10/12 btrfs: use specialized page copying helpers in btrfs_clone_extent_buffer
In reply to David SterbaThe copy_page is usually optimized and can be faster than memcpy.
--- fs/btrfs/extent_io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/extent_io.c +1 -1
@@ -4720,9 +4720,9 @@ struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src)WARN_ON (PageDirty (p));SetPageUptodate (p); new->pages[i] = p; +copy_page (page_address (p),page_address (src->pages[i])); } -copy_extent_buffer (new, src,0 ,0 , src->len);set_bit (EXTENT_BUFFER_UPTODATE , &new->bflags);set_bit (EXTENT_BUFFER_DUMMY , &new->bflags);
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 11/12 btrfs: remove constant parameter to memset_extent_buffer and rename it
In reply to David SterbaThe only memset we do is to 0, so sink the parameter to the function and simplify all calls. Rename the function to reflect the behaviour.
--- fs/btrfs/ctree.c | 6 +++--- fs/btrfs/disk-io.c | 4 ++-- fs/btrfs/extent-tree.c | 2 +- fs/btrfs/extent_io.c | 10 +++++----- fs/btrfs/extent_io.h | 4 ++-- fs/btrfs/file-item.c | 2 +- fs/btrfs/free-space-cache.c | 4 ++-- fs/btrfs/inode.c | 2 +- fs/btrfs/ioctl.c | 2 +- fs/btrfs/relocation.c | 2 +- fs/btrfs/tests/extent-io-tests.c | 2 +- fs/btrfs/volumes.c | 2 +- 12 files changed, 21 insertions(+), 21 deletions(-)
fs/btrfs/ctree.c +3 -3
@@ -3348,7 +3348,7 @@ static noinline int insert_new_root(struct btrfs_trans_handle *trans,root_add_used (root, root->nodesize); -memset_extent_buffer (c,0 ,0 ,sizeof (struct btrfs_header )); +memzero_extent_buffer (c,0 ,sizeof (struct btrfs_header ));btrfs_set_header_nritems (c,1 );btrfs_set_header_level (c, level);btrfs_set_header_bytenr (c, c->start);
@@ -3484,7 +3484,7 @@ static noinline int split_node(struct btrfs_trans_handle *trans,root_add_used (root, root->nodesize); -memset_extent_buffer (split,0 ,0 ,sizeof (struct btrfs_header )); +memzero_extent_buffer (split,0 ,sizeof (struct btrfs_header ));btrfs_set_header_level (split,btrfs_header_level (c));btrfs_set_header_bytenr (split, split->start);btrfs_set_header_generation (split, trans->transid);
@@ -4270,7 +4270,7 @@ static noinline int split_leaf(struct btrfs_trans_handle *trans,root_add_used (root, root->nodesize); -memset_extent_buffer (right,0 ,0 ,sizeof (struct btrfs_header )); +memzero_extent_buffer (right,0 ,sizeof (struct btrfs_header ));btrfs_set_header_bytenr (right, right->start);btrfs_set_header_generation (right, trans->transid);btrfs_set_header_backref_rev (right,BTRFS_MIXED_BACKREF_REV );
fs/btrfs/disk-io.c +2 -2
@@ -1412,7 +1412,7 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, goto fail; } -memset_extent_buffer (leaf,0 ,0 ,sizeof (struct btrfs_header )); +memzero_extent_buffer (leaf,0 ,sizeof (struct btrfs_header ));btrfs_set_header_bytenr (leaf, leaf->start);btrfs_set_header_generation (leaf, trans->transid);btrfs_set_header_backref_rev (leaf,BTRFS_MIXED_BACKREF_REV );
@@ -1496,7 +1496,7 @@ static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,return ERR_CAST (leaf); } -memset_extent_buffer (leaf,0 ,0 ,sizeof (struct btrfs_header )); +memzero_extent_buffer (leaf,0 ,sizeof (struct btrfs_header ));btrfs_set_header_bytenr (leaf, leaf->start);btrfs_set_header_generation (leaf, trans->transid);btrfs_set_header_backref_rev (leaf,BTRFS_MIXED_BACKREF_REV );
fs/btrfs/extent-tree.c +1 -1
@@ -1114,7 +1114,7 @@ static int convert_extent_item_v0(struct btrfs_trans_handle *trans, BTRFS_BLOCK_FLAG_FULL_BACKREF); bi = (struct btrfs_tree_block_info *)(item +1 );/* FIXME: get first key of the block */ -memset_extent_buffer (leaf,0 , (unsigned long )bi,sizeof (*bi)); +memzero_extent_buffer (leaf, (unsigned long )bi,sizeof (*bi));btrfs_set_tree_block_level (leaf, bi, (int )owner); }else {btrfs_set_extent_flags (leaf, item,BTRFS_EXTENT_FLAG_DATA );
fs/btrfs/extent_io.c +5 -5
@@ -3743,7 +3743,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb,if (btrfs_header_level (eb) >0 ) { end =btrfs_node_key_ptr_offset (nritems); -memset_extent_buffer (eb,0 , end, eb->len - end); +memzero_extent_buffer (eb, end, eb->len - end); }else {/* * leaf:
@@ -3752,7 +3752,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb, start =btrfs_item_nr_offset (nritems); end =btrfs_leaf_data (eb) +leaf_data_end (fs_info->tree_root, eb); -memset_extent_buffer (eb,0 , start, end - start); +memzero_extent_buffer (eb, start, end - start); }for (i =0 ; i < num_pages; i++) {
@@ -5517,8 +5517,8 @@ void write_extent_buffer(struct extent_buffer *eb, const void *srcv, } } -void memset_extent_buffer (struct extent_buffer *eb,char c, -unsigned long start,unsigned long len) +void memzero_extent_buffer (struct extent_buffer *eb,unsigned long start, +unsigned long len) {size_t cur;size_t offset;
@@ -5538,7 +5538,7 @@ void memset_extent_buffer(struct extent_buffer *eb, char c, cur =min (len,PAGE_SIZE - offset); kaddr =page_address (page); -memset (kaddr + offset, c, cur); +memset (kaddr + offset,0 , cur); len -= cur; offset =0 ;
fs/btrfs/extent_io.h +2 -2
@@ -417,8 +417,8 @@ void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, unsigned long src_offset, unsigned long len);void memmove_extent_buffer (struct extent_buffer *dst,unsigned long dst_offset,unsigned long src_offset,unsigned long len); -void memset_extent_buffer (struct extent_buffer *eb,char c, -unsigned long start,unsigned long len); +void memzero_extent_buffer (struct extent_buffer *eb,unsigned long start, +unsigned long len);int extent_buffer_test_bit (struct extent_buffer *eb,unsigned long start,unsigned long pos); void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start,
fs/btrfs/file-item.c +1 -1
@@ -689,7 +689,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, item_offset =btrfs_item_ptr_offset (leaf, path->slots[0 ]); -memset_extent_buffer (leaf,0 , item_offset + offset, +memzero_extent_buffer (leaf, item_offset + offset, shift_len); key.offset = bytenr;
fs/btrfs/free-space-cache.c +2 -2
@@ -153,7 +153,7 @@ static int __create_free_space_inode(struct btrfs_root *root, inode_item =btrfs_item_ptr (leaf, path->slots[0 ], struct btrfs_inode_item);btrfs_item_key (leaf, &disk_key, path->slots[0 ]); -memset_extent_buffer (leaf,0 , (unsigned long )inode_item, +memzero_extent_buffer (leaf, (unsigned long )inode_item,sizeof (*inode_item));btrfs_set_inode_generation (leaf, inode_item, trans->transid);btrfs_set_inode_size (leaf, inode_item,0 );
@@ -181,7 +181,7 @@ static int __create_free_space_inode(struct btrfs_root *root, leaf = path->nodes[0 ]; header =btrfs_item_ptr (leaf, path->slots[0 ], struct btrfs_free_space_header); -memset_extent_buffer (leaf,0 , (unsigned long )header,sizeof (*header)); +memzero_extent_buffer (leaf, (unsigned long )header,sizeof (*header));btrfs_set_free_space_key (leaf, header, &disk_key);btrfs_mark_buffer_dirty (leaf);btrfs_release_path (path);
fs/btrfs/inode.c +1 -1
@@ -6277,7 +6277,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, inode_item =btrfs_item_ptr (path->nodes[0 ], path->slots[0 ], struct btrfs_inode_item); -memset_extent_buffer (path->nodes[0 ],0 , (unsigned long )inode_item, +memzero_extent_buffer (path->nodes[0 ], (unsigned long )inode_item,sizeof (*inode_item));fill_inode_item (trans, path->nodes[0 ], inode_item, inode);
fs/btrfs/ioctl.c +1 -1
@@ -502,7 +502,7 @@ static noinline int create_subvol(struct inode *dir, goto fail; } -memset_extent_buffer (leaf,0 ,0 ,sizeof (struct btrfs_header )); +memzero_extent_buffer (leaf,0 ,sizeof (struct btrfs_header ));btrfs_set_header_bytenr (leaf, leaf->start);btrfs_set_header_generation (leaf, trans->transid);btrfs_set_header_backref_rev (leaf,BTRFS_MIXED_BACKREF_REV );
fs/btrfs/relocation.c +1 -1
@@ -4255,7 +4255,7 @@ static int __insert_orphan_inode(struct btrfs_trans_handle *trans, leaf = path->nodes[0 ]; item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_inode_item); -memset_extent_buffer (leaf,0 , (unsigned long )item,sizeof (*item)); +memzero_extent_buffer (leaf, (unsigned long )item,sizeof (*item));btrfs_set_inode_generation (leaf, item,1 );btrfs_set_inode_size (leaf, item,0 );btrfs_set_inode_mode (leaf, item,S_IFREG |0600 );
fs/btrfs/tests/extent-io-tests.c +1 -1
@@ -306,7 +306,7 @@ static int __test_eb_bitmaps(unsigned long *bitmap, struct extent_buffer *eb,int ret;memset (bitmap,0 , len); -memset_extent_buffer (eb,0 ,0 , len); +memzero_extent_buffer (eb,0 , len);if (memcmp_extent_buffer (eb, bitmap,0 , len) !=0 ) {test_msg ("Bitmap was not zeroed\n" );return -EINVAL ;
fs/btrfs/volumes.c +1 -1
@@ -3062,7 +3062,7 @@ static int insert_balance_item(struct btrfs_root *root, leaf = path->nodes[0 ]; item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_balance_item); -memset_extent_buffer (leaf,0 , (unsigned long )item,sizeof (*item)); +memzero_extent_buffer (leaf, (unsigned long )item,sizeof (*item));btrfs_cpu_balance_args_to_disk (&disk_bargs, &bctl->data);btrfs_set_balance_data (leaf, item, &disk_bargs);
Signature · 1 line
2.10.1
David Sterba
maintainerPATCH 12/12 btrfs: add optimized version of eb to eb copy
In reply to David SterbaUsing 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.
--- fs/btrfs/ctree.c | 4 ++-- fs/btrfs/extent_io.c | 14 ++++++++++++++ fs/btrfs/extent_io.h | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-)
fs/btrfs/ctree.c +2 -2
@@ -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 );
fs/btrfs/extent_io.c +14 -0
@@ -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)
fs/btrfs/extent_io.h +2 -0
@@ -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);
Signature · 1 line
2.10.1