Merge tag 'sunxi-fixes-for-3.10' of git://github.com/mripard/linux into fixes
[firefly-linux-kernel-4.4.55.git] / fs / btrfs / extent-tree.c
index 54e63b273a64a5ef035ea26865a55daea076376a..df472ab1b5acca7b411b05bcc414913bcebcc244 100644 (file)
@@ -4564,6 +4564,8 @@ static void init_global_block_rsv(struct btrfs_fs_info *fs_info)
        fs_info->csum_root->block_rsv = &fs_info->global_block_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);
@@ -6653,12 +6655,13 @@ use_block_rsv(struct btrfs_trans_handle *trans,
        struct btrfs_block_rsv *block_rsv;
        struct btrfs_block_rsv *global_rsv = &root->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 = block_rsv_use_bytes(block_rsv, blocksize);
        if (!ret)
                return block_rsv;
@@ -6666,6 +6669,12 @@ use_block_rsv(struct btrfs_trans_handle *trans,
        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(root->fs_info);
+               goto again;
+       }
+
        if (btrfs_test_opt(root, ENOSPC_DEBUG)) {
                static DEFINE_RATELIMIT_STATE(_rs,
                                DEFAULT_RATELIMIT_INTERVAL * 10,