- 'nr' is no more used.
- btrfs_btree_balance_dirty() and __btrfs_btree_balance_dirty() can share
  a bunch of code.
Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
        struct btrfs_delayed_node *delayed_node = NULL;
        struct btrfs_root *root;
        struct btrfs_block_rsv *block_rsv;
-       unsigned long nr = 0;
        int need_requeue = 0;
        int ret;
 
                                           delayed_node);
        mutex_unlock(&delayed_node->mutex);
 
-       nr = trans->blocks_used;
-
        trans->block_rsv = block_rsv;
        btrfs_end_transaction_dmeta(trans, root);
-       __btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty_nodelay(root);
 free_path:
        btrfs_free_path(path);
 out:
 
        }
 }
 
-void btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr)
+static void __btrfs_btree_balance_dirty(struct btrfs_root *root,
+                                       int flush_delayed)
 {
        /*
         * looks as though older kernels can get into trouble with
        if (current->flags & PF_MEMALLOC)
                return;
 
-       btrfs_balance_delayed_items(root);
+       if (flush_delayed)
+               btrfs_balance_delayed_items(root);
 
        num_dirty = root->fs_info->dirty_metadata_bytes;
 
        return;
 }
 
-void __btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr)
+void btrfs_btree_balance_dirty(struct btrfs_root *root)
 {
-       /*
-        * looks as though older kernels can get into trouble with
-        * this code, they end up stuck in balance_dirty_pages forever
-        */
-       u64 num_dirty;
-       unsigned long thresh = 32 * 1024 * 1024;
-
-       if (current->flags & PF_MEMALLOC)
-               return;
-
-       num_dirty = root->fs_info->dirty_metadata_bytes;
+       __btrfs_btree_balance_dirty(root, 1);
+}
 
-       if (num_dirty > thresh) {
-               balance_dirty_pages_ratelimited_nr(
-                                  root->fs_info->btree_inode->i_mapping, 1);
-       }
-       return;
+void btrfs_btree_balance_dirty_nodelay(struct btrfs_root *root)
+{
+       __btrfs_btree_balance_dirty(root, 0);
 }
 
 int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid)
 
 struct btrfs_root *btrfs_read_fs_root_no_name(struct btrfs_fs_info *fs_info,
                                              struct btrfs_key *location);
 int btrfs_cleanup_fs_roots(struct btrfs_fs_info *fs_info);
-void btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr);
-void __btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr);
+void btrfs_btree_balance_dirty(struct btrfs_root *root);
+void btrfs_btree_balance_dirty_nodelay(struct btrfs_root *root);
 void btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root);
 void btrfs_mark_buffer_dirty(struct extent_buffer *buf);
 int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid,
 
                balance_dirty_pages_ratelimited_nr(inode->i_mapping,
                                                   dirty_pages);
                if (dirty_pages < (root->leafsize >> PAGE_CACHE_SHIFT) + 1)
-                       btrfs_btree_balance_dirty(root, 1);
+                       btrfs_btree_balance_dirty(root);
 
                pos += copied;
                num_written += copied;
        u64 cur_offset = lockstart;
        u64 min_size = btrfs_calc_trunc_metadata_size(root, 1);
        u64 drop_end;
-       unsigned long nr;
        int ret = 0;
        int err = 0;
        bool same_page = (offset >> PAGE_CACHE_SHIFT) ==
                        break;
                }
 
-               nr = trans->blocks_used;
                btrfs_end_transaction(trans, root);
-               btrfs_btree_balance_dirty(root, nr);
+               btrfs_btree_balance_dirty(root);
 
                trans = btrfs_start_transaction(root, 3);
                if (IS_ERR(trans)) {
 
        trans->block_rsv = &root->fs_info->trans_block_rsv;
        ret = btrfs_update_inode(trans, root, inode);
-       nr = trans->blocks_used;
        btrfs_end_transaction(trans, root);
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
 out_free:
        btrfs_free_path(path);
        btrfs_free_block_rsv(root, rsv);
 
        struct btrfs_trans_handle *trans;
        struct inode *inode = dentry->d_inode;
        int ret;
-       unsigned long nr = 0;
 
        trans = __unlink_start_trans(dir, dentry);
        if (IS_ERR(trans))
        }
 
 out:
-       nr = trans->blocks_used;
        __unlink_end_trans(trans, root);
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
        return ret;
 }
 
        int err = 0;
        struct btrfs_root *root = BTRFS_I(dir)->root;
        struct btrfs_trans_handle *trans;
-       unsigned long nr = 0;
 
        if (inode->i_size > BTRFS_EMPTY_DIR_SIZE)
                return -ENOTEMPTY;
        if (!err)
                btrfs_i_size_write(inode, 0);
 out:
