extent-tree.c (424a47805a819ff59ada9549c4a21fe0ba95c446) extent-tree.c (550fa228ee7ebea3c3499897a7aef6536de73fff)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2007 Oracle. All rights reserved.
4 */
5
6#include <linux/sched.h>
7#include <linux/sched/signal.h>
8#include <linux/pagemap.h>

--- 4354 unchanged lines hidden (view full) ---

4363 block_rsv = root->block_rsv;
4364
4365 if (!block_rsv)
4366 block_rsv = &fs_info->empty_block_rsv;
4367
4368 return block_rsv;
4369}
4370
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2007 Oracle. All rights reserved.
4 */
5
6#include <linux/sched.h>
7#include <linux/sched/signal.h>
8#include <linux/pagemap.h>

--- 4354 unchanged lines hidden (view full) ---

4363 block_rsv = root->block_rsv;
4364
4365 if (!block_rsv)
4366 block_rsv = &fs_info->empty_block_rsv;
4367
4368 return block_rsv;
4369}
4370
4371int btrfs_block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv, u64 num_bytes)
4372{
4373 int ret = -ENOSPC;
4374 spin_lock(&block_rsv->lock);
4375 if (block_rsv->reserved >= num_bytes) {
4376 block_rsv->reserved -= num_bytes;
4377 if (block_rsv->reserved < block_rsv->size)
4378 block_rsv->full = 0;
4379 ret = 0;
4380 }
4381 spin_unlock(&block_rsv->lock);
4382 return ret;
4383}
4384
4385void btrfs_block_rsv_add_bytes(struct btrfs_block_rsv *block_rsv,
4386 u64 num_bytes, bool update_size)
4387{
4388 spin_lock(&block_rsv->lock);
4389 block_rsv->reserved += num_bytes;
4390 if (update_size)
4391 block_rsv->size += num_bytes;
4392 else if (block_rsv->reserved >= block_rsv->size)
4393 block_rsv->full = 1;
4394 spin_unlock(&block_rsv->lock);
4395}
4396
4397int btrfs_cond_migrate_bytes(struct btrfs_fs_info *fs_info,
4398 struct btrfs_block_rsv *dest, u64 num_bytes,
4399 int min_factor)
4400{
4401 struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
4402 u64 min_bytes;
4403
4404 if (global_rsv->space_info != dest->space_info)
4405 return -ENOSPC;
4406
4407 spin_lock(&global_rsv->lock);
4408 min_bytes = div_factor(global_rsv->size, min_factor);
4409 if (global_rsv->reserved < min_bytes + num_bytes) {
4410 spin_unlock(&global_rsv->lock);
4411 return -ENOSPC;
4412 }
4413 global_rsv->reserved -= num_bytes;
4414 if (global_rsv->reserved < global_rsv->size)
4415 global_rsv->full = 0;
4416 spin_unlock(&global_rsv->lock);
4417
4418 btrfs_block_rsv_add_bytes(dest, num_bytes, true);
4419 return 0;
4420}
4421
4422/**
4423 * btrfs_migrate_to_delayed_refs_rsv - transfer bytes to our delayed refs rsv.
4424 * @fs_info - the fs info for our fs.
4425 * @src - the source block rsv to transfer from.
4426 * @num_bytes - the number of bytes to transfer.
4427 *
4428 * This transfers up to the num_bytes amount from the src rsv to the
4429 * delayed_refs_rsv. Any extra bytes are returned to the space info.

--- 68 unchanged lines hidden (view full) ---

4498 if (ret)
4499 return ret;
4500 btrfs_block_rsv_add_bytes(block_rsv, num_bytes, 0);
4501 trace_btrfs_space_reservation(fs_info, "delayed_refs_rsv",
4502 0, num_bytes, 1);
4503 return 0;
4504}
4505
4371/**
4372 * btrfs_migrate_to_delayed_refs_rsv - transfer bytes to our delayed refs rsv.
4373 * @fs_info - the fs info for our fs.
4374 * @src - the source block rsv to transfer from.
4375 * @num_bytes - the number of bytes to transfer.
4376 *
4377 * This transfers up to the num_bytes amount from the src rsv to the
4378 * delayed_refs_rsv. Any extra bytes are returned to the space info.

--- 68 unchanged lines hidden (view full) ---

4447 if (ret)
4448 return ret;
4449 btrfs_block_rsv_add_bytes(block_rsv, num_bytes, 0);
4450 trace_btrfs_space_reservation(fs_info, "delayed_refs_rsv",
4451 0, num_bytes, 1);
4452 return 0;
4453}
4454
4506static u64 block_rsv_release_bytes(struct btrfs_fs_info *fs_info,
4507 struct btrfs_block_rsv *block_rsv,
4508 struct btrfs_block_rsv *dest, u64 num_bytes,
4509 u64 *qgroup_to_release_ret)
4510{
4511 struct btrfs_space_info *space_info = block_rsv->space_info;
4512 u64 qgroup_to_release = 0;
4513 u64 ret;
4514
4515 spin_lock(&block_rsv->lock);
4516 if (num_bytes == (u64)-1) {
4517 num_bytes = block_rsv->size;
4518 qgroup_to_release = block_rsv->qgroup_rsv_size;
4519 }
4520 block_rsv->size -= num_bytes;
4521 if (block_rsv->reserved >= block_rsv->size) {
4522 num_bytes = block_rsv->reserved - block_rsv->size;
4523 block_rsv->reserved = block_rsv->size;
4524 block_rsv->full = 1;
4525 } else {
4526 num_bytes = 0;
4527 }
4528 if (block_rsv->qgroup_rsv_reserved >= block_rsv->qgroup_rsv_size) {
4529 qgroup_to_release = block_rsv->qgroup_rsv_reserved -
4530 block_rsv->qgroup_rsv_size;
4531 block_rsv->qgroup_rsv_reserved = block_rsv->qgroup_rsv_size;
4532 } else {
4533 qgroup_to_release = 0;
4534 }
4535 spin_unlock(&block_rsv->lock);
4536
4537 ret = num_bytes;
4538 if (num_bytes > 0) {
4539 if (dest) {
4540 spin_lock(&dest->lock);
4541 if (!dest->full) {
4542 u64 bytes_to_add;
4543
4544 bytes_to_add = dest->size - dest->reserved;
4545 bytes_to_add = min(num_bytes, bytes_to_add);
4546 dest->reserved += bytes_to_add;
4547 if (dest->reserved >= dest->size)
4548 dest->full = 1;
4549 num_bytes -= bytes_to_add;
4550 }
4551 spin_unlock(&dest->lock);
4552 }
4553 if (num_bytes)
4554 btrfs_space_info_add_old_bytes(fs_info, space_info,
4555 num_bytes);
4556 }
4557 if (qgroup_to_release_ret)
4558 *qgroup_to_release_ret = qgroup_to_release;
4559 return ret;
4560}
4561
4562int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src,
4563 struct btrfs_block_rsv *dst, u64 num_bytes,
4564 bool update_size)
4565{
4566 int ret;
4567
4568 ret = btrfs_block_rsv_use_bytes(src, num_bytes);
4569 if (ret)
4570 return ret;
4571
4572 btrfs_block_rsv_add_bytes(dst, num_bytes, update_size);
4573 return 0;
4574}
4575
4576void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type)
4577{
4578 memset(rsv, 0, sizeof(*rsv));
4579 spin_lock_init(&rsv->lock);
4580 rsv->type = type;
4581}
4582
4583void btrfs_init_metadata_block_rsv(struct btrfs_fs_info *fs_info,
4584 struct btrfs_block_rsv *rsv,
4585 unsigned short type)
4586{
4587 btrfs_init_block_rsv(rsv, type);
4588 rsv->space_info = btrfs_find_space_info(fs_info,
4589 BTRFS_BLOCK_GROUP_METADATA);
4590}
4591
4592struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info,
4593 unsigned short type)
4594{
4595 struct btrfs_block_rsv *block_rsv;
4596
4597 block_rsv = kmalloc(sizeof(*block_rsv), GFP_NOFS);
4598 if (!block_rsv)
4599 return NULL;
4600
4601 btrfs_init_metadata_block_rsv(fs_info, block_rsv, type);
4602 return block_rsv;
4603}
4604
4605void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info,
4606 struct btrfs_block_rsv *rsv)
4607{
4608 if (!rsv)
4609 return;
4610 btrfs_block_rsv_release(fs_info, rsv, (u64)-1);
4611 kfree(rsv);
4612}
4613
4614int btrfs_block_rsv_add(struct btrfs_root *root,
4615 struct btrfs_block_rsv *block_rsv, u64 num_bytes,
4616 enum btrfs_reserve_flush_enum flush)
4617{
4618 int ret;
4619
4620 if (num_bytes == 0)
4621 return 0;
4622
4623 ret = btrfs_reserve_metadata_bytes(root, block_rsv, num_bytes, flush);
4624 if (!ret)
4625 btrfs_block_rsv_add_bytes(block_rsv, num_bytes, true);
4626
4627 return ret;
4628}
4629
4630int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor)
4631{
4632 u64 num_bytes = 0;
4633 int ret = -ENOSPC;
4634
4635 if (!block_rsv)
4636 return 0;
4637
4638 spin_lock(&block_rsv->lock);
4639 num_bytes = div_factor(block_rsv->size, min_factor);
4640 if (block_rsv->reserved >= num_bytes)
4641 ret = 0;
4642 spin_unlock(&block_rsv->lock);
4643
4644 return ret;
4645}
4646
4647int btrfs_block_rsv_refill(struct btrfs_root *root,
4648 struct btrfs_block_rsv *block_rsv, u64 min_reserved,
4649 enum btrfs_reserve_flush_enum flush)
4650{
4651 u64 num_bytes = 0;
4652 int ret = -ENOSPC;
4653
4654 if (!block_rsv)
4655 return 0;
4656
4657 spin_lock(&block_rsv->lock);
4658 num_bytes = min_reserved;
4659 if (block_rsv->reserved >= num_bytes)
4660 ret = 0;
4661 else
4662 num_bytes -= block_rsv->reserved;
4663 spin_unlock(&block_rsv->lock);
4664
4665 if (!ret)
4666 return 0;
4667
4668 ret = btrfs_reserve_metadata_bytes(root, block_rsv, num_bytes, flush);
4669 if (!ret) {
4670 btrfs_block_rsv_add_bytes(block_rsv, num_bytes, false);
4671 return 0;
4672 }
4673
4674 return ret;
4675}
4676
4677u64 __btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
4678 struct btrfs_block_rsv *block_rsv,
4679 u64 num_bytes, u64 *qgroup_to_release)
4680{
4681 struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
4682 struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_refs_rsv;
4683 struct btrfs_block_rsv *target = NULL;
4684
4685 /*
4686 * If we are the delayed_rsv then push to the global rsv, otherwise dump
4687 * into the delayed rsv if it is not full.
4688 */
4689 if (block_rsv == delayed_rsv)
4690 target = global_rsv;
4691 else if (block_rsv != global_rsv && !delayed_rsv->full)
4692 target = delayed_rsv;
4693
4694 if (target && block_rsv->space_info != target->space_info)
4695 target = NULL;
4696
4697 return block_rsv_release_bytes(fs_info, block_rsv, target, num_bytes,
4698 qgroup_to_release);
4699}
4700
4701/**
4702 * btrfs_inode_rsv_release - release any excessive reservation.
4703 * @inode - the inode we need to release from.
4704 * @qgroup_free - free or convert qgroup meta.
4705 * Unlike normal operation, qgroup meta reservation needs to know if we are
4706 * freeing qgroup reservation or just converting it into per-trans. Normally
4707 * @qgroup_free is true for error handling, and false for normal release.
4708 *

--- 5555 unchanged lines hidden ---
4455/**
4456 * btrfs_inode_rsv_release - release any excessive reservation.
4457 * @inode - the inode we need to release from.
4458 * @qgroup_free - free or convert qgroup meta.
4459 * Unlike normal operation, qgroup meta reservation needs to know if we are
4460 * freeing qgroup reservation or just converting it into per-trans. Normally
4461 * @qgroup_free is true for error handling, and false for normal release.
4462 *

--- 5555 unchanged lines hidden ---