Btrfs: fix wrong return value of btrfs_wait_for_commit()
[firefly-linux-kernel-4.4.55.git] / fs / btrfs / relocation.c
index 4da08652004d5dc2803dba510c0f9b015607b4a1..300e09ac36599ae8b412284b43e677792005fe9e 100644 (file)
@@ -2025,7 +2025,6 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
        struct btrfs_root_item *root_item;
        struct btrfs_path *path;
        struct extent_buffer *leaf;
-       unsigned long nr;
        int level;
        int max_level;
        int replaced = 0;
@@ -2074,7 +2073,8 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
                BUG_ON(IS_ERR(trans));
                trans->block_rsv = rc->block_rsv;
 
-               ret = btrfs_block_rsv_refill(root, rc->block_rsv, min_reserved);
+               ret = btrfs_block_rsv_refill(root, rc->block_rsv, min_reserved,
+                                            BTRFS_RESERVE_FLUSH_ALL);
                if (ret) {
                        BUG_ON(ret != -EAGAIN);
                        ret = btrfs_commit_transaction(trans, root);
@@ -2125,10 +2125,9 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
                               path->slots[level]);
                root_item->drop_level = level;
 
-               nr = trans->blocks_used;
                btrfs_end_transaction_throttle(trans, root);
 
-               btrfs_btree_balance_dirty(root, nr);
+               btrfs_btree_balance_dirty(root);
 
                if (replaced && rc->stage == UPDATE_DATA_PTRS)
                        invalidate_extent_cache(root, &key, &next_key);
@@ -2155,10 +2154,9 @@ out:
                btrfs_update_reloc_root(trans, root);
        }
 
-       nr = trans->blocks_used;
        btrfs_end_transaction_throttle(trans, root);
 
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
 
        if (replaced && rc->stage == UPDATE_DATA_PTRS)
                invalidate_extent_cache(root, &key, &next_key);
@@ -2184,7 +2182,8 @@ int prepare_to_merge(struct reloc_control *rc, int err)
 again:
        if (!err) {
                num_bytes = rc->merging_rsv_size;
-               ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes);
+               ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes,
+                                         BTRFS_RESERVE_FLUSH_ALL);
                if (ret)
                        err = ret;
        }
@@ -2459,7 +2458,8 @@ static int reserve_metadata_space(struct btrfs_trans_handle *trans,
        num_bytes = calcu_metadata_size(rc, node, 1) * 2;
 
        trans->block_rsv = rc->block_rsv;
-       ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes);
+       ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes,
+                                 BTRFS_RESERVE_FLUSH_ALL);
        if (ret) {
                if (ret == -EAGAIN)
                        rc->commit_transaction = 1;
@@ -3259,7 +3259,6 @@ static int delete_block_group_cache(struct btrfs_fs_info *fs_info,
        struct btrfs_path *path;
        struct btrfs_root *root = fs_info->tree_root;
        struct btrfs_trans_handle *trans;
-       unsigned long nr;
        int ret = 0;
 
        if (inode)
@@ -3270,8 +3269,8 @@ static int delete_block_group_cache(struct btrfs_fs_info *fs_info,
        key.offset = 0;
 
        inode = btrfs_iget(fs_info->sb, &key, root, NULL);
-       if (IS_ERR_OR_NULL(inode) || is_bad_inode(inode)) {
-               if (inode && !IS_ERR(inode))
+       if (IS_ERR(inode) || is_bad_inode(inode)) {
+               if (!IS_ERR(inode))
                        iput(inode);
                return -ENOENT;
        }
@@ -3293,9 +3292,8 @@ truncate:
        ret = btrfs_truncate_free_space_cache(root, trans, path, inode);
 
        btrfs_free_path(path);
-       nr = trans->blocks_used;
        btrfs_end_transaction(trans, root);
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
 out:
        iput(inode);
        return ret;
@@ -3621,7 +3619,7 @@ next:
 
                ret = find_first_extent_bit(&rc->processed_blocks,
                                            key.objectid, &start, &end,
-                                           EXTENT_DIRTY);
+                                           EXTENT_DIRTY, NULL);
 
                if (ret == 0 && start <= key.objectid) {
                        btrfs_release_path(path);
@@ -3674,7 +3672,8 @@ int prepare_to_relocate(struct reloc_control *rc)
        struct btrfs_trans_handle *trans;
        int ret;
 
-       rc->block_rsv = btrfs_alloc_block_rsv(rc->extent_root);
+       rc->block_rsv = btrfs_alloc_block_rsv(rc->extent_root,
+                                             BTRFS_BLOCK_RSV_TEMP);
        if (!rc->block_rsv)
                return -ENOMEM;
 
@@ -3684,7 +3683,8 @@ int prepare_to_relocate(struct reloc_control *rc)
         * is no reservation in transaction handle.
         */
        ret = btrfs_block_rsv_add(rc->extent_root, rc->block_rsv,
-                                 rc->extent_root->nodesize * 256);
+                                 rc->extent_root->nodesize * 256,
+                                 BTRFS_RESERVE_FLUSH_ALL);
        if (ret)
                return ret;
 
@@ -3710,7 +3710,6 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc)
        struct btrfs_trans_handle *trans = NULL;
        struct btrfs_path *path;
        struct btrfs_extent_item *ei;
-       unsigned long nr;
        u64 flags;
        u32 item_size;
        int ret;
@@ -3827,9 +3826,8 @@ restart:
                        ret = btrfs_commit_transaction(trans, rc->extent_root);
                        BUG_ON(ret);
                } else {
-                       nr = trans->blocks_used;
                        btrfs_end_transaction_throttle(trans, rc->extent_root);
-                       btrfs_btree_balance_dirty(rc->extent_root, nr);
+                       btrfs_btree_balance_dirty(rc->extent_root);
                }
                trans = NULL;
 
@@ -3859,9 +3857,8 @@ restart:
                          GFP_NOFS);
 
        if (trans) {
-               nr = trans->blocks_used;
                btrfs_end_transaction_throttle(trans, rc->extent_root);
-               btrfs_btree_balance_dirty(rc->extent_root, nr);
+               btrfs_btree_balance_dirty(rc->extent_root);
        }
 
        if (!err) {
@@ -3940,7 +3937,6 @@ struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info,
        struct btrfs_trans_handle *trans;
        struct btrfs_root *root;
        struct btrfs_key key;
-       unsigned long nr;
        u64 objectid = BTRFS_FIRST_FREE_OBJECTID;
        int err = 0;
 
@@ -3968,9 +3964,8 @@ struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info,
 
        err = btrfs_orphan_add(trans, inode);
 out:
-       nr = trans->blocks_used;
        btrfs_end_transaction(trans, root);
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
        if (err) {
                if (inode)
                        iput(inode);
@@ -4056,8 +4051,12 @@ int btrfs_relocate_block_group(struct btrfs_root *extent_root, u64 group_start)
               (unsigned long long)rc->block_group->key.objectid,
               (unsigned long long)rc->block_group->flags);
 
-       btrfs_start_delalloc_inodes(fs_info->tree_root, 0);
-       btrfs_wait_ordered_extents(fs_info->tree_root, 0, 0);
+       ret = btrfs_start_delalloc_inodes(fs_info->tree_root, 0);
+       if (ret < 0) {
+               err = ret;
+               goto out;
+       }
+       btrfs_wait_ordered_extents(fs_info->tree_root, 0);
 
        while (1) {
                mutex_lock(&fs_info->cleaner_mutex);