diff options
Diffstat (limited to 'fs/btrfs/delayed-ref.c')
-rw-r--r-- | fs/btrfs/delayed-ref.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index 31299646024d..6d16bea94e1c 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c | |||
@@ -106,6 +106,10 @@ static int comp_entry(struct btrfs_delayed_ref_node *ref2, | |||
106 | return -1; | 106 | return -1; |
107 | if (ref1->type > ref2->type) | 107 | if (ref1->type > ref2->type) |
108 | return 1; | 108 | return 1; |
109 | if (ref1->no_quota > ref2->no_quota) | ||
110 | return 1; | ||
111 | if (ref1->no_quota < ref2->no_quota) | ||
112 | return -1; | ||
109 | /* merging of sequenced refs is not allowed */ | 113 | /* merging of sequenced refs is not allowed */ |
110 | if (compare_seq) { | 114 | if (compare_seq) { |
111 | if (ref1->seq < ref2->seq) | 115 | if (ref1->seq < ref2->seq) |
@@ -635,7 +639,7 @@ add_delayed_tree_ref(struct btrfs_fs_info *fs_info, | |||
635 | struct btrfs_delayed_ref_head *head_ref, | 639 | struct btrfs_delayed_ref_head *head_ref, |
636 | struct btrfs_delayed_ref_node *ref, u64 bytenr, | 640 | struct btrfs_delayed_ref_node *ref, u64 bytenr, |
637 | u64 num_bytes, u64 parent, u64 ref_root, int level, | 641 | u64 num_bytes, u64 parent, u64 ref_root, int level, |
638 | int action, int for_cow) | 642 | int action, int no_quota) |
639 | { | 643 | { |
640 | struct btrfs_delayed_ref_node *existing; | 644 | struct btrfs_delayed_ref_node *existing; |
641 | struct btrfs_delayed_tree_ref *full_ref; | 645 | struct btrfs_delayed_tree_ref *full_ref; |
@@ -645,6 +649,8 @@ add_delayed_tree_ref(struct btrfs_fs_info *fs_info, | |||
645 | if (action == BTRFS_ADD_DELAYED_EXTENT) | 649 | if (action == BTRFS_ADD_DELAYED_EXTENT) |
646 | action = BTRFS_ADD_DELAYED_REF; | 650 | action = BTRFS_ADD_DELAYED_REF; |
647 | 651 | ||
652 | if (is_fstree(ref_root)) | ||
653 | seq = atomic64_read(&fs_info->tree_mod_seq); | ||
648 | delayed_refs = &trans->transaction->delayed_refs; | 654 | delayed_refs = &trans->transaction->delayed_refs; |
649 | 655 | ||
650 | /* first set the basic ref node struct up */ | 656 | /* first set the basic ref node struct up */ |
@@ -655,9 +661,7 @@ add_delayed_tree_ref(struct btrfs_fs_info *fs_info, | |||
655 | ref->action = action; | 661 | ref->action = action; |
656 | ref->is_head = 0; | 662 | ref->is_head = 0; |
657 | ref->in_tree = 1; | 663 | ref->in_tree = 1; |
658 | 664 | ref->no_quota = no_quota; | |
659 | if (need_ref_seq(for_cow, ref_root)) | ||
660 | seq = btrfs_get_tree_mod_seq(fs_info, &trans->delayed_ref_elem); | ||
661 | ref->seq = seq; | 665 | ref->seq = seq; |
662 | 666 | ||
663 | full_ref = btrfs_delayed_node_to_tree_ref(ref); | 667 | full_ref = btrfs_delayed_node_to_tree_ref(ref); |
@@ -697,7 +701,7 @@ add_delayed_data_ref(struct btrfs_fs_info *fs_info, | |||
697 | struct btrfs_delayed_ref_head *head_ref, | 701 | struct btrfs_delayed_ref_head *head_ref, |
698 | struct btrfs_delayed_ref_node *ref, u64 bytenr, | 702 | struct btrfs_delayed_ref_node *ref, u64 bytenr, |
699 | u64 num_bytes, u64 parent, u64 ref_root, u64 owner, | 703 | u64 num_bytes, u64 parent, u64 ref_root, u64 owner, |
700 | u64 offset, int action, int for_cow) | 704 | u64 offset, int action, int no_quota) |
701 | { | 705 | { |
702 | struct btrfs_delayed_ref_node *existing; | 706 | struct btrfs_delayed_ref_node *existing; |
703 | struct btrfs_delayed_data_ref *full_ref; | 707 | struct btrfs_delayed_data_ref *full_ref; |
@@ -709,6 +713,9 @@ add_delayed_data_ref(struct btrfs_fs_info *fs_info, | |||
709 | 713 | ||
710 | delayed_refs = &trans->transaction->delayed_refs; | 714 | delayed_refs = &trans->transaction->delayed_refs; |
711 | 715 | ||
716 | if (is_fstree(ref_root)) | ||
717 | seq = atomic64_read(&fs_info->tree_mod_seq); | ||
718 | |||
712 | /* first set the basic ref node struct up */ | 719 | /* first set the basic ref node struct up */ |
713 | atomic_set(&ref->refs, 1); | 720 | atomic_set(&ref->refs, 1); |
714 | ref->bytenr = bytenr; | 721 | ref->bytenr = bytenr; |
@@ -717,9 +724,7 @@ add_delayed_data_ref(struct btrfs_fs_info *fs_info, | |||
717 | ref->action = action; | 724 | ref->action = action; |
718 | ref->is_head = 0; | 725 | ref->is_head = 0; |
719 | ref->in_tree = 1; | 726 | ref->in_tree = 1; |
720 | 727 | ref->no_quota = no_quota; | |
721 | if (need_ref_seq(for_cow, ref_root)) | ||
722 | seq = btrfs_get_tree_mod_seq(fs_info, &trans->delayed_ref_elem); | ||
723 | ref->seq = seq; | 728 | ref->seq = seq; |
724 | 729 | ||
725 | full_ref = btrfs_delayed_node_to_data_ref(ref); | 730 | full_ref = btrfs_delayed_node_to_data_ref(ref); |
@@ -762,12 +767,15 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info, | |||
762 | u64 bytenr, u64 num_bytes, u64 parent, | 767 | u64 bytenr, u64 num_bytes, u64 parent, |
763 | u64 ref_root, int level, int action, | 768 | u64 ref_root, int level, int action, |
764 | struct btrfs_delayed_extent_op *extent_op, | 769 | struct btrfs_delayed_extent_op *extent_op, |
765 | int for_cow) | 770 | int no_quota) |
766 | { | 771 | { |
767 | struct btrfs_delayed_tree_ref *ref; | 772 | struct btrfs_delayed_tree_ref *ref; |
768 | struct btrfs_delayed_ref_head *head_ref; | 773 | struct btrfs_delayed_ref_head *head_ref; |
769 | struct btrfs_delayed_ref_root *delayed_refs; | 774 | struct btrfs_delayed_ref_root *delayed_refs; |
770 | 775 | ||
776 | if (!is_fstree(ref_root) || !fs_info->quota_enabled) | ||
777 | no_quota = 0; | ||
778 | |||
771 | BUG_ON(extent_op && extent_op->is_data); | 779 | BUG_ON(extent_op && extent_op->is_data); |
772 | ref = kmem_cache_alloc(btrfs_delayed_tree_ref_cachep, GFP_NOFS); | 780 | ref = kmem_cache_alloc(btrfs_delayed_tree_ref_cachep, GFP_NOFS); |
773 | if (!ref) | 781 | if (!ref) |
@@ -793,10 +801,8 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info, | |||
793 | 801 | ||
794 | add_delayed_tree_ref(fs_info, trans, head_ref, &ref->node, bytenr, | 802 | add_delayed_tree_ref(fs_info, trans, head_ref, &ref->node, bytenr, |
795 | num_bytes, parent, ref_root, level, action, | 803 | num_bytes, parent, ref_root, level, action, |
796 | for_cow); | 804 | no_quota); |
797 | spin_unlock(&delayed_refs->lock); | 805 | spin_unlock(&delayed_refs->lock); |
798 | if (need_ref_seq(for_cow, ref_root)) | ||
799 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); | ||
800 | 806 | ||
801 | return 0; | 807 | return 0; |
802 | } | 808 | } |
@@ -810,12 +816,15 @@ int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info, | |||
810 | u64 parent, u64 ref_root, | 816 | u64 parent, u64 ref_root, |
811 | u64 owner, u64 offset, int action, | 817 | u64 owner, u64 offset, int action, |
812 | struct btrfs_delayed_extent_op *extent_op, | 818 | struct btrfs_delayed_extent_op *extent_op, |
813 | int for_cow) | 819 | int no_quota) |
814 | { | 820 | { |
815 | struct btrfs_delayed_data_ref *ref; | 821 | struct btrfs_delayed_data_ref *ref; |
816 | struct btrfs_delayed_ref_head *head_ref; | 822 | struct btrfs_delayed_ref_head *head_ref; |
817 | struct btrfs_delayed_ref_root *delayed_refs; | 823 | struct btrfs_delayed_ref_root *delayed_refs; |
818 | 824 | ||
825 | if (!is_fstree(ref_root) || !fs_info->quota_enabled) | ||
826 | no_quota = 0; | ||
827 | |||
819 | BUG_ON(extent_op && !extent_op->is_data); | 828 | BUG_ON(extent_op && !extent_op->is_data); |
820 | ref = kmem_cache_alloc(btrfs_delayed_data_ref_cachep, GFP_NOFS); | 829 | ref = kmem_cache_alloc(btrfs_delayed_data_ref_cachep, GFP_NOFS); |
821 | if (!ref) | 830 | if (!ref) |
@@ -841,10 +850,8 @@ int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info, | |||
841 | 850 | ||
842 | add_delayed_data_ref(fs_info, trans, head_ref, &ref->node, bytenr, | 851 | add_delayed_data_ref(fs_info, trans, head_ref, &ref->node, bytenr, |
843 | num_bytes, parent, ref_root, owner, offset, | 852 | num_bytes, parent, ref_root, owner, offset, |
844 | action, for_cow); | 853 | action, no_quota); |
845 | spin_unlock(&delayed_refs->lock); | 854 | spin_unlock(&delayed_refs->lock); |
846 | if (need_ref_seq(for_cow, ref_root)) | ||
847 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); | ||
848 | 855 | ||
849 | return 0; | 856 | return 0; |
850 | } | 857 | } |