Move these into block_rsv.c/h respectively, and export them for use by
alloc_tree_block.

Signed-off-by: Josef Bacik <jo...@toxicpanda.com>
---
 fs/btrfs/block-rsv.c   | 82 ++++++++++++++++++++++++++++++++++++++++++++
 fs/btrfs/block-rsv.h   | 13 ++++++-
 fs/btrfs/extent-tree.c | 92 ++------------------------------------------------
 3 files changed, 96 insertions(+), 91 deletions(-)

diff --git a/fs/btrfs/block-rsv.c b/fs/btrfs/block-rsv.c
index bdc798d2ee5a..9754b2ca8126 100644
--- a/fs/btrfs/block-rsv.c
+++ b/fs/btrfs/block-rsv.c
@@ -6,6 +6,7 @@
 #include "block-rsv.h"
 #include "space-info.h"
 #include "math.h"
+#include "transaction.h"
 
 static u64 block_rsv_release_bytes(struct btrfs_fs_info *fs_info,
                                    struct btrfs_block_rsv *block_rsv,
@@ -345,3 +346,84 @@ void btrfs_release_global_block_rsv(struct btrfs_fs_info 
*fs_info)
        WARN_ON(fs_info->delayed_refs_rsv.reserved > 0);
        WARN_ON(fs_info->delayed_refs_rsv.size > 0);
 }
+
+static struct btrfs_block_rsv *get_block_rsv(
+                                       const struct btrfs_trans_handle *trans,
+                                       const struct btrfs_root *root)
+{
+       struct btrfs_fs_info *fs_info = root->fs_info;
+       struct btrfs_block_rsv *block_rsv = NULL;
+
+       if (test_bit(BTRFS_ROOT_REF_COWS, &root->state) ||
+           (root == fs_info->csum_root && trans->adding_csums) ||
+           (root == fs_info->uuid_root))
+               block_rsv = trans->block_rsv;
+
+       if (!block_rsv)
+               block_rsv = root->block_rsv;
+
+       if (!block_rsv)
+               block_rsv = &fs_info->empty_block_rsv;
+
+       return block_rsv;
+}
+
+struct btrfs_block_rsv *btrfs_use_block_rsv(struct btrfs_trans_handle *trans,
+                                           struct btrfs_root *root,
+                                           u32 blocksize)
+{
+       struct btrfs_fs_info *fs_info = root->fs_info;
+       struct btrfs_block_rsv *block_rsv;
+       struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
+       int ret;
+       bool global_updated = false;
+
+       block_rsv = get_block_rsv(trans, root);
+
+       if (unlikely(block_rsv->size == 0))
+               goto try_reserve;
+again:
+       ret = btrfs_block_rsv_use_bytes(block_rsv, blocksize);
+       if (!ret)
+               return block_rsv;
+
+       if (block_rsv->failfast)
+               return ERR_PTR(ret);
+
+       if (block_rsv->type == BTRFS_BLOCK_RSV_GLOBAL && !global_updated) {
+               global_updated = true;
+               btrfs_update_global_block_rsv(fs_info);
+               goto again;
+       }
+
+       /*
+        * The global reserve still exists to save us from ourselves, so don't
+        * warn_on if we are short on our delayed refs reserve.
+        */
+       if (block_rsv->type != BTRFS_BLOCK_RSV_DELREFS &&
+           btrfs_test_opt(fs_info, ENOSPC_DEBUG)) {
+               static DEFINE_RATELIMIT_STATE(_rs,
+                               DEFAULT_RATELIMIT_INTERVAL * 10,
+                               /*DEFAULT_RATELIMIT_BURST*/ 1);
+               if (__ratelimit(&_rs))
+                       WARN(1, KERN_DEBUG
+                               "BTRFS: block rsv returned %d\n", ret);
+       }
+try_reserve:
+       ret = btrfs_reserve_metadata_bytes(root, block_rsv, blocksize,
+                                          BTRFS_RESERVE_NO_FLUSH);
+       if (!ret)
+               return block_rsv;
+       /*
+        * If we couldn't reserve metadata bytes try and use some from
+        * the global reserve if its space type is the same as the global
+        * reservation.
+        */
+       if (block_rsv->type != BTRFS_BLOCK_RSV_GLOBAL &&
+           block_rsv->space_info == global_rsv->space_info) {
+               ret = btrfs_block_rsv_use_bytes(global_rsv, blocksize);
+               if (!ret)
+                       return global_rsv;
+       }
+       return ERR_PTR(ret);
+}
diff --git a/fs/btrfs/block-rsv.h b/fs/btrfs/block-rsv.h
index 8f302d1ac5e2..3dc49dc3c01d 100644
--- a/fs/btrfs/block-rsv.h
+++ b/fs/btrfs/block-rsv.h
@@ -6,7 +6,7 @@
 #ifndef BTRFS_BLOCK_RSV_H
 #define BTRFS_BLOCK_RSV_H
 
