diff options
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 06ec8ab6d9ba..a8d492dbd3e7 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
| @@ -556,6 +556,12 @@ static int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans, | |||
| 556 | dst_rsv = &fs_info->delayed_block_rsv; | 556 | dst_rsv = &fs_info->delayed_block_rsv; |
| 557 | 557 | ||
| 558 | num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); | 558 | num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); |
| 559 | |||
| 560 | /* | ||
| 561 | * Here we migrate space rsv from transaction rsv, since have already | ||
| 562 | * reserved space when starting a transaction. So no need to reserve | ||
| 563 | * qgroup space here. | ||
| 564 | */ | ||
| 559 | ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, 1); | 565 | ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, 1); |
| 560 | if (!ret) { | 566 | if (!ret) { |
| 561 | trace_btrfs_space_reservation(fs_info, "delayed_item", | 567 | trace_btrfs_space_reservation(fs_info, "delayed_item", |
| @@ -577,7 +583,10 @@ static void btrfs_delayed_item_release_metadata(struct btrfs_root *root, | |||
| 577 | return; | 583 | return; |
| 578 | 584 | ||
| 579 | rsv = &fs_info->delayed_block_rsv; | 585 | rsv = &fs_info->delayed_block_rsv; |
| 580 | btrfs_qgroup_convert_reserved_meta(root, item->bytes_reserved); | 586 | /* |
| 587 | * Check btrfs_delayed_item_reserve_metadata() to see why we don't need | ||
| 588 | * to release/reserve qgroup space. | ||
| 589 | */ | ||
| 581 | trace_btrfs_space_reservation(fs_info, "delayed_item", | 590 | trace_btrfs_space_reservation(fs_info, "delayed_item", |
| 582 | item->key.objectid, item->bytes_reserved, | 591 | item->key.objectid, item->bytes_reserved, |
| 583 | 0); | 592 | 0); |
| @@ -602,9 +611,6 @@ static int btrfs_delayed_inode_reserve_metadata( | |||
| 602 | 611 | ||
| 603 | num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); | 612 | num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); |
| 604 | 613 | ||
| 605 | ret = btrfs_qgroup_reserve_meta_prealloc(root, num_bytes, true); | ||
| 606 | if (ret < 0) | ||
| 607 | return ret; | ||
| 608 | /* | 614 | /* |
| 609 | * btrfs_dirty_inode will update the inode under btrfs_join_transaction | 615 | * btrfs_dirty_inode will update the inode under btrfs_join_transaction |
| 610 | * which doesn't reserve space for speed. This is a problem since we | 616 | * which doesn't reserve space for speed. This is a problem since we |
| @@ -616,6 +622,10 @@ static int btrfs_delayed_inode_reserve_metadata( | |||
| 616 | */ | 622 | */ |
| 617 | if (!src_rsv || (!trans->bytes_reserved && | 623 | if (!src_rsv || (!trans->bytes_reserved && |
| 618 | src_rsv->type != BTRFS_BLOCK_RSV_DELALLOC)) { | 624 | src_rsv->type != BTRFS_BLOCK_RSV_DELALLOC)) { |
| 625 | ret = btrfs_qgroup_reserve_meta_prealloc(root, | ||
| 626 | fs_info->nodesize, true); | ||
| 627 | if (ret < 0) | ||
| 628 | return ret; | ||
| 619 | ret = btrfs_block_rsv_add(root, dst_rsv, num_bytes, | 629 | ret = btrfs_block_rsv_add(root, dst_rsv, num_bytes, |
| 620 | BTRFS_RESERVE_NO_FLUSH); | 630 | BTRFS_RESERVE_NO_FLUSH); |
| 621 | /* | 631 | /* |
| @@ -634,6 +644,8 @@ static int btrfs_delayed_inode_reserve_metadata( | |||
| 634 | "delayed_inode", | 644 | "delayed_inode", |
| 635 | btrfs_ino(inode), | 645 | btrfs_ino(inode), |
| 636 | num_bytes, 1); | 646 | num_bytes, 1); |
| 647 | } else { | ||
| 648 | btrfs_qgroup_free_meta_prealloc(root, fs_info->nodesize); | ||
| 637 | } | 649 | } |
| 638 | return ret; | 650 | return ret; |
| 639 | } | 651 | } |
