summaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorNikolay Borisov <nborisov@suse.com>2018-06-18 07:13:19 -0400
committerDavid Sterba <dsterba@suse.com>2018-08-06 07:12:38 -0400
commitbc877d285ca3dba24c52406946a4a69847cc7422 (patch)
treef7d9439fb1887bd693bde80d9e7ffdf170910a14 /fs/btrfs
parent9912bbf6440ba0555e91d3306520da01872c7c1d (diff)
btrfs: Deduplicate extent_buffer init code
When a new extent buffer is allocated there are a few mandatory fields which need to be set in order for the buffer to be sane: level, generation, bytenr, backref_rev, owner and FSID/UUID. Currently this is open coded in the callers of btrfs_alloc_tree_block, meaning it's fairly high in the abstraction hierarchy of operations. This patch solves this by simply moving this init code in btrfs_init_new_buffer, since this is the function which initializes a newly allocated extent buffer. No functional changes. Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/ctree.c29
-rw-r--r--fs/btrfs/disk-io.c14
-rw-r--r--fs/btrfs/extent-tree.c16
-rw-r--r--fs/btrfs/ioctl.c8
4 files changed, 13 insertions, 54 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 18fd80e2f278..18f1ca1c5bd9 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -3358,17 +3358,7 @@ static noinline int insert_new_root(struct btrfs_trans_handle *trans,
3358 3358
3359 root_add_used(root, fs_info->nodesize); 3359 root_add_used(root, fs_info->nodesize);
3360 3360
3361 memzero_extent_buffer(c, 0, sizeof(struct btrfs_header));
3362 btrfs_set_header_nritems(c, 1); 3361 btrfs_set_header_nritems(c, 1);
3363 btrfs_set_header_level(c, level);
3364 btrfs_set_header_bytenr(c, c->start);
3365 btrfs_set_header_generation(c, trans->transid);
3366 btrfs_set_header_backref_rev(c, BTRFS_MIXED_BACKREF_REV);
3367 btrfs_set_header_owner(c, root->root_key.objectid);
3368
3369 write_extent_buffer_fsid(c, fs_info->fsid);
3370 write_extent_buffer_chunk_tree_uuid(c, fs_info->chunk_tree_uuid);
3371
3372 btrfs_set_node_key(c, &lower_key, 0); 3362 btrfs_set_node_key(c, &lower_key, 0);
3373 btrfs_set_node_blockptr(c, 0, lower->start); 3363 btrfs_set_node_blockptr(c, 0, lower->start);
3374 lower_gen = btrfs_header_generation(lower); 3364 lower_gen = btrfs_header_generation(lower);
@@ -3497,15 +3487,7 @@ static noinline int split_node(struct btrfs_trans_handle *trans,
3497 return PTR_ERR(split); 3487 return PTR_ERR(split);
3498 3488
3499 root_add_used(root, fs_info->nodesize); 3489 root_add_used(root, fs_info->nodesize);
3500 3490 ASSERT(btrfs_header_level(c) == level);
3501 memzero_extent_buffer(split, 0, sizeof(struct btrfs_header));
3502 btrfs_set_header_level(split, btrfs_header_level(c));
3503 btrfs_set_header_bytenr(split, split->start);
3504 btrfs_set_header_generation(split, trans->transid);
3505 btrfs_set_header_backref_rev(split, BTRFS_MIXED_BACKREF_REV);
3506 btrfs_set_header_owner(split, root->root_key.objectid);
3507 write_extent_buffer_fsid(split, fs_info->fsid);
3508 write_extent_buffer_chunk_tree_uuid(split, fs_info->chunk_tree_uuid);
3509 3491
3510 ret = tree_mod_log_eb_copy(fs_info, split, c, 0, mid, c_nritems - mid); 3492 ret = tree_mod_log_eb_copy(fs_info, split, c, 0, mid, c_nritems - mid);
3511 if (ret) { 3493 if (ret) {
@@ -4291,15 +4273,6 @@ again:
4291 4273
4292 root_add_used(root, fs_info->nodesize); 4274 root_add_used(root, fs_info->nodesize);
4293 4275
4294 memzero_extent_buffer(right, 0, sizeof(struct btrfs_header));
4295 btrfs_set_header_bytenr(right, right->start);
4296 btrfs_set_header_generation(right, trans->transid);
4297 btrfs_set_header_backref_rev(right, BTRFS_MIXED_BACKREF_REV);
4298 btrfs_set_header_owner(right, root->root_key.objectid);
4299 btrfs_set_header_level(right, 0);
4300 write_extent_buffer_fsid(right, fs_info->fsid);
4301 write_extent_buffer_chunk_tree_uuid(right, fs_info->chunk_tree_uuid);
4302
4303 if (split == 0) { 4276 if (split == 0) {
4304 if (mid <= slot) { 4277 if (mid <= slot) {
4305 btrfs_set_header_nritems(right, 0); 4278 btrfs_set_header_nritems(right, 0);
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index f3224e23d5fa..6318ac2539d3 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1292,15 +1292,7 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans,
1292 goto fail; 1292 goto fail;
1293 } 1293 }
1294 1294
1295 memzero_extent_buffer(leaf, 0, sizeof(struct btrfs_header));
1296 btrfs_set_header_bytenr(leaf, leaf->start);
1297 btrfs_set_header_generation(leaf, trans->transid);
1298 btrfs_set_header_backref_rev(leaf, BTRFS_MIXED_BACKREF_REV);
1299 btrfs_set_header_owner(leaf, objectid);
1300 root->node = leaf; 1295 root->node = leaf;
1301
1302 write_extent_buffer_fsid(leaf, fs_info->fsid);
1303 write_extent_buffer_chunk_tree_uuid(leaf, fs_info->chunk_tree_uuid);
1304 btrfs_mark_buffer_dirty(leaf); 1296 btrfs_mark_buffer_dirty(leaf);
1305 1297
1306 root->commit_root = btrfs_root_node(root); 1298 root->commit_root = btrfs_root_node(root);
@@ -1374,14 +1366,8 @@ static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,
1374 return ERR_CAST(leaf); 1366 return ERR_CAST(leaf);
1375 } 1367 }
1376 1368
1377 memzero_extent_buffer(leaf, 0, sizeof(struct btrfs_header));
1378 btrfs_set_header_bytenr(leaf, leaf->start);
1379 btrfs_set_header_generation(leaf, trans->transid);
1380 btrfs_set_header_backref_rev(leaf, BTRFS_MIXED_BACKREF_REV);
1381 btrfs_set_header_owner(leaf, BTRFS_TREE_LOG_OBJECTID);
1382 root->node = leaf; 1369 root->node = leaf;
1383 1370
1384 write_extent_buffer_fsid(root->node, fs_info->fsid);
1385 btrfs_mark_buffer_dirty(root->node); 1371 btrfs_mark_buffer_dirty(root->node);
1386 btrfs_tree_unlock(root->node); 1372 btrfs_tree_unlock(root->node);
1387 return root; 1373 return root;
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 472872a6cc27..0ca3999356c7 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -8302,7 +8302,7 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans,
8302 8302
8303static struct extent_buffer * 8303static struct extent_buffer *
8304btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root, 8304btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root,
8305 u64 bytenr, int level) 8305 u64 bytenr, int level, u64 owner)
8306{ 8306{
8307 struct btrfs_fs_info *fs_info = root->fs_info; 8307 struct btrfs_fs_info *fs_info = root->fs_info;
8308 struct extent_buffer *buf; 8308 struct extent_buffer *buf;
@@ -8311,7 +8311,6 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root,
8311 if (IS_ERR(buf)) 8311 if (IS_ERR(buf))
8312 return buf; 8312 return buf;
8313 8313
8314 btrfs_set_header_generation(buf, trans->transid);
8315 btrfs_set_buffer_lockdep_class(root->root_key.objectid, buf, level); 8314 btrfs_set_buffer_lockdep_class(root->root_key.objectid, buf, level);
8316 btrfs_tree_lock(buf); 8315 btrfs_tree_lock(buf);
8317 clean_tree_block(fs_info, buf); 8316 clean_tree_block(fs_info, buf);
@@ -8320,6 +8319,14 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root,
8320 btrfs_set_lock_blocking(buf); 8319 btrfs_set_lock_blocking(buf);
8321 set_extent_buffer_uptodate(buf); 8320 set_extent_buffer_uptodate(buf);
8322 8321
8322 memzero_extent_buffer(buf, 0, sizeof(struct btrfs_header));
8323 btrfs_set_header_level(buf, level);
8324 btrfs_set_header_bytenr(buf, buf->start);
8325 btrfs_set_header_generation(buf, trans->transid);
8326 btrfs_set_header_backref_rev(buf, BTRFS_MIXED_BACKREF_REV);
8327 btrfs_set_header_owner(buf, owner);
8328 write_extent_buffer_fsid(buf, fs_info->fsid);
8329 write_extent_buffer_chunk_tree_uuid(buf, fs_info->chunk_tree_uuid);
8323 if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) { 8330 if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) {
8324 buf->log_index = root->log_transid % 2; 8331 buf->log_index = root->log_transid % 2;
8325 /* 8332 /*
@@ -8428,7 +8435,7 @@ struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans,
8428#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS 8435#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
8429 if (btrfs_is_testing(fs_info)) { 8436 if (btrfs_is_testing(fs_info)) {
8430 buf = btrfs_init_new_buffer(trans, root, root->alloc_bytenr, 8437 buf = btrfs_init_new_buffer(trans, root, root->alloc_bytenr,
8431 level); 8438 level, root_objectid);
8432 if (!IS_ERR(buf)) 8439 if (!IS_ERR(buf))
8433 root->alloc_bytenr += blocksize; 8440 root->alloc_bytenr += blocksize;
8434 return buf; 8441 return buf;
@@ -8444,7 +8451,8 @@ struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans,
8444 if (ret) 8451 if (ret)
8445 goto out_unuse; 8452 goto out_unuse;
8446 8453
8447 buf = btrfs_init_new_buffer(trans, root, ins.objectid, level); 8454 buf = btrfs_init_new_buffer(trans, root, ins.objectid, level,
8455 root_objectid);
8448 if (IS_ERR(buf)) { 8456 if (IS_ERR(buf)) {
8449 ret = PTR_ERR(buf); 8457 ret = PTR_ERR(buf);
8450 goto out_free_reserved; 8458 goto out_free_reserved;
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 0c4b9f364e84..08b8c0b346b3 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -616,14 +616,6 @@ static noinline int create_subvol(struct inode *dir,
616 goto fail; 616 goto fail;
617 } 617 }
618 618
619 memzero_extent_buffer(leaf, 0, sizeof(struct btrfs_header));
620 btrfs_set_header_bytenr(leaf, leaf->start);
621 btrfs_set_header_generation(leaf, trans->transid);
622 btrfs_set_header_backref_rev(leaf, BTRFS_MIXED_BACKREF_REV);
623 btrfs_set_header_owner(leaf, objectid);
624
625 write_extent_buffer_fsid(leaf, fs_info->fsid);
626 write_extent_buffer_chunk_tree_uuid(leaf, fs_info->chunk_tree_uuid);
627 btrfs_mark_buffer_dirty(leaf); 619 btrfs_mark_buffer_dirty(leaf);
628 620
629 inode_item = &root_item->inode; 621 inode_item = &root_item->inode;