-       nr = trans->blocks_used;
        __unlink_end_trans(trans, root);
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
 
        return err;
 }
        struct btrfs_root *root = BTRFS_I(inode)->root;
        struct btrfs_block_rsv *rsv, *global_rsv;
        u64 min_size = btrfs_calc_trunc_metadata_size(root, 1);
-       unsigned long nr;
        int ret;
 
        trace_btrfs_inode_evict(inode);
                ret = btrfs_update_inode(trans, root, inode);
                BUG_ON(ret);
 
-               nr = trans->blocks_used;
                btrfs_end_transaction(trans, root);
                trans = NULL;
-               btrfs_btree_balance_dirty(root, nr);
+               btrfs_btree_balance_dirty(root);
        }
 
        btrfs_free_block_rsv(root, rsv);
              root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID))
                btrfs_return_ino(root, btrfs_ino(inode));
 
-       nr = trans->blocks_used;
        btrfs_end_transaction(trans, root);
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
 no_delete:
        clear_inode(inode);
        return;
        int err;
        int drop_inode = 0;
        u64 objectid;
-       unsigned long nr = 0;
        u64 index = 0;
 
        if (!new_valid_dev(rdev))
                d_instantiate(dentry, inode);
        }
 out_unlock:
-       nr = trans->blocks_used;
        btrfs_end_transaction(trans, root);
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
        if (drop_inode) {
                inode_dec_link_count(inode);
                iput(inode);
        struct inode *inode = NULL;
        int drop_inode = 0;
        int err;
-       unsigned long nr = 0;
        u64 objectid;
        u64 index = 0;
 
                d_instantiate(dentry, inode);
        }
 out_unlock:
-       nr = trans->blocks_used;
        btrfs_end_transaction(trans, root);
        if (drop_inode) {
                inode_dec_link_count(inode);
                iput(inode);
        }
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
        return err;
 }
 
        struct btrfs_root *root = BTRFS_I(dir)->root;
        struct inode *inode = old_dentry->d_inode;
        u64 index;
-       unsigned long nr = 0;
        int err;
        int drop_inode = 0;
 
                btrfs_log_new_name(trans, inode, NULL, parent);
        }
 
-       nr = trans->blocks_used;
        btrfs_end_transaction(trans, root);
 fail:
        if (drop_inode) {
                inode_dec_link_count(inode);
                iput(inode);
        }
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
        return err;
 }
 
        int drop_on_err = 0;
        u64 objectid = 0;
        u64 index = 0;
-       unsigned long nr = 1;
 
        /*
         * 2 items for inode and ref
        drop_on_err = 0;
 
 out_fail:
-       nr = trans->blocks_used;
        btrfs_end_transaction(trans, root);
        if (drop_on_err)
                iput(inode);
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
        return err;
 }
 
        int ret;
        int err = 0;
        struct btrfs_trans_handle *trans;
-       unsigned long nr;
        u64 mask = root->sectorsize - 1;
        u64 min_size = btrfs_calc_trunc_metadata_size(root, 1);
 
                        break;
                }
 
-               nr = trans->blocks_used;
                btrfs_end_transaction(trans, root);
-               btrfs_btree_balance_dirty(root, nr);
+               btrfs_btree_balance_dirty(root);
 
                trans = btrfs_start_transaction(root, 2);
                if (IS_ERR(trans)) {
                if (ret && !err)
                        err = ret;
 
-               nr = trans->blocks_used;
                ret = btrfs_end_transaction(trans, root);
-               btrfs_btree_balance_dirty(root, nr);
+               btrfs_btree_balance_dirty(root);
        }
 
 out:
        unsigned long ptr;
        struct btrfs_file_extent_item *ei;
        struct extent_buffer *leaf;
-       unsigned long nr = 0;
 
        name_len = strlen(symname) + 1;
        if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root))
 out_unlock:
        if (!err)
                d_instantiate(dentry, inode);
-       nr = trans->blocks_used;
        btrfs_end_transaction(trans, root);
        if (drop_inode) {
                inode_dec_link_count(inode);
                iput(inode);
        }
-       btrfs_btree_balance_dirty(root, nr);
+       btrfs_btree_balance_dirty(root);
        return err;
 }
 
 
        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;
                               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);
                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);
        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)
        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;
        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;
                        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;
 
                          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) {
        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;
 
 
        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);
 
        struct btrfs_fs_info *info = root->fs_info;
        struct btrfs_trans_handle *trans;
        int ret;
-       unsigned long nr;
 
        if (xchg(&root->defrag_running, 1))
                return 0;
 
                ret = btrfs_defrag_leaves(trans, root, cacheonly);
 
-               nr = trans->blocks_used;
                btrfs_end_transaction(trans, root);
-               btrfs_btree_balance_dirty(info->tree_root, nr);
+               btrfs_btree_balance_dirty(info->tree_root);
                cond_resched();
 
                if (btrfs_fs_closing(root->fs_info) || ret != -EAGAIN)