aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/backref.c
diff options
context:
space:
mode:
authorWang Shilong <wangsl.fnst@cn.fujitsu.com>2013-08-05 22:29:54 -0400
committerChris Mason <chris.mason@fusionio.com>2013-09-01 08:16:26 -0400
commit742916b885edbc6453b4769458959929746e8e7e (patch)
tree8eec349149de72e9f3d10f7d585814aa41e92324 /fs/btrfs/backref.c
parentf71717502460c5cd6409b66835b17ae00af6d5f1 (diff)
Btrfs: pass gfp_t to __add_prelim_ref() to avoid always using GFP_ATOMIC
Currently, only add_delayed_refs have to allocate with GFP_ATOMIC, So just pass arg 'gfp_t' to decide which allocation mode. Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> Reviewed-by: Miao Xie <miaox@cn.fujitsu.com> Reviewed-by: Jan Schmidt <list.btrfs@jan-o-sch.net> Signed-off-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs/btrfs/backref.c')
-rw-r--r--fs/btrfs/backref.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
index 3da8f42e08a9..f3cb19114c95 100644
--- a/fs/btrfs/backref.c
+++ b/fs/btrfs/backref.c
@@ -160,12 +160,12 @@ struct __prelim_ref {
160 160
161static int __add_prelim_ref(struct list_head *head, u64 root_id, 161static int __add_prelim_ref(struct list_head *head, u64 root_id,
162 struct btrfs_key *key, int level, 162 struct btrfs_key *key, int level,
163 u64 parent, u64 wanted_disk_byte, int count) 163 u64 parent, u64 wanted_disk_byte, int count,
164 gfp_t gfp_mask)
164{ 165{
165 struct __prelim_ref *ref; 166 struct __prelim_ref *ref;
166 167
167 /* in case we're adding delayed refs, we're holding the refs spinlock */ 168 ref = kmalloc(sizeof(*ref), gfp_mask);
168 ref = kmalloc(sizeof(*ref), GFP_ATOMIC);
169 if (!ref) 169 if (!ref)
170 return -ENOMEM; 170 return -ENOMEM;
171 171
@@ -547,7 +547,7 @@ static int __add_delayed_refs(struct btrfs_delayed_ref_head *head, u64 seq,
547 ref = btrfs_delayed_node_to_tree_ref(node); 547 ref = btrfs_delayed_node_to_tree_ref(node);
548 ret = __add_prelim_ref(prefs, ref->root, &op_key, 548 ret = __add_prelim_ref(prefs, ref->root, &op_key,
549 ref->level + 1, 0, node->bytenr, 549 ref->level + 1, 0, node->bytenr,
550 node->ref_mod * sgn); 550 node->ref_mod * sgn, GFP_ATOMIC);
551 break; 551 break;
552 } 552 }
553 case BTRFS_SHARED_BLOCK_REF_KEY: { 553 case BTRFS_SHARED_BLOCK_REF_KEY: {
@@ -557,7 +557,7 @@ static int __add_delayed_refs(struct btrfs_delayed_ref_head *head, u64 seq,
557 ret = __add_prelim_ref(prefs, ref->root, NULL, 557 ret = __add_prelim_ref(prefs, ref->root, NULL,
558 ref->level + 1, ref->parent, 558 ref->level + 1, ref->parent,
559 node->bytenr, 559 node->bytenr,
560 node->ref_mod * sgn); 560 node->ref_mod * sgn, GFP_ATOMIC);
561 break; 561 break;
562 } 562 }
563 case BTRFS_EXTENT_DATA_REF_KEY: { 563 case BTRFS_EXTENT_DATA_REF_KEY: {
@@ -569,7 +569,7 @@ static int __add_delayed_refs(struct btrfs_delayed_ref_head *head, u64 seq,
569 key.offset = ref->offset; 569 key.offset = ref->offset;
570 ret = __add_prelim_ref(prefs, ref->root, &key, 0, 0, 570 ret = __add_prelim_ref(prefs, ref->root, &key, 0, 0,
571 node->bytenr, 571 node->bytenr,
572 node->ref_mod * sgn); 572 node->ref_mod * sgn, GFP_ATOMIC);
573 break; 573 break;
574 } 574 }
575 case BTRFS_SHARED_DATA_REF_KEY: { 575 case BTRFS_SHARED_DATA_REF_KEY: {
@@ -582,7 +582,7 @@ static int __add_delayed_refs(struct btrfs_delayed_ref_head *head, u64 seq,
582 key.offset = ref->offset; 582 key.offset = ref->offset;
583 ret = __add_prelim_ref(prefs, ref->root, &key, 0, 583 ret = __add_prelim_ref(prefs, ref->root, &key, 0,
584 ref->parent, node->bytenr, 584 ref->parent, node->bytenr,
585 node->ref_mod * sgn); 585 node->ref_mod * sgn, GFP_ATOMIC);
586 break; 586 break;
587 } 587 }
588 default: 588 default:
@@ -656,7 +656,7 @@ static int __add_inline_refs(struct btrfs_fs_info *fs_info,
656 case BTRFS_SHARED_BLOCK_REF_KEY: 656 case BTRFS_SHARED_BLOCK_REF_KEY:
657 ret = __add_prelim_ref(prefs, 0, NULL, 657 ret = __add_prelim_ref(prefs, 0, NULL,
658 *info_level + 1, offset, 658 *info_level + 1, offset,
659 bytenr, 1); 659 bytenr, 1, GFP_NOFS);
660 break; 660 break;
661 case BTRFS_SHARED_DATA_REF_KEY: { 661 case BTRFS_SHARED_DATA_REF_KEY: {
662 struct btrfs_shared_data_ref *sdref; 662 struct btrfs_shared_data_ref *sdref;
@@ -665,13 +665,13 @@ static int __add_inline_refs(struct btrfs_fs_info *fs_info,
665 sdref = (struct btrfs_shared_data_ref *)(iref + 1); 665 sdref = (struct btrfs_shared_data_ref *)(iref + 1);
666 count = btrfs_shared_data_ref_count(leaf, sdref); 666 count = btrfs_shared_data_ref_count(leaf, sdref);
667 ret = __add_prelim_ref(prefs, 0, NULL, 0, offset, 667 ret = __add_prelim_ref(prefs, 0, NULL, 0, offset,
668 bytenr, count); 668 bytenr, count, GFP_NOFS);
669 break; 669 break;
670 } 670 }
671 case BTRFS_TREE_BLOCK_REF_KEY: 671 case BTRFS_TREE_BLOCK_REF_KEY:
672 ret = __add_prelim_ref(prefs, offset, NULL, 672 ret = __add_prelim_ref(prefs, offset, NULL,
673 *info_level + 1, 0, 673 *info_level + 1, 0,
674 bytenr, 1); 674 bytenr, 1, GFP_NOFS);
675 break; 675 break;
676 case BTRFS_EXTENT_DATA_REF_KEY: { 676 case BTRFS_EXTENT_DATA_REF_KEY: {
677 struct btrfs_extent_data_ref *dref; 677 struct btrfs_extent_data_ref *dref;
@@ -686,7 +686,7 @@ static int __add_inline_refs(struct btrfs_fs_info *fs_info,
686 key.offset = btrfs_extent_data_ref_offset(leaf, dref); 686 key.offset = btrfs_extent_data_ref_offset(leaf, dref);
687 root = btrfs_extent_data_ref_root(leaf, dref); 687 root = btrfs_extent_data_ref_root(leaf, dref);
688 ret = __add_prelim_ref(prefs, root, &key, 0, 0, 688 ret = __add_prelim_ref(prefs, root, &key, 0, 0,
689 bytenr, count); 689 bytenr, count, GFP_NOFS);
690 break; 690 break;
691 } 691 }
692 default: 692 default:
@@ -737,7 +737,7 @@ static int __add_keyed_refs(struct btrfs_fs_info *fs_info,
737 case BTRFS_SHARED_BLOCK_REF_KEY: 737 case BTRFS_SHARED_BLOCK_REF_KEY:
738 ret = __add_prelim_ref(prefs, 0, NULL, 738 ret = __add_prelim_ref(prefs, 0, NULL,
739 info_level + 1, key.offset, 739 info_level + 1, key.offset,
740 bytenr, 1); 740 bytenr, 1, GFP_NOFS);
741 break; 741 break;
742 case BTRFS_SHARED_DATA_REF_KEY: { 742 case BTRFS_SHARED_DATA_REF_KEY: {
743 struct btrfs_shared_data_ref *sdref; 743 struct btrfs_shared_data_ref *sdref;
@@ -747,13 +747,13 @@ static int __add_keyed_refs(struct btrfs_fs_info *fs_info,
747 struct btrfs_shared_data_ref); 747 struct btrfs_shared_data_ref);
748 count = btrfs_shared_data_ref_count(leaf, sdref); 748 count = btrfs_shared_data_ref_count(leaf, sdref);
749 ret = __add_prelim_ref(prefs, 0, NULL, 0, key.offset, 749 ret = __add_prelim_ref(prefs, 0, NULL, 0, key.offset,
750 bytenr, count); 750 bytenr, count, GFP_NOFS);
751 break; 751 break;
752 } 752 }
753 case BTRFS_TREE_BLOCK_REF_KEY: 753 case BTRFS_TREE_BLOCK_REF_KEY:
754 ret = __add_prelim_ref(prefs, key.offset, NULL, 754 ret = __add_prelim_ref(prefs, key.offset, NULL,
755 info_level + 1, 0, 755 info_level + 1, 0,
756 bytenr, 1); 756 bytenr, 1, GFP_NOFS);
757 break; 757 break;
758 case BTRFS_EXTENT_DATA_REF_KEY: { 758 case BTRFS_EXTENT_DATA_REF_KEY: {
759 struct btrfs_extent_data_ref *dref; 759 struct btrfs_extent_data_ref *dref;
@@ -769,7 +769,7 @@ static int __add_keyed_refs(struct btrfs_fs_info *fs_info,
769 key.offset = btrfs_extent_data_ref_offset(leaf, dref); 769 key.offset = btrfs_extent_data_ref_offset(leaf, dref);
770 root = btrfs_extent_data_ref_root(leaf, dref); 770 root = btrfs_extent_data_ref_root(leaf, dref);
771 ret = __add_prelim_ref(prefs, root, &key, 0, 0, 771 ret = __add_prelim_ref(prefs, root, &key, 0, 0,
772 bytenr, count); 772 bytenr, count, GFP_NOFS);
773 break; 773 break;
774 } 774 }
775 default: 775 default: