btrfs: trim: Check the range passed into to prevent overflow
[sfrench/cifs-2.6.git] / fs / btrfs / extent-tree.c
index c887f335234174a0249fcda8a5e3ed5ce6636485..8b7eb22d508a597b3bcc97f018c096f6d251e715 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include <linux/sched.h>
+#include <linux/sched/mm.h>
 #include <linux/sched/signal.h>
 #include <linux/pagemap.h>
 #include <linux/writeback.h>
@@ -29,6 +30,8 @@
 #include "qgroup.h"
 #include "ref-verify.h"
 #include "space-info.h"
+#include "block-rsv.h"
+#include "delalloc-space.h"
 
 #undef SCRAMBLE_DELAYED_REFS
 
@@ -2752,49 +2755,6 @@ u64 btrfs_csum_bytes_to_leaves(struct btrfs_fs_info *fs_info, u64 csum_bytes)
        return num_csums;
 }
 
-bool btrfs_check_space_for_delayed_refs(struct btrfs_fs_info *fs_info)
-{
-       struct btrfs_block_rsv *delayed_refs_rsv = &fs_info->delayed_refs_rsv;
-       struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
-       bool ret = false;
-       u64 reserved;
-
-       spin_lock(&global_rsv->lock);
-       reserved = global_rsv->reserved;
-       spin_unlock(&global_rsv->lock);
-
-       /*
-        * Since the global reserve is just kind of magic we don't really want
-        * to rely on it to save our bacon, so if our size is more than the
-        * delayed_refs_rsv and the global rsv then it's time to think about
-        * bailing.
-        */
-       spin_lock(&delayed_refs_rsv->lock);
-       reserved += delayed_refs_rsv->reserved;
-       if (delayed_refs_rsv->size >= reserved)
-               ret = true;
-       spin_unlock(&delayed_refs_rsv->lock);
-       return ret;
-}
-
-int btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans)
-{
-       u64 num_entries =
-               atomic_read(&trans->transaction->delayed_refs.num_entries);
-       u64 avg_runtime;
-       u64 val;
-
-       smp_mb();
-       avg_runtime = trans->fs_info->avg_delayed_ref_runtime;
-       val = num_entries * avg_runtime;
-       if (val >= NSEC_PER_SEC)
-               return 1;
-       if (val >= NSEC_PER_SEC / 2)
-               return 2;
-
-       return btrfs_check_space_for_delayed_refs(trans->fs_info);
-}
-
 /*
  * this starts processing the delayed reference count updates and
  * extent insertions we have queued up so far.  count can be
@@ -3909,206 +3869,6 @@ u64 btrfs_system_alloc_profile(struct btrfs_fs_info *fs_info)
        return get_alloc_profile(fs_info, BTRFS_BLOCK_GROUP_SYSTEM);
 }
 
-int btrfs_alloc_data_chunk_ondemand(struct btrfs_inode *inode, u64 bytes)
-{
-       struct btrfs_root *root = inode->root;
-       struct btrfs_fs_info *fs_info = root->fs_info;
-       struct btrfs_space_info *data_sinfo = fs_info->data_sinfo;
-       u64 used;
-       int ret = 0;
-       int need_commit = 2;
-       int have_pinned_space;
-
-       /* make sure bytes are sectorsize aligned */
-       bytes = ALIGN(bytes, fs_info->sectorsize);
-
-       if (btrfs_is_free_space_inode(inode)) {
-               need_commit = 0;
-               ASSERT(current->journal_info);
-       }
-
-again:
-       /* make sure we have enough space to handle the data first */
-       spin_lock(&data_sinfo->lock);
-       used = btrfs_space_info_used(data_sinfo, true);
-
-       if (used + bytes > data_sinfo->total_bytes) {
-               struct btrfs_trans_handle *trans;
-
-               /*
-                * if we don't have enough free bytes in this space then we need
-                * to alloc a new chunk.
-                */
-               if (!data_sinfo->full) {
-                       u64 alloc_target;
-
-                       data_sinfo->force_alloc = CHUNK_ALLOC_FORCE;
-                       spin_unlock(&data_sinfo->lock);
-
-                       alloc_target = btrfs_data_alloc_profile(fs_info);
-                       /*
-                        * It is ugly that we don't call nolock join
-                        * transaction for the free space inode case here.
-                        * But it is safe because we only do the data space
-                        * reservation for the free space cache in the
-                        * transaction context, the common join transaction
-                        * just increase the counter of the current transaction
-                        * handler, doesn't try to acquire the trans_lock of
-                        * the fs.
-                        */
-                       trans = btrfs_join_transaction(root);
-                       if (IS_ERR(trans))
-                               return PTR_ERR(trans);
-
-                       ret = btrfs_chunk_alloc(trans, alloc_target,
-                                               CHUNK_ALLOC_NO_FORCE);
-                       btrfs_end_transaction(trans);
-                       if (ret < 0) {
-                               if (ret != -ENOSPC)
-                                       return ret;
-                               else {
-                                       have_pinned_space = 1;
-                                       goto commit_trans;
-                               }
-                       }
-
-                       goto again;
-               }
-
-               /*
-                * If we don't have enough pinned space to deal with this
-                * allocation, and no removed chunk in current transaction,
-                * don't bother committing the transaction.
-                */
-               have_pinned_space = __percpu_counter_compare(
-                       &data_sinfo->total_bytes_pinned,
-                       used + bytes - data_sinfo->total_bytes,
-                       BTRFS_TOTAL_BYTES_PINNED_BATCH);
-               spin_unlock(&data_sinfo->lock);
-
-               /* commit the current transaction and try again */
-commit_trans:
-               if (need_commit) {
-                       need_commit--;
-
-                       if (need_commit > 0) {
-                               btrfs_start_delalloc_roots(fs_info, -1);
-                               btrfs_wait_ordered_roots(fs_info, U64_MAX, 0,
-                                                        (u64)-1);
-                       }
-
-                       trans = btrfs_join_transaction(root);
-                       if (IS_ERR(trans))
-                               return PTR_ERR(trans);
-                       if (have_pinned_space >= 0 ||
-                           test_bit(BTRFS_TRANS_HAVE_FREE_BGS,
-                                    &trans->transaction->flags) ||
-                           need_commit > 0) {
-                               ret = btrfs_commit_transaction(trans);
-                               if (ret)
-                                       return ret;
-                               /*
-                                * The cleaner kthread might still be doing iput
-                                * operations. Wait for it to finish so that
-                                * more space is released.  We don't need to
-                                * explicitly run the delayed iputs here because
-                                * the commit_transaction would have woken up
-                                * the cleaner.
-                                */
-                               ret = btrfs_wait_on_delayed_iputs(fs_info);
-                               if (ret)
-                                       return ret;
-                               goto again;
-                       } else {
-                               btrfs_end_transaction(trans);
-                       }
-               }
-
-               trace_btrfs_space_reservation(fs_info,
-                                             "space_info:enospc",
-                                             data_sinfo->flags, bytes, 1);
-               return -ENOSPC;
-       }
-       btrfs_space_info_update_bytes_may_use(fs_info, data_sinfo, bytes);
-       trace_btrfs_space_reservation(fs_info, "space_info",
-                                     data_sinfo->flags, bytes, 1);
-       spin_unlock(&data_sinfo->lock);
-
-       return 0;
-}
-
-int btrfs_check_data_free_space(struct inode *inode,
-                       struct extent_changeset **reserved, u64 start, u64 len)
-{
-       struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
-       int ret;
-
-       /* align the range */
-       len = round_up(start + len, fs_info->sectorsize) -
-             round_down(start, fs_info->sectorsize);
-       start = round_down(start, fs_info->sectorsize);
-
-       ret = btrfs_alloc_data_chunk_ondemand(BTRFS_I(inode), len);
-       if (ret < 0)
-               return ret;
-
-       /* Use new btrfs_qgroup_reserve_data to reserve precious data space. */
-       ret = btrfs_qgroup_reserve_data(inode, reserved, start, len);
-       if (ret < 0)
-               btrfs_free_reserved_data_space_noquota(inode, start, len);
-       else
-               ret = 0;
-       return ret;
-}
-
-/*
- * Called if we need to clear a data reservation for this inode
- * Normally in a error case.
- *
- * This one will *NOT* use accurate qgroup reserved space API, just for case
- * which we can't sleep and is sure it won't affect qgroup reserved space.
- * Like clear_bit_hook().
- */
-void btrfs_free_reserved_data_space_noquota(struct inode *inode, u64 start,
-                                           u64 len)
-{
-       struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
-       struct btrfs_space_info *data_sinfo;
-
-       /* Make sure the range is aligned to sectorsize */
-       len = round_up(start + len, fs_info->sectorsize) -
-             round_down(start, fs_info->sectorsize);
-       start = round_down(start, fs_info->sectorsize);
-
-       data_sinfo = fs_info->data_sinfo;
-       spin_lock(&data_sinfo->lock);
-       btrfs_space_info_update_bytes_may_use(fs_info, data_sinfo, -len);
-       trace_btrfs_space_reservation(fs_info, "space_info",
-                                     data_sinfo->flags, len, 0);
-       spin_unlock(&data_sinfo->lock);
-}
-
-/*
- * Called if we need to clear a data reservation for this inode
- * Normally in a error case.
- *
- * This one will handle the per-inode data rsv map for accurate reserved
- * space framework.
- */
-void btrfs_free_reserved_data_space(struct inode *inode,
-                       struct extent_changeset *reserved, u64 start, u64 len)
-{
-       struct btrfs_root *root = BTRFS_I(inode)->root;
-
-       /* Make sure the range is aligned to sectorsize */
-       len = round_up(start + len, root->fs_info->sectorsize) -
-             round_down(start, root->fs_info->sectorsize);
-       start = round_down(start, root->fs_info->sectorsize);
-
-       btrfs_free_reserved_data_space_noquota(inode, start, len);
-       btrfs_qgroup_free_data(inode, reserved, start, len);
-}
-
 static void force_metadata_allocation(struct btrfs_fs_info *info)
 {
        struct list_head *head = &info->space_info;
@@ -4346,852 +4106,6 @@ out:
        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;
-}
-
-int btrfs_block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv, u64 num_bytes)
-{
-       int ret = -ENOSPC;
-       spin_lock(&block_rsv->lock);
-       if (block_rsv->reserved >= num_bytes) {
-               block_rsv->reserved -= num_bytes;
-               if (block_rsv->reserved < block_rsv->size)
-                       block_rsv->full = 0;
-               ret = 0;
-       }
-       spin_unlock(&block_rsv->lock);
-       return ret;
-}
-
-static void block_rsv_add_bytes(struct btrfs_block_rsv *block_rsv,
-                               u64 num_bytes, bool update_size)
-{
-       spin_lock(&block_rsv->lock);
-       block_rsv->reserved += num_bytes;
-       if (update_size)
-               block_rsv->size += num_bytes;
-       else if (block_rsv->reserved >= block_rsv->size)
-               block_rsv->full = 1;
-       spin_unlock(&block_rsv->lock);
-}
-
-int btrfs_cond_migrate_bytes(struct btrfs_fs_info *fs_info,
-                            struct btrfs_block_rsv *dest, u64 num_bytes,
-                            int min_factor)
-{
-       struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
-       u64 min_bytes;
-
-       if (global_rsv->space_info != dest->space_info)
-               return -ENOSPC;
-
-       spin_lock(&global_rsv->lock);
-       min_bytes = div_factor(global_rsv->size, min_factor);
-       if (global_rsv->reserved < min_bytes + num_bytes) {
-               spin_unlock(&global_rsv->lock);
-               return -ENOSPC;
-       }
-       global_rsv->reserved -= num_bytes;
-       if (global_rsv->reserved < global_rsv->size)
-               global_rsv->full = 0;
-       spin_unlock(&global_rsv->lock);
-
-       block_rsv_add_bytes(dest, num_bytes, true);
-       return 0;
-}
-
-/**
- * btrfs_migrate_to_delayed_refs_rsv - transfer bytes to our delayed refs rsv.
- * @fs_info - the fs info for our fs.
- * @src - the source block rsv to transfer from.
- * @num_bytes - the number of bytes to transfer.
- *
- * This transfers up to the num_bytes amount from the src rsv to the
- * delayed_refs_rsv.  Any extra bytes are returned to the space info.
- */
-void btrfs_migrate_to_delayed_refs_rsv(struct btrfs_fs_info *fs_info,
-                                      struct btrfs_block_rsv *src,
-                                      u64 num_bytes)
-{
-       struct btrfs_block_rsv *delayed_refs_rsv = &fs_info->delayed_refs_rsv;
-       u64 to_free = 0;
-
-       spin_lock(&src->lock);
-       src->reserved -= num_bytes;
-       src->size -= num_bytes;
-       spin_unlock(&src->lock);
-
-       spin_lock(&delayed_refs_rsv->lock);
-       if (delayed_refs_rsv->size > delayed_refs_rsv->reserved) {
-               u64 delta = delayed_refs_rsv->size -
-                       delayed_refs_rsv->reserved;
-               if (num_bytes > delta) {
-                       to_free = num_bytes - delta;
-                       num_bytes = delta;
-               }
-       } else {
-               to_free = num_bytes;
-               num_bytes = 0;
-       }
-
-       if (num_bytes)
-               delayed_refs_rsv->reserved += num_bytes;
-       if (delayed_refs_rsv->reserved >= delayed_refs_rsv->size)
-               delayed_refs_rsv->full = 1;
-       spin_unlock(&delayed_refs_rsv->lock);
-
-       if (num_bytes)
-               trace_btrfs_space_reservation(fs_info, "delayed_refs_rsv",
-                                             0, num_bytes, 1);
-       if (to_free)
-               btrfs_space_info_add_old_bytes(fs_info,
-                               delayed_refs_rsv->space_info, to_free);
-}
-
-/**
- * btrfs_delayed_refs_rsv_refill - refill based on our delayed refs usage.
- * @fs_info - the fs_info for our fs.
- * @flush - control how we can flush for this reservation.
- *
- * This will refill the delayed block_rsv up to 1 items size worth of space and
- * will return -ENOSPC if we can't make the reservation.
- */
-int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info,
-                                 enum btrfs_reserve_flush_enum flush)
-{
-       struct btrfs_block_rsv *block_rsv = &fs_info->delayed_refs_rsv;
-       u64 limit = btrfs_calc_trans_metadata_size(fs_info, 1);
-       u64 num_bytes = 0;
-       int ret = -ENOSPC;
-
-       spin_lock(&block_rsv->lock);
-       if (block_rsv->reserved < block_rsv->size) {
-               num_bytes = block_rsv->size - block_rsv->reserved;
-               num_bytes = min(num_bytes, limit);
-       }
-       spin_unlock(&block_rsv->lock);
-
-       if (!num_bytes)
-               return 0;
-
-       ret = btrfs_reserve_metadata_bytes(fs_info->extent_root, block_rsv,
-                                          num_bytes, flush);
-       if (ret)
-               return ret;
-       block_rsv_add_bytes(block_rsv, num_bytes, 0);
-       trace_btrfs_space_reservation(fs_info, "delayed_refs_rsv",
-                                     0, num_bytes, 1);
-       return 0;
-}
-
-static u64 block_rsv_release_bytes(struct btrfs_fs_info *fs_info,
-                                   struct btrfs_block_rsv *block_rsv,
-                                   struct btrfs_block_rsv *dest, u64 num_bytes,
-                                   u64 *qgroup_to_release_ret)
-{
-       struct btrfs_space_info *space_info = block_rsv->space_info;
-       u64 qgroup_to_release = 0;
-       u64 ret;
-
-       spin_lock(&block_rsv->lock);
-       if (num_bytes == (u64)-1) {
-               num_bytes = block_rsv->size;
-               qgroup_to_release = block_rsv->qgroup_rsv_size;
-       }
-       block_rsv->size -= num_bytes;
-       if (block_rsv->reserved >= block_rsv->size) {
-               num_bytes = block_rsv->reserved - block_rsv->size;
-               block_rsv->reserved = block_rsv->size;
-               block_rsv->full = 1;
-       } else {
-               num_bytes = 0;
-       }
-       if (block_rsv->qgroup_rsv_reserved >= block_rsv->qgroup_rsv_size) {
-               qgroup_to_release = block_rsv->qgroup_rsv_reserved -
-                                   block_rsv->qgroup_rsv_size;
-               block_rsv->qgroup_rsv_reserved = block_rsv->qgroup_rsv_size;
-       } else {
-               qgroup_to_release = 0;
-       }
-       spin_unlock(&block_rsv->lock);
-
-       ret = num_bytes;
-       if (num_bytes > 0) {
-               if (dest) {
-                       spin_lock(&dest->lock);
-                       if (!dest->full) {
-                               u64 bytes_to_add;
-
-                               bytes_to_add = dest->size - dest->reserved;
-                               bytes_to_add = min(num_bytes, bytes_to_add);
-                               dest->reserved += bytes_to_add;
-                               if (dest->reserved >= dest->size)
-                                       dest->full = 1;
-                               num_bytes -= bytes_to_add;
-                       }
-                       spin_unlock(&dest->lock);
-               }
-               if (num_bytes)
-                       btrfs_space_info_add_old_bytes(fs_info, space_info,
-                                                      num_bytes);
-       }
-       if (qgroup_to_release_ret)
-               *qgroup_to_release_ret = qgroup_to_release;
-       return ret;
-}
-
-int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src,
-                           struct btrfs_block_rsv *dst, u64 num_bytes,
-                           bool update_size)
-{
-       int ret;
-
-       ret = btrfs_block_rsv_use_bytes(src, num_bytes);
-       if (ret)
-               return ret;
-
-       block_rsv_add_bytes(dst, num_bytes, update_size);
-       return 0;
-}
-
-void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type)
-{
-       memset(rsv, 0, sizeof(*rsv));
-       spin_lock_init(&rsv->lock);
-       rsv->type = type;
-}
-
-void btrfs_init_metadata_block_rsv(struct btrfs_fs_info *fs_info,
-                                  struct btrfs_block_rsv *rsv,
-                                  unsigned short type)
-{
-       btrfs_init_block_rsv(rsv, type);
-       rsv->space_info = btrfs_find_space_info(fs_info,
-                                           BTRFS_BLOCK_GROUP_METADATA);
-}
-
-struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info,
-                                             unsigned short type)
-{
-       struct btrfs_block_rsv *block_rsv;
-
-       block_rsv = kmalloc(sizeof(*block_rsv), GFP_NOFS);
-       if (!block_rsv)
-               return NULL;
-
-       btrfs_init_metadata_block_rsv(fs_info, block_rsv, type);
-       return block_rsv;
-}
-
-void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info,
-                         struct btrfs_block_rsv *rsv)
-{
-       if (!rsv)
-               return;
-       btrfs_block_rsv_release(fs_info, rsv, (u64)-1);
-       kfree(rsv);
-}
-
-int btrfs_block_rsv_add(struct btrfs_root *root,
-                       struct btrfs_block_rsv *block_rsv, u64 num_bytes,
-                       enum btrfs_reserve_flush_enum flush)
-{
-       int ret;
-
-       if (num_bytes == 0)
-               return 0;
-
-       ret = btrfs_reserve_metadata_bytes(root, block_rsv, num_bytes, flush);
-       if (!ret)
-               block_rsv_add_bytes(block_rsv, num_bytes, true);
-
-       return ret;
-}
-
-int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor)
-{
-       u64 num_bytes = 0;
-       int ret = -ENOSPC;
-
-       if (!block_rsv)
-               return 0;
-
-       spin_lock(&block_rsv->lock);
-       num_bytes = div_factor(block_rsv->size, min_factor);
-       if (block_rsv->reserved >= num_bytes)
-               ret = 0;
-       spin_unlock(&block_rsv->lock);
-
-       return ret;
-}
-
-int btrfs_block_rsv_refill(struct btrfs_root *root,
-                          struct btrfs_block_rsv *block_rsv, u64 min_reserved,
-                          enum btrfs_reserve_flush_enum flush)
-{
-       u64 num_bytes = 0;
-       int ret = -ENOSPC;
-
-       if (!block_rsv)
-               return 0;
-
-       spin_lock(&block_rsv->lock);
-       num_bytes = min_reserved;
-       if (block_rsv->reserved >= num_bytes)
-               ret = 0;
-       else
-               num_bytes -= block_rsv->reserved;
-       spin_unlock(&block_rsv->lock);
-
-       if (!ret)
-               return 0;
-
-       ret = btrfs_reserve_metadata_bytes(root, block_rsv, num_bytes, flush);
-       if (!ret) {
-               block_rsv_add_bytes(block_rsv, num_bytes, false);
-               return 0;
-       }
-
-       return ret;
-}
-
-static u64 __btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
-                                    struct btrfs_block_rsv *block_rsv,
-                                    u64 num_bytes, u64 *qgroup_to_release)
-{
-       struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
-       struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_refs_rsv;
-       struct btrfs_block_rsv *target = delayed_rsv;
-
-       if (target->full || target == block_rsv)
-               target = global_rsv;
-
-       if (block_rsv->space_info != target->space_info)
-               target = NULL;
-
-       return block_rsv_release_bytes(fs_info, block_rsv, target, num_bytes,
-                                      qgroup_to_release);
-}
-
-void btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
-                            struct btrfs_block_rsv *block_rsv,
-                            u64 num_bytes)
-{
-       __btrfs_block_rsv_release(fs_info, block_rsv, num_bytes, NULL);
-}
-
-/**
- * btrfs_inode_rsv_release - release any excessive reservation.
- * @inode - the inode we need to release from.
- * @qgroup_free - free or convert qgroup meta.
- *   Unlike normal operation, qgroup meta reservation needs to know if we are
- *   freeing qgroup reservation or just converting it into per-trans.  Normally
- *   @qgroup_free is true for error handling, and false for normal release.
- *
- * This is the same as btrfs_block_rsv_release, except that it handles the
- * tracepoint for the reservation.
- */
-static void btrfs_inode_rsv_release(struct btrfs_inode *inode, bool qgroup_free)
-{
-       struct btrfs_fs_info *fs_info = inode->root->fs_info;
-       struct btrfs_block_rsv *block_rsv = &inode->block_rsv;
-       u64 released = 0;
-       u64 qgroup_to_release = 0;
-
-       /*
-        * Since we statically set the block_rsv->size we just want to say we
-        * are releasing 0 bytes, and then we'll just get the reservation over
-        * the size free'd.
-        */
-       released = __btrfs_block_rsv_release(fs_info, block_rsv, 0,
-                                            &qgroup_to_release);
-       if (released > 0)
-               trace_btrfs_space_reservation(fs_info, "delalloc",
-                                             btrfs_ino(inode), released, 0);
-       if (qgroup_free)
-               btrfs_qgroup_free_meta_prealloc(inode->root, qgroup_to_release);
-       else
-               btrfs_qgroup_convert_reserved_meta(inode->root,
-                                                  qgroup_to_release);
-}
-
-/**
- * btrfs_delayed_refs_rsv_release - release a ref head's reservation.
- * @fs_info - the fs_info for our fs.
- * @nr - the number of items to drop.
- *
- * This drops the delayed ref head's count from the delayed refs rsv and frees
- * any excess reservation we had.
- */
-void btrfs_delayed_refs_rsv_release(struct btrfs_fs_info *fs_info, int nr)
-{
-       struct btrfs_block_rsv *block_rsv = &fs_info->delayed_refs_rsv;
-       struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
-       u64 num_bytes = btrfs_calc_trans_metadata_size(fs_info, nr);
-       u64 released = 0;
-
-       released = block_rsv_release_bytes(fs_info, block_rsv, global_rsv,
-                                          num_bytes, NULL);
-       if (released)
-               trace_btrfs_space_reservation(fs_info, "delayed_refs_rsv",
-                                             0, released, 0);
-}
-
-static void update_global_block_rsv(struct btrfs_fs_info *fs_info)
-{
-       struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv;
-       struct btrfs_space_info *sinfo = block_rsv->space_info;
-       u64 num_bytes;
-
-       /*
-        * The global block rsv is based on the size of the extent tree, the
-        * checksum tree and the root tree.  If the fs is empty we want to set
-        * it to a minimal amount for safety.
-        */
-       num_bytes = btrfs_root_used(&fs_info->extent_root->root_item) +
-               btrfs_root_used(&fs_info->csum_root->root_item) +
-               btrfs_root_used(&fs_info->tree_root->root_item);
-       num_bytes = max_t(u64, num_bytes, SZ_16M);
-
-       spin_lock(&sinfo->lock);
-       spin_lock(&block_rsv->lock);
-
-       block_rsv->size = min_t(u64, num_bytes, SZ_512M);
-
-       if (block_rsv->reserved < block_rsv->size) {
-               num_bytes = btrfs_space_info_used(sinfo, true);
-               if (sinfo->total_bytes > num_bytes) {
-                       num_bytes = sinfo->total_bytes - num_bytes;
-                       num_bytes = min(num_bytes,
-                                       block_rsv->size - block_rsv->reserved);
-                       block_rsv->reserved += num_bytes;
-                       btrfs_space_info_update_bytes_may_use(fs_info, sinfo,
-                                                             num_bytes);
-                       trace_btrfs_space_reservation(fs_info, "space_info",
-                                                     sinfo->flags, num_bytes,
-                                                     1);
-               }
-       } else if (block_rsv->reserved > block_rsv->size) {
-               num_bytes = block_rsv->reserved - block_rsv->size;
-               btrfs_space_info_update_bytes_may_use(fs_info, sinfo,
-                                                     -num_bytes);
-               trace_btrfs_space_reservation(fs_info, "space_info",
-                                     sinfo->flags, num_bytes, 0);
-               block_rsv->reserved = block_rsv->size;
-       }
-
-       if (block_rsv->reserved == block_rsv->size)
-               block_rsv->full = 1;
-       else
-               block_rsv->full = 0;
-
-       spin_unlock(&block_rsv->lock);
-       spin_unlock(&sinfo->lock);
-}
-
-static void init_global_block_rsv(struct btrfs_fs_info *fs_info)
-{
-       struct btrfs_space_info *space_info;
-
-       space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_SYSTEM);
-       fs_info->chunk_block_rsv.space_info = space_info;
-
-       space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA);
-       fs_info->global_block_rsv.space_info = space_info;
-       fs_info->trans_block_rsv.space_info = space_info;
-       fs_info->empty_block_rsv.space_info = space_info;
-       fs_info->delayed_block_rsv.space_info = space_info;
-       fs_info->delayed_refs_rsv.space_info = space_info;
-
-       fs_info->extent_root->block_rsv = &fs_info->delayed_refs_rsv;
-       fs_info->csum_root->block_rsv = &fs_info->delayed_refs_rsv;
-       fs_info->dev_root->block_rsv = &fs_info->global_block_rsv;
-       fs_info->tree_root->block_rsv = &fs_info->global_block_rsv;
-       if (fs_info->quota_root)
-               fs_info->quota_root->block_rsv = &fs_info->global_block_rsv;
-       fs_info->chunk_root->block_rsv = &fs_info->chunk_block_rsv;
-
-       update_global_block_rsv(fs_info);
-}
-
-static void release_global_block_rsv(struct btrfs_fs_info *fs_info)
-{
-       block_rsv_release_bytes(fs_info, &fs_info->global_block_rsv, NULL,
-                               (u64)-1, NULL);
-       WARN_ON(fs_info->trans_block_rsv.size > 0);
-       WARN_ON(fs_info->trans_block_rsv.reserved > 0);
-       WARN_ON(fs_info->chunk_block_rsv.size > 0);
-       WARN_ON(fs_info->chunk_block_rsv.reserved > 0);
-       WARN_ON(fs_info->delayed_block_rsv.size > 0);
-       WARN_ON(fs_info->delayed_block_rsv.reserved > 0);
-       WARN_ON(fs_info->delayed_refs_rsv.reserved > 0);
-       WARN_ON(fs_info->delayed_refs_rsv.size > 0);
-}
-
-/*
- * btrfs_update_delayed_refs_rsv - adjust the size of the delayed refs rsv
- * @trans - the trans that may have generated delayed refs
- *
- * This is to be called anytime we may have adjusted trans->delayed_ref_updates,
- * it'll calculate the additional size and add it to the delayed_refs_rsv.
- */
-void btrfs_update_delayed_refs_rsv(struct btrfs_trans_handle *trans)
-{
-       struct btrfs_fs_info *fs_info = trans->fs_info;
-       struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_refs_rsv;
-       u64 num_bytes;
-
-       if (!trans->delayed_ref_updates)
-               return;
-
-       num_bytes = btrfs_calc_trans_metadata_size(fs_info,
-                                                  trans->delayed_ref_updates);
-       spin_lock(&delayed_rsv->lock);
-       delayed_rsv->size += num_bytes;
-       delayed_rsv->full = 0;
-       spin_unlock(&delayed_rsv->lock);
-       trans->delayed_ref_updates = 0;
-}
-
-/*
- * To be called after all the new block groups attached to the transaction
- * handle have been created (btrfs_create_pending_block_groups()).
- */
-void btrfs_trans_release_chunk_metadata(struct btrfs_trans_handle *trans)
-{
-       struct btrfs_fs_info *fs_info = trans->fs_info;
-
-       if (!trans->chunk_bytes_reserved)
-               return;
-
-       WARN_ON_ONCE(!list_empty(&trans->new_bgs));
-
-       block_rsv_release_bytes(fs_info, &fs_info->chunk_block_rsv, NULL,
-                               trans->chunk_bytes_reserved, NULL);
-       trans->chunk_bytes_reserved = 0;
-}
-
-/*
- * btrfs_subvolume_reserve_metadata() - reserve space for subvolume operation
- * root: the root of the parent directory
- * rsv: block reservation
- * items: the number of items that we need do reservation
- * use_global_rsv: allow fallback to the global block reservation
- *
- * This function is used to reserve the space for snapshot/subvolume
- * creation and deletion. Those operations are different with the
- * common file/directory operations, they change two fs/file trees
- * and root tree, the number of items that the qgroup reserves is
- * different with the free space reservation. So we can not use
- * the space reservation mechanism in start_transaction().
- */
-int btrfs_subvolume_reserve_metadata(struct btrfs_root *root,
-                                    struct btrfs_block_rsv *rsv, int items,
-                                    bool use_global_rsv)
-{
-       u64 qgroup_num_bytes = 0;
-       u64 num_bytes;
-       int ret;
-       struct btrfs_fs_info *fs_info = root->fs_info;
-       struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
-
-       if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) {
-               /* One for parent inode, two for dir entries */
-               qgroup_num_bytes = 3 * fs_info->nodesize;
-               ret = btrfs_qgroup_reserve_meta_prealloc(root,
-                               qgroup_num_bytes, true);
-               if (ret)
-                       return ret;
-       }
-
-       num_bytes = btrfs_calc_trans_metadata_size(fs_info, items);
-       rsv->space_info = btrfs_find_space_info(fs_info,
-                                           BTRFS_BLOCK_GROUP_METADATA);
-       ret = btrfs_block_rsv_add(root, rsv, num_bytes,
-                                 BTRFS_RESERVE_FLUSH_ALL);
-
-       if (ret == -ENOSPC && use_global_rsv)
-               ret = btrfs_block_rsv_migrate(global_rsv, rsv, num_bytes, true);
-
-       if (ret && qgroup_num_bytes)
-               btrfs_qgroup_free_meta_prealloc(root, qgroup_num_bytes);
-
-       return ret;
-}
-
-void btrfs_subvolume_release_metadata(struct btrfs_fs_info *fs_info,
-                                     struct btrfs_block_rsv *rsv)
-{
-       btrfs_block_rsv_release(fs_info, rsv, (u64)-1);
-}
-
-static void btrfs_calculate_inode_block_rsv_size(struct btrfs_fs_info *fs_info,
-                                                struct btrfs_inode *inode)
-{
-       struct btrfs_block_rsv *block_rsv = &inode->block_rsv;
-       u64 reserve_size = 0;
-       u64 qgroup_rsv_size = 0;
-       u64 csum_leaves;
-       unsigned outstanding_extents;
-
-       lockdep_assert_held(&inode->lock);
-       outstanding_extents = inode->outstanding_extents;
-       if (outstanding_extents)
-               reserve_size = btrfs_calc_trans_metadata_size(fs_info,
-                                               outstanding_extents + 1);
-       csum_leaves = btrfs_csum_bytes_to_leaves(fs_info,
-                                                inode->csum_bytes);
-       reserve_size += btrfs_calc_trans_metadata_size(fs_info,
-                                                      csum_leaves);
-       /*
-        * For qgroup rsv, the calculation is very simple:
-        * account one nodesize for each outstanding extent
-        *
-        * This is overestimating in most cases.
-        */
-       qgroup_rsv_size = (u64)outstanding_extents * fs_info->nodesize;
-
-       spin_lock(&block_rsv->lock);
-       block_rsv->size = reserve_size;
-       block_rsv->qgroup_rsv_size = qgroup_rsv_size;
-       spin_unlock(&block_rsv->lock);
-}
-
-static void calc_inode_reservations(struct btrfs_fs_info *fs_info,
-                                   u64 num_bytes, u64 *meta_reserve,
-                                   u64 *qgroup_reserve)
-{
-       u64 nr_extents = count_max_extents(num_bytes);
-       u64 csum_leaves = btrfs_csum_bytes_to_leaves(fs_info, num_bytes);
-
-       /* We add one for the inode update at finish ordered time */
-       *meta_reserve = btrfs_calc_trans_metadata_size(fs_info,
-                                               nr_extents + csum_leaves + 1);
-       *qgroup_reserve = nr_extents * fs_info->nodesize;
-}
-
-int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes)
-{
-       struct btrfs_root *root = inode->root;
-       struct btrfs_fs_info *fs_info = root->fs_info;
-       struct btrfs_block_rsv *block_rsv = &inode->block_rsv;
-       u64 meta_reserve, qgroup_reserve;
-       unsigned nr_extents;
-       enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL;
-       int ret = 0;
-       bool delalloc_lock = true;
-
-       /* If we are a free space inode we need to not flush since we will be in
-        * the middle of a transaction commit.  We also don't need the delalloc
-        * mutex since we won't race with anybody.  We need this mostly to make
-        * lockdep shut its filthy mouth.
-        *
-        * If we have a transaction open (can happen if we call truncate_block
-        * from truncate), then we need FLUSH_LIMIT so we don't deadlock.
-        */
-       if (btrfs_is_free_space_inode(inode)) {
-               flush = BTRFS_RESERVE_NO_FLUSH;
-               delalloc_lock = false;
-       } else {
-               if (current->journal_info)
-                       flush = BTRFS_RESERVE_FLUSH_LIMIT;
-
-               if (btrfs_transaction_in_commit(fs_info))
-                       schedule_timeout(1);
-       }
-
-       if (delalloc_lock)
-               mutex_lock(&inode->delalloc_mutex);
-
-       num_bytes = ALIGN(num_bytes, fs_info->sectorsize);
-
-       /*
-        * We always want to do it this way, every other way is wrong and ends
-        * in tears.  Pre-reserving the amount we are going to add will always
-        * be the right way, because otherwise if we have enough parallelism we
-        * could end up with thousands of inodes all holding little bits of
-        * reservations they were able to make previously and the only way to
-        * reclaim that space is to ENOSPC out the operations and clear
-        * everything out and try again, which is bad.  This way we just
-        * over-reserve slightly, and clean up the mess when we are done.
-        */
-       calc_inode_reservations(fs_info, num_bytes, &meta_reserve,
-                               &qgroup_reserve);
-       ret = btrfs_qgroup_reserve_meta_prealloc(root, qgroup_reserve, true);
-       if (ret)
-               goto out_fail;
-       ret = btrfs_reserve_metadata_bytes(root, block_rsv, meta_reserve, flush);
-       if (ret)
-               goto out_qgroup;
-
-       /*
-        * Now we need to update our outstanding extents and csum bytes _first_
-        * and then add the reservation to the block_rsv.  This keeps us from
-        * racing with an ordered completion or some such that would think it
-        * needs to free the reservation we just made.
-        */
-       spin_lock(&inode->lock);
-       nr_extents = count_max_extents(num_bytes);
-       btrfs_mod_outstanding_extents(inode, nr_extents);
-       inode->csum_bytes += num_bytes;
-       btrfs_calculate_inode_block_rsv_size(fs_info, inode);
-       spin_unlock(&inode->lock);
-
-       /* Now we can safely add our space to our block rsv */
-       block_rsv_add_bytes(block_rsv, meta_reserve, false);
-       trace_btrfs_space_reservation(root->fs_info, "delalloc",
-                                     btrfs_ino(inode), meta_reserve, 1);
-
-       spin_lock(&block_rsv->lock);
-       block_rsv->qgroup_rsv_reserved += qgroup_reserve;
-       spin_unlock(&block_rsv->lock);
-
-       if (delalloc_lock)
-               mutex_unlock(&inode->delalloc_mutex);
-       return 0;
-out_qgroup:
-       btrfs_qgroup_free_meta_prealloc(root, qgroup_reserve);
-out_fail:
-       btrfs_inode_rsv_release(inode, true);
-       if (delalloc_lock)
-               mutex_unlock(&inode->delalloc_mutex);
-       return ret;
-}
-
-/**
- * btrfs_delalloc_release_metadata - release a metadata reservation for an inode
- * @inode: the inode to release the reservation for.
- * @num_bytes: the number of bytes we are releasing.
- * @qgroup_free: free qgroup reservation or convert it to per-trans reservation
- *
- * This will release the metadata reservation for an inode.  This can be called
- * once we complete IO for a given set of bytes to release their metadata
- * reservations, or on error for the same reason.
- */
-void btrfs_delalloc_release_metadata(struct btrfs_inode *inode, u64 num_bytes,
-                                    bool qgroup_free)
-{
-       struct btrfs_fs_info *fs_info = inode->root->fs_info;
-
-       num_bytes = ALIGN(num_bytes, fs_info->sectorsize);
-       spin_lock(&inode->lock);
-       inode->csum_bytes -= num_bytes;
-       btrfs_calculate_inode_block_rsv_size(fs_info, inode);
-       spin_unlock(&inode->lock);
-
-       if (btrfs_is_testing(fs_info))
-               return;
-
-       btrfs_inode_rsv_release(inode, qgroup_free);
-}
-
-/**
- * btrfs_delalloc_release_extents - release our outstanding_extents
- * @inode: the inode to balance the reservation for.
- * @num_bytes: the number of bytes we originally reserved with
- * @qgroup_free: do we need to free qgroup meta reservation or convert them.
- *
- * When we reserve space we increase outstanding_extents for the extents we may
- * add.  Once we've set the range as delalloc or created our ordered extents we
- * have outstanding_extents to track the real usage, so we use this to free our
- * temporarily tracked outstanding_extents.  This _must_ be used in conjunction
- * with btrfs_delalloc_reserve_metadata.
- */
-void btrfs_delalloc_release_extents(struct btrfs_inode *inode, u64 num_bytes,
-                                   bool qgroup_free)
-{
-       struct btrfs_fs_info *fs_info = inode->root->fs_info;
-       unsigned num_extents;
-
-       spin_lock(&inode->lock);
-       num_extents = count_max_extents(num_bytes);
-       btrfs_mod_outstanding_extents(inode, -num_extents);
-       btrfs_calculate_inode_block_rsv_size(fs_info, inode);
-       spin_unlock(&inode->lock);
-
-       if (btrfs_is_testing(fs_info))
-               return;
-
-       btrfs_inode_rsv_release(inode, qgroup_free);
-}
-
-/**
- * btrfs_delalloc_reserve_space - reserve data and metadata space for
- * delalloc
- * @inode: inode we're writing to
- * @start: start range we are writing to
- * @len: how long the range we are writing to
- * @reserved: mandatory parameter, record actually reserved qgroup ranges of
- *           current reservation.
- *
- * This will do the following things
- *
- * o reserve space in data space info for num bytes
- *   and reserve precious corresponding qgroup space
- *   (Done in check_data_free_space)
- *
- * o reserve space for metadata space, based on the number of outstanding
- *   extents and how much csums will be needed
- *   also reserve metadata space in a per root over-reserve method.
- * o add to the inodes->delalloc_bytes
- * o add it to the fs_info's delalloc inodes list.
- *   (Above 3 all done in delalloc_reserve_metadata)
- *
- * Return 0 for success
- * Return <0 for error(-ENOSPC or -EQUOT)
- */
-int btrfs_delalloc_reserve_space(struct inode *inode,
-                       struct extent_changeset **reserved, u64 start, u64 len)
-{
-       int ret;
-
-       ret = btrfs_check_data_free_space(inode, reserved, start, len);
-       if (ret < 0)
-               return ret;
-       ret = btrfs_delalloc_reserve_metadata(BTRFS_I(inode), len);
-       if (ret < 0)
-               btrfs_free_reserved_data_space(inode, *reserved, start, len);
-       return ret;
-}
-
-/**
- * btrfs_delalloc_release_space - release data and metadata space for delalloc
- * @inode: inode we're releasing space for
- * @start: start position of the space already reserved
- * @len: the len of the space already reserved
- * @release_bytes: the len of the space we consumed or didn't use
- *
- * This function will release the metadata space that was not used and will
- * decrement ->delalloc_bytes and remove it from the fs_info delalloc_inodes
- * list if there are no delalloc bytes left.
- * Also it will handle the qgroup reserved space.
- */
-void btrfs_delalloc_release_space(struct inode *inode,
-                                 struct extent_changeset *reserved,
-                                 u64 start, u64 len, bool qgroup_free)
-{
-       btrfs_delalloc_release_metadata(BTRFS_I(inode), len, qgroup_free);
-       btrfs_free_reserved_data_space(inode, reserved, start, len);
-}
-
 static int update_block_group(struct btrfs_trans_handle *trans,
                              u64 bytenr, u64 num_bytes, int alloc)
 {
@@ -5608,7 +4522,7 @@ void btrfs_prepare_extent_commit(struct btrfs_fs_info *fs_info)
 
        up_write(&fs_info->commit_root_sem);
 
-       update_global_block_rsv(fs_info);
+       btrfs_update_global_block_rsv(fs_info);
 }
 
 /*
@@ -7365,73 +6279,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;
-               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)
-{
-       block_rsv_add_bytes(block_rsv, blocksize, false);
-       block_rsv_release_bytes(fs_info, block_rsv, NULL, 0, NULL);
-}
-
 /*
  * finds a free extent and does all the dirty work required for allocation
  * returns the tree buffer or an ERR_PTR on error.
@@ -7464,7 +6311,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);
 
@@ -7522,7 +6369,7 @@ out_free_buf:
 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);
 }
 
@@ -9009,7 +7856,7 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info)
         */
        synchronize_rcu();
 
-       release_global_block_rsv(info);
+       btrfs_release_global_block_rsv(info);
 
        while (!list_empty(&info->space_info)) {
                int i;
@@ -9042,33 +7889,6 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info)
        return 0;
 }
 
-/* link_block_group will queue up kobjects to add when we're reclaim-safe */
-void btrfs_add_raid_kobjects(struct btrfs_fs_info *fs_info)
-{
-       struct btrfs_space_info *space_info;
-       struct raid_kobject *rkobj;
-       LIST_HEAD(list);
-       int ret = 0;
-
-       spin_lock(&fs_info->pending_raid_kobjs_lock);
-       list_splice_init(&fs_info->pending_raid_kobjs, &list);
-       spin_unlock(&fs_info->pending_raid_kobjs_lock);
-
-       list_for_each_entry(rkobj, &list, list) {
-               space_info = btrfs_find_space_info(fs_info, rkobj->flags);
-
-               ret = kobject_add(&rkobj->kobj, &space_info->kobj,
-                               "%s", btrfs_bg_type_to_raid_name(rkobj->flags));
-               if (ret) {
-                       kobject_put(&rkobj->kobj);
-                       break;
-               }
-       }
-       if (ret)
-               btrfs_warn(fs_info,
-                          "failed to add kobject for block cache, ignoring");
-}
-
 static void link_block_group(struct btrfs_block_group_cache *cache)
 {
        struct btrfs_space_info *space_info = cache->space_info;
@@ -9083,18 +7903,36 @@ static void link_block_group(struct btrfs_block_group_cache *cache)
        up_write(&space_info->groups_sem);
 
        if (first) {
-               struct raid_kobject *rkobj = kzalloc(sizeof(*rkobj), GFP_NOFS);
+               struct raid_kobject *rkobj;
+               unsigned int nofs_flag;
+               int ret;
+
+               /*
+                * Setup a NOFS context because kobject_add(), deep in its call
+                * chain, does GFP_KERNEL allocations, and we are often called
+                * in a context where if reclaim is triggered we can deadlock
+                * (we are either holding a transaction handle or some lock
+                * required for a transaction commit).
+                */
+               nofs_flag = memalloc_nofs_save();
+               rkobj = kzalloc(sizeof(*rkobj), GFP_KERNEL);
                if (!rkobj) {
+                       memalloc_nofs_restore(nofs_flag);
                        btrfs_warn(cache->fs_info,
                                "couldn't alloc memory for raid level kobject");
                        return;
                }
                rkobj->flags = cache->flags;
                kobject_init(&rkobj->kobj, &btrfs_raid_ktype);
-
-               spin_lock(&fs_info->pending_raid_kobjs_lock);
-               list_add_tail(&rkobj->list, &fs_info->pending_raid_kobjs);
-               spin_unlock(&fs_info->pending_raid_kobjs_lock);
+               ret = kobject_add(&rkobj->kobj, &space_info->kobj, "%s",
+                                 btrfs_bg_type_to_raid_name(rkobj->flags));
+               memalloc_nofs_restore(nofs_flag);
+               if (ret) {
+                       kobject_put(&rkobj->kobj);
+                       btrfs_warn(fs_info,
+                          "failed to add kobject for block cache, ignoring");
+                       return;
+               }
                space_info->block_group_kobjs[index] = &rkobj->kobj;
        }
 }
@@ -9360,8 +8198,7 @@ int btrfs_read_block_groups(struct btrfs_fs_info *info)
                        inc_block_group_ro(cache, 1);
        }
 
-       btrfs_add_raid_kobjects(info);
-       init_global_block_rsv(info);
+       btrfs_init_global_block_rsv(info);
        ret = check_chunk_block_group_mappings(info);
 error:
        btrfs_free_path(path);
@@ -9475,7 +8312,7 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, u64 bytes_used,
        trace_btrfs_add_block_group(fs_info, cache, 1);
        btrfs_update_space_info(fs_info, cache->flags, size, bytes_used,
                                cache->bytes_super, &cache->space_info);
-       update_global_block_rsv(fs_info);
+       btrfs_update_global_block_rsv(fs_info);
 
        link_block_group(cache);
 
@@ -10129,6 +8966,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)
        struct btrfs_device *device;
        struct list_head *devices;
        u64 group_trimmed;
+       u64 range_end = U64_MAX;
        u64 start;
        u64 end;
        u64 trimmed = 0;
@@ -10138,16 +8976,23 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)
        int dev_ret = 0;
        int ret = 0;
 
+       /*
+        * Check range overflow if range->len is set.
+        * The default range->len is U64_MAX.
+        */
+       if (range->len != U64_MAX &&
+           check_add_overflow(range->start, range->len, &range_end))
+               return -EINVAL;
+
        cache = btrfs_lookup_first_block_group(fs_info, range->start);
        for (; cache; cache = next_block_group(cache)) {
-               if (cache->key.objectid >= (range->start + range->len)) {
+               if (cache->key.objectid >= range_end) {
                        btrfs_put_block_group(cache);
                        break;
                }
 
                start = max(range->start, cache->key.objectid);
-               end = min(range->start + range->len,
-                               cache->key.objectid + cache->key.offset);
+               end = min(range_end, cache->key.objectid + cache->key.offset);
 
                if (end - start >= range->minlen) {
                        if (!block_group_cache_done(cache)) {