-
+struct btrfs_trans_handle;
 enum btrfs_reserve_flush_enum;
 
 /*
@@ -83,6 +83,9 @@ u64 __btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
 void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info);
 void btrfs_init_global_block_rsv(struct btrfs_fs_info *fs_info);
 void btrfs_release_global_block_rsv(struct btrfs_fs_info *fs_info);
+struct btrfs_block_rsv *btrfs_use_block_rsv(struct btrfs_trans_handle *trans,
+                                           struct btrfs_root *root,
+                                           u32 blocksize);
 
 static inline void btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
                                           struct btrfs_block_rsv *block_rsv,
@@ -90,4 +93,12 @@ static inline void btrfs_block_rsv_release(struct 
btrfs_fs_info *fs_info,
 {
        __btrfs_block_rsv_release(fs_info, block_rsv, num_bytes, NULL);
 }
+
+static inline void btrfs_unuse_block_rsv(struct btrfs_fs_info *fs_info,
+                                        struct btrfs_block_rsv *block_rsv,
+                                        u32 blocksize)
+{
+       btrfs_block_rsv_add_bytes(block_rsv, blocksize, false);
+       btrfs_block_rsv_release(fs_info, block_rsv, 0);
+}
 #endif /* BTRFS_BLOCK_RSV_H */
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 5884b06dd15d..dffd338b01fc 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -4349,27 +4349,6 @@ int btrfs_chunk_alloc(struct btrfs_trans_handle *trans, 
u64 flags,
        return ret;
 }
 
-static struct btrfs_block_rsv *get_block_rsv(
-                                       const struct btrfs_trans_handle *trans,
-                                       const struct btrfs_root *root)
-{
-       struct btrfs_fs_info *fs_info = root->fs_info;
-       struct btrfs_block_rsv *block_rsv = NULL;
-
-       if (test_bit(BTRFS_ROOT_REF_COWS, &root->state) ||
-           (root == fs_info->csum_root && trans->adding_csums) ||
-           (root == fs_info->uuid_root))
-               block_rsv = trans->block_rsv;
-
-       if (!block_rsv)
-               block_rsv = root->block_rsv;
-
-       if (!block_rsv)
-               block_rsv = &fs_info->empty_block_rsv;
-
-       return block_rsv;
-}
-
 /**
  * btrfs_migrate_to_delayed_refs_rsv - transfer bytes to our delayed refs rsv.
  * @fs_info - the fs info for our fs.
@@ -7037,73 +7016,6 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, 
struct btrfs_root *root,
        return buf;
 }
 
-static struct btrfs_block_rsv *
-use_block_rsv(struct btrfs_trans_handle *trans,
-             struct btrfs_root *root, u32 blocksize)
-{
-       struct btrfs_fs_info *fs_info = root->fs_info;
-       struct btrfs_block_rsv *block_rsv;
-       struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
-       int ret;
-       bool global_updated = false;
-
-       block_rsv = get_block_rsv(trans, root);
-
-       if (unlikely(block_rsv->size == 0))
-               goto try_reserve;
-again:
-       ret = btrfs_block_rsv_use_bytes(block_rsv, blocksize);
-       if (!ret)
-               return block_rsv;
-
-       if (block_rsv->failfast)
-               return ERR_PTR(ret);
-
-       if (block_rsv->type == BTRFS_BLOCK_RSV_GLOBAL && !global_updated) {
-               global_updated = true;
-               btrfs_update_global_block_rsv(fs_info);
-               goto again;
-       }
-
-       /*
-        * The global reserve still exists to save us from ourselves, so don't
-        * warn_on if we are short on our delayed refs reserve.
-        */
-       if (block_rsv->type != BTRFS_BLOCK_RSV_DELREFS &&
-           btrfs_test_opt(fs_info, ENOSPC_DEBUG)) {
-               static DEFINE_RATELIMIT_STATE(_rs,
-                               DEFAULT_RATELIMIT_INTERVAL * 10,
-                               /*DEFAULT_RATELIMIT_BURST*/ 1);
-               if (__ratelimit(&_rs))
-                       WARN(1, KERN_DEBUG
-                               "BTRFS: block rsv returned %d\n", ret);
-       }
-try_reserve:
-       ret = btrfs_reserve_metadata_bytes(root, block_rsv, blocksize,
-                                          BTRFS_RESERVE_NO_FLUSH);
-       if (!ret)
-               return block_rsv;
-       /*
-        * If we couldn't reserve metadata bytes try and use some from
-        * the global reserve if its space type is the same as the global
-        * reservation.
-        */
-       if (block_rsv->type != BTRFS_BLOCK_RSV_GLOBAL &&
-           block_rsv->space_info == global_rsv->space_info) {
-               ret = btrfs_block_rsv_use_bytes(global_rsv, blocksize);
-               if (!ret)
-                       return global_rsv;
-       }
-       return ERR_PTR(ret);
-}
-
-static void unuse_block_rsv(struct btrfs_fs_info *fs_info,
-                           struct btrfs_block_rsv *block_rsv, u32 blocksize)
-{
-       btrfs_block_rsv_add_bytes(block_rsv, blocksize, false);
-       btrfs_block_rsv_release(fs_info, block_rsv, 0);
-}
-
 /*
  * finds a free extent and does all the dirty work required for allocation
  * returns the tree buffer or an ERR_PTR on error.
@@ -7136,7 +7048,7 @@ struct extent_buffer *btrfs_alloc_tree_block(struct 
btrfs_trans_handle *trans,
        }
 #endif
 
-       block_rsv = use_block_rsv(trans, root, blocksize);
+       block_rsv = btrfs_use_block_rsv(trans, root, blocksize);
        if (IS_ERR(block_rsv))
                return ERR_CAST(block_rsv);
 
@@ -7194,7 +7106,7 @@ struct extent_buffer *btrfs_alloc_tree_block(struct 
btrfs_trans_handle *trans,
 out_free_reserved:
        btrfs_free_reserved_extent(fs_info, ins.objectid, ins.offset, 0);
 out_unuse:
-       unuse_block_rsv(fs_info, block_rsv, blocksize);
+       btrfs_unuse_block_rsv(fs_info, block_rsv, blocksize);
        return ERR_PTR(ret);
 }
 
-- 
2.14.3

Reply via email to