diff options
author | Qu Wenruo <wqu@suse.com> | 2018-04-17 04:52:45 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-04-18 10:46:55 -0400 |
commit | f218ea6c4792e0fabba0195f2f866d0a3b58431e (patch) | |
tree | 599a4e1abb146b86f3cf744dc3d36e7f5fdcc5a4 | |
parent | ff6bc37eb7f6e7b052e50c13a480e1080b3ec07a (diff) |
btrfs: delayed-inode: Remove wrong qgroup meta reservation calls
Commit 4f5427ccce5d ("btrfs: delayed-inode: Use new qgroup meta rsv for
delayed inode and item") merged into mainline was not latest version
submitted to the mail list in Dec 2017.
Which lacks the following fixes:
1) Remove btrfs_qgroup_convert_reserved_meta() call in
btrfs_delayed_item_release_metadata()
2) Remove btrfs_qgroup_reserve_meta_prealloc() call in
btrfs_delayed_inode_reserve_metadata()
Those fixes will resolve unexpected EDQUOT problems.
Fixes: 4f5427ccce5d ("btrfs: delayed-inode: Use new qgroup meta rsv for delayed inode and item")
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
-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 | } |