btrfs: split alloc_log_tree()
authorNaohiro Aota <naohiro.aota@wdc.com>
Thu, 4 Feb 2021 10:22:17 +0000 (19:22 +0900)
committerDavid Sterba <dsterba@suse.com>
Tue, 9 Feb 2021 01:46:07 +0000 (02:46 +0100)
This is a preparation patch for the next patch. Split alloc_log_tree()
into two parts. The first one allocating the tree structure, remains in
alloc_log_tree() and the second part allocating the tree node, which is
moved into btrfs_alloc_log_tree_node().

Also export the latter part is to be used in the next patch.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c
fs/btrfs/disk-io.h

index 6e16f55..d2fa925 100644 (file)
@@ -1254,7 +1254,6 @@ static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,
                                         struct btrfs_fs_info *fs_info)
 {
        struct btrfs_root *root;
-       struct extent_buffer *leaf;
 
        root = btrfs_alloc_root(fs_info, BTRFS_TREE_LOG_OBJECTID, GFP_NOFS);
        if (!root)
@@ -1264,6 +1263,14 @@ static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,
        root->root_key.type = BTRFS_ROOT_ITEM_KEY;
        root->root_key.offset = BTRFS_TREE_LOG_OBJECTID;
 
+       return root;
+}
+
+int btrfs_alloc_log_tree_node(struct btrfs_trans_handle *trans,
+                             struct btrfs_root *root)
+{
+       struct extent_buffer *leaf;
+
        /*
         * DON'T set SHAREABLE bit for log trees.
         *
@@ -1276,26 +1283,33 @@ static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,
 
        leaf = btrfs_alloc_tree_block(trans, root, 0, BTRFS_TREE_LOG_OBJECTID,
                        NULL, 0, 0, 0, BTRFS_NESTING_NORMAL);
-       if (IS_ERR(leaf)) {
-               btrfs_put_root(root);
-               return ERR_CAST(leaf);
-       }
+       if (IS_ERR(leaf))
+               return PTR_ERR(leaf);
 
        root->node = leaf;
 
        btrfs_mark_buffer_dirty(root->node);
        btrfs_tree_unlock(root->node);
-       return root;
+
+       return 0;
 }
 
 int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
                             struct btrfs_fs_info *fs_info)
 {
        struct btrfs_root *log_root;
+       int ret;
 
        log_root = alloc_log_tree(trans, fs_info);
        if (IS_ERR(log_root))
                return PTR_ERR(log_root);
+
+       ret = btrfs_alloc_log_tree_node(trans, log_root);
+       if (ret) {
+               btrfs_put_root(log_root);
+               return ret;
+       }
+
        WARN_ON(fs_info->log_root_tree);
        fs_info->log_root_tree = log_root;
        return 0;
@@ -1307,11 +1321,18 @@ int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
        struct btrfs_fs_info *fs_info = root->fs_info;
        struct btrfs_root *log_root;
        struct btrfs_inode_item *inode_item;
+       int ret;
 
        log_root = alloc_log_tree(trans, fs_info);
        if (IS_ERR(log_root))
                return PTR_ERR(log_root);
 
+       ret = btrfs_alloc_log_tree_node(trans, log_root);
+       if (ret) {
+               btrfs_put_root(log_root);
+               return ret;
+       }
+
        log_root->last_trans = trans->transid;
        log_root->root_key.offset = root->root_key.objectid;
 
index 9f4a2a1..0e7e952 100644 (file)
@@ -120,6 +120,8 @@ blk_status_t btrfs_wq_submit_bio(struct inode *inode, struct bio *bio,
                                 extent_submit_bio_start_t *submit_bio_start);
 blk_status_t btrfs_submit_bio_done(void *private_data, struct bio *bio,
                          int mirror_num);
+int btrfs_alloc_log_tree_node(struct btrfs_trans_handle *trans,
+                             struct btrfs_root *root);
 int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
                             struct btrfs_fs_info *fs_info);
 int btrfs_add_log_tree(struct btrfs_trans_handle *trans,