aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQu Wenruo <wqu@suse.com>2018-04-17 04:52:45 -0400
committerDavid Sterba <dsterba@suse.com>2018-04-18 10:46:55 -0400
commitf218ea6c4792e0fabba0195f2f866d0a3b58431e (patch)
tree599a4e1abb146b86f3cf744dc3d36e7f5fdcc5a4
parentff6bc37eb7f6e7b052e50c13a480e1080b3ec07a (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.c20
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 }