diff options
author | Nikolay Borisov <nborisov@suse.com> | 2018-06-18 07:13:19 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-08-06 07:12:38 -0400 |
commit | bc877d285ca3dba24c52406946a4a69847cc7422 (patch) | |
tree | f7d9439fb1887bd693bde80d9e7ffdf170910a14 /fs/btrfs | |
parent | 9912bbf6440ba0555e91d3306520da01872c7c1d (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.c | 29 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 14 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 16 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 8 |
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 | ||
8303 | static struct extent_buffer * | 8303 | static struct extent_buffer * |
8304 | btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root, | 8304 | btrfs_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; |