* [PATCH 00/12] Misc cleanups
@ 2016-11-09 17:04 David Sterba
2016-11-09 17:04 ` [PATCH 01/12] btrfs: reada, cleanup remove unneeded variable in __readahead_hook David Sterba
` (11 more replies)
0 siblings, 12 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
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(-)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 01/12] btrfs: reada, cleanup remove unneeded variable in __readahead_hook
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 02/12] btrfs: reada, remove unused parameter from __readahead_hook David Sterba
` (10 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
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.
Signed-off-by: David Sterba <dsterba@suse.com>
---
fs/btrfs/reada.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c
index 75bab76739be..378043823dca 100644
--- a/fs/btrfs/reada.c
+++ b/fs/btrfs/reada.c
@@ -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);
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 02/12] btrfs: reada, remove unused parameter from __readahead_hook
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
2016-11-09 17:04 ` [PATCH 01/12] btrfs: reada, cleanup remove unneeded variable in __readahead_hook David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 03/12] btrfs: reada, sink start parameter to btree_readahead_hook David Sterba
` (9 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
'start' is not used since "btrfs: reada: Pass reada_extent into
__readahead_hook directly" (6e39dbe8b9e55280c).
Signed-off-by: David Sterba <dsterba@suse.com>
---
fs/btrfs/reada.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c
index 378043823dca..018a303c91fb 100644
--- a/fs/btrfs/reada.c
+++ b/fs/btrfs/reada.c
@@ -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);
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 03/12] btrfs: reada, sink start parameter to btree_readahead_hook
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
2016-11-09 17:04 ` [PATCH 01/12] btrfs: reada, cleanup remove unneeded variable in __readahead_hook David Sterba
2016-11-09 17:04 ` [PATCH 02/12] btrfs: reada, remove unused parameter from __readahead_hook David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 04/12] btrfs: reada, remove pointless BUG_ON in reada_find_extent David Sterba
` (8 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
Originally, 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.
Signed-off-by: David Sterba <dsterba@suse.com>
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/disk-io.c | 4 ++--
fs/btrfs/reada.c | 8 ++------
3 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 9d8edcb0813c..5ae63f4e60df 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -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)
{
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 3a57f99d96aa..9c4ef833ba0b 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -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 */
}
diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c
index 018a303c91fb..fe068b197fc1 100644
--- a/fs/btrfs/reada.c
+++ b/fs/btrfs/reada.c
@@ -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);
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 04/12] btrfs: reada, remove pointless BUG_ON in reada_find_extent
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
` (2 preceding siblings ...)
2016-11-09 17:04 ` [PATCH 03/12] btrfs: reada, sink start parameter to btree_readahead_hook David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 05/12] btrfs: reada, remove pointless BUG_ON check for fs_info David Sterba
` (7 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
The lock is held, we make the same lookup that previously failed with
EEXIST and we don't insert NULL pointers.
Signed-off-by: David Sterba <dsterba@suse.com>
---
fs/btrfs/reada.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c
index fe068b197fc1..95d526af3fba 100644
--- a/fs/btrfs/reada.c
+++ b/fs/btrfs/reada.c
@@ -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);
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 05/12] btrfs: reada, remove pointless BUG_ON check for fs_info
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
` (3 preceding siblings ...)
2016-11-09 17:04 ` [PATCH 04/12] btrfs: reada, remove pointless BUG_ON in reada_find_extent David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 06/12] btrfs: remove trivial helper btrfs_find_tree_block David Sterba
` (6 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
We dereference fs_info several times, besides that post-mount functions
should never see a NULL fs_info.
Signed-off-by: David Sterba <dsterba@suse.com>
---
fs/btrfs/reada.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c
index 95d526af3fba..c241e1f0422f 100644
--- a/fs/btrfs/reada.c
+++ b/fs/btrfs/reada.c
@@ -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);
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 06/12] btrfs: remove trivial helper btrfs_find_tree_block
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
` (4 preceding siblings ...)
2016-11-09 17:04 ` [PATCH 05/12] btrfs: reada, remove pointless BUG_ON check for fs_info David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 07/12] btrfs: delete unused member from superblock David Sterba
` (5 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
During the time, the function has been shrunk to the point that it just
calls find_extent_buffer, just passing the parameters.
Signed-off-by: David Sterba <dsterba@suse.com>
---
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(-)
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index f6ba165d3f81..173768767d1b 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -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) {
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 9c4ef833ba0b..686d05acfdb7 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -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;
diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h
index 1a3237e5700f..124e30c76626 100644
--- a/fs/btrfs/disk-io.h
+++ b/fs/btrfs/disk-io.h
@@ -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);
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 4607af38c72e..e453c7a13bd1 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -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))
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 07/12] btrfs: delete unused member from superblock
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
` (5 preceding siblings ...)
2016-11-09 17:04 ` [PATCH 06/12] btrfs: remove trivial helper btrfs_find_tree_block David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 08/12] btrfs: introduce helpers for updating eb uuids David Sterba
` (4 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
__bdev' has never been used since
0b86a832a1f38abec695864ec2eaedc9d2383f1b (2008).
Signed-off-by: David Sterba <dsterba@suse.com>
---
fs/btrfs/ctree.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 5ae63f4e60df..64c0dc3367bc 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -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;
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 08/12] btrfs: introduce helpers for updating eb uuids
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
` (6 preceding siblings ...)
2016-11-09 17:04 ` [PATCH 07/12] btrfs: delete unused member from superblock David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 09/12] btrfs: use new helpers to set uuids in eb David Sterba
` (3 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
The fsid and chunk tree uuid are always located in the first page,
we don't need the to use write_extent_buffer.
Signed-off-by: David Sterba <dsterba@suse.com>
---
fs/btrfs/extent_io.c | 21 +++++++++++++++++++++
fs/btrfs/extent_io.h | 3 +++
2 files changed, 24 insertions(+)
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 8ed05d95584a..45a986791fe0 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -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)
{
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index ab31d145227e..065c77d43921 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -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,
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 09/12] btrfs: use new helpers to set uuids in eb
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
` (7 preceding siblings ...)
2016-11-09 17:04 ` [PATCH 08/12] btrfs: introduce helpers for updating eb uuids David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 10/12] btrfs: use specialized page copying helpers in btrfs_clone_extent_buffer David Sterba
` (2 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
Signed-off-by: David Sterba <dsterba@suse.com>
---
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(-)
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 173768767d1b..93bc38b98b3f 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -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) {
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 686d05acfdb7..21f8e597fe97 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -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;
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 71634570943c..9376c42475c5 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -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;
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 71a60cc01451..5c55b0e11dde 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -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);
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 10/12] btrfs: use specialized page copying helpers in btrfs_clone_extent_buffer
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
` (8 preceding siblings ...)
2016-11-09 17:04 ` [PATCH 09/12] btrfs: use new helpers to set uuids in eb David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 11/12] btrfs: remove constant parameter to memset_extent_buffer and rename it David Sterba
2016-11-09 17:04 ` [PATCH 12/12] btrfs: add optimized version of eb to eb copy David Sterba
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
The copy_page is usually optimized and can be faster than memcpy.
Signed-off-by: David Sterba <dsterba@suse.com>
---
fs/btrfs/extent_io.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 45a986791fe0..0a71a85d103d 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -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);
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 11/12] btrfs: remove constant parameter to memset_extent_buffer and rename it
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
` (9 preceding siblings ...)
2016-11-09 17:04 ` [PATCH 10/12] btrfs: use specialized page copying helpers in btrfs_clone_extent_buffer David Sterba
@ 2016-11-09 17:04 ` David Sterba
2016-11-09 17:04 ` [PATCH 12/12] btrfs: add optimized version of eb to eb copy David Sterba
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
The 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.
Signed-off-by: David Sterba <dsterba@suse.com>
---
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(-)
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 93bc38b98b3f..be362b776138 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -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);
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 21f8e597fe97..5d1da78f044b 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -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);
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index e453c7a13bd1..f20478976ae2 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -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);
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 0a71a85d103d..a7beacbe0087 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -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;
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index 065c77d43921..12fe17523df2 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -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,
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
index d0d571c47d33..43418c08b110 100644
--- a/fs/btrfs/file-item.c
+++ b/fs/btrfs/file-item.c
@@ -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;
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
index e4b48f377d3a..a754865b3cb1 100644
--- a/fs/btrfs/free-space-cache.c
+++ b/fs/btrfs/free-space-cache.c
@@ -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);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 1f980efbb2e8..1564bb09776a 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -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);
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 9376c42475c5..d8a28f8cf6b0 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -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);
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index c4af0cdb783d..ca51710b36d3 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -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);
diff --git a/fs/btrfs/tests/extent-io-tests.c b/fs/btrfs/tests/extent-io-tests.c
index caad80bb9bd0..2c7a0a922510 100644
--- a/fs/btrfs/tests/extent-io-tests.c
+++ b/fs/btrfs/tests/extent-io-tests.c
@@ -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;
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 5c55b0e11dde..934b474e02e3 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -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);
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 12/12] btrfs: add optimized version of eb to eb copy
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
` (10 preceding siblings ...)
2016-11-09 17:04 ` [PATCH 11/12] btrfs: remove constant parameter to memset_extent_buffer and rename it David Sterba
@ 2016-11-09 17:04 ` David Sterba
11 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2016-11-09 17:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: David Sterba
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 | 4 ++--
fs/btrfs/extent_io.c | 14 ++++++++++++++
fs/btrfs/extent_io.h | 2 ++
3 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index be362b776138..25286a5912fc 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -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);
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index a7beacbe0087..333491e26742 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -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)
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index 12fe17523df2..ae64c1917d0a 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -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);
--
2.10.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2016-11-09 17:04 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-09 17:04 [PATCH 00/12] Misc cleanups David Sterba
2016-11-09 17:04 ` [PATCH 01/12] btrfs: reada, cleanup remove unneeded variable in __readahead_hook David Sterba
2016-11-09 17:04 ` [PATCH 02/12] btrfs: reada, remove unused parameter from __readahead_hook David Sterba
2016-11-09 17:04 ` [PATCH 03/12] btrfs: reada, sink start parameter to btree_readahead_hook David Sterba
2016-11-09 17:04 ` [PATCH 04/12] btrfs: reada, remove pointless BUG_ON in reada_find_extent David Sterba
2016-11-09 17:04 ` [PATCH 05/12] btrfs: reada, remove pointless BUG_ON check for fs_info David Sterba
2016-11-09 17:04 ` [PATCH 06/12] btrfs: remove trivial helper btrfs_find_tree_block David Sterba
2016-11-09 17:04 ` [PATCH 07/12] btrfs: delete unused member from superblock David Sterba
2016-11-09 17:04 ` [PATCH 08/12] btrfs: introduce helpers for updating eb uuids David Sterba
2016-11-09 17:04 ` [PATCH 09/12] btrfs: use new helpers to set uuids in eb David Sterba
2016-11-09 17:04 ` [PATCH 10/12] btrfs: use specialized page copying helpers in btrfs_clone_extent_buffer David Sterba
2016-11-09 17:04 ` [PATCH 11/12] btrfs: remove constant parameter to memset_extent_buffer and rename it David Sterba
2016-11-09 17:04 ` [PATCH 12/12] btrfs: add optimized version of eb to eb copy David Sterba
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).