All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Btrfs: fix passing wrong arg gfp_t to decide the correct allocation mode
@ 2013-05-07  6:20 Wang Shilong
  2013-05-07  7:16 ` Jan Schmidt
  0 siblings, 1 reply; 3+ messages in thread
From: Wang Shilong @ 2013-05-07  6:20 UTC (permalink / raw)
  To: Linux Btrfs; +Cc: Jan Schmidt

If you look the code carefully, you will see all the tree_mod_alloc()
has to use GFP_ATOMIC. However, the original code pass the wrong arg
gfp_t in some places, this dosen't cause any problems, because in the
tree_mod_alloc(), it ignores arg gfp_t and just use GFP_ATOMIC directly,
this is not good.

However, i think we should try best not to allocate with GFP_ATOMIC, so
i keep the gfp_t there in the hope we can change allocation mode in the
future.

Signed-off-by: Wang Shilong <wangsl-fnst@cn.fujitsu.com>
---
 fs/btrfs/ctree.c |   37 ++++++++++++++++++-------------------
 1 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index de6de8e..33c9061 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -553,7 +553,7 @@ static inline int tree_mod_alloc(struct btrfs_fs_info *fs_info, gfp_t flags,
 	 * once we switch from spin locks to something different, we should
 	 * honor the flags parameter here.
 	 */
-	tm = *tm_ret = kzalloc(sizeof(*tm), GFP_ATOMIC);
+	tm = *tm_ret = kzalloc(sizeof(*tm), flags);
 	if (!tm)
 		return -ENOMEM;
 
@@ -591,14 +591,14 @@ __tree_mod_log_insert_key(struct btrfs_fs_info *fs_info,
 static noinline int
 tree_mod_log_insert_key_mask(struct btrfs_fs_info *fs_info,
 			     struct extent_buffer *eb, int slot,
-			     enum mod_log_op op, gfp_t flags)
+			     enum mod_log_op op)
 {
 	int ret;
 
 	if (tree_mod_dont_log(fs_info, eb))
 		return 0;
 
-	ret = __tree_mod_log_insert_key(fs_info, eb, slot, op, flags);
+	ret = __tree_mod_log_insert_key(fs_info, eb, slot, op, GFP_ATOMIC);
 
 	tree_mod_log_write_unlock(fs_info);
 	return ret;
@@ -608,7 +608,7 @@ static noinline int
 tree_mod_log_insert_key(struct btrfs_fs_info *fs_info, struct extent_buffer *eb,
 			int slot, enum mod_log_op op)
 {
-	return tree_mod_log_insert_key_mask(fs_info, eb, slot, op, GFP_NOFS);
+	return tree_mod_log_insert_key_mask(fs_info, eb, slot, op);
 }
 
 static noinline int
@@ -616,13 +616,13 @@ tree_mod_log_insert_key_locked(struct btrfs_fs_info *fs_info,
 			     struct extent_buffer *eb, int slot,
 			     enum mod_log_op op)
 {
-	return __tree_mod_log_insert_key(fs_info, eb, slot, op, GFP_NOFS);
+	return __tree_mod_log_insert_key(fs_info, eb, slot, op, GFP_ATOMIC);
 }
 
 static noinline int
 tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
 			 struct extent_buffer *eb, int dst_slot, int src_slot,
-			 int nr_items, gfp_t flags)
+			 int nr_items)
 {
 	struct tree_mod_elem *tm;
 	int ret;
@@ -642,7 +642,7 @@ tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
 		BUG_ON(ret < 0);
 	}
 
-	ret = tree_mod_alloc(fs_info, flags, &tm);
+	ret = tree_mod_alloc(fs_info, GFP_ATOMIC, &tm);
 	if (ret < 0)
 		goto out;
 
@@ -679,7 +679,7 @@ __tree_mod_log_free_eb(struct btrfs_fs_info *fs_info, struct extent_buffer *eb)
 static noinline int
 tree_mod_log_insert_root(struct btrfs_fs_info *fs_info,
 			 struct extent_buffer *old_root,
-			 struct extent_buffer *new_root, gfp_t flags,
+			 struct extent_buffer *new_root,
 			 int log_removal)
 {
 	struct tree_mod_elem *tm;
@@ -691,7 +691,7 @@ tree_mod_log_insert_root(struct btrfs_fs_info *fs_info,
 	if (log_removal)
 		__tree_mod_log_free_eb(fs_info, old_root);
 
-	ret = tree_mod_alloc(fs_info, flags, &tm);
+	ret = tree_mod_alloc(fs_info, GFP_ATOMIC, &tm);
 	if (ret < 0)
 		goto out;
 
@@ -809,19 +809,18 @@ tree_mod_log_eb_move(struct btrfs_fs_info *fs_info, struct extent_buffer *dst,
 {
 	int ret;
 	ret = tree_mod_log_insert_move(fs_info, dst, dst_offset, src_offset,
-				       nr_items, GFP_NOFS);
+				       nr_items);
 	BUG_ON(ret < 0);
 }
 
 static noinline void
 tree_mod_log_set_node_key(struct btrfs_fs_info *fs_info,
-			  struct extent_buffer *eb, int slot, int atomic)
+			  struct extent_buffer *eb, int slot)
 {
 	int ret;
 
 	ret = tree_mod_log_insert_key_mask(fs_info, eb, slot,
-					   MOD_LOG_KEY_REPLACE,
-					   atomic ? GFP_ATOMIC : GFP_NOFS);
+					   MOD_LOG_KEY_REPLACE);
 	BUG_ON(ret < 0);
 }
 
@@ -843,7 +842,7 @@ tree_mod_log_set_root_pointer(struct btrfs_root *root,
 {
 	int ret;
 	ret = tree_mod_log_insert_root(root->fs_info, root->node,
-				       new_root_node, GFP_NOFS, log_removal);
+				       new_root_node, log_removal);
 	BUG_ON(ret < 0);
 }
 
@@ -1886,7 +1885,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
 			struct btrfs_disk_key right_key;
 			btrfs_node_key(right, &right_key, 0);
 			tree_mod_log_set_node_key(root->fs_info, parent,
-						  pslot + 1, 0);
+						  pslot + 1);
 			btrfs_set_node_key(parent, &right_key, pslot + 1);
 			btrfs_mark_buffer_dirty(parent);
 		}
@@ -1931,7 +1930,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
 		struct btrfs_disk_key mid_key;
 		btrfs_node_key(mid, &mid_key, 0);
 		tree_mod_log_set_node_key(root->fs_info, parent,
-					  pslot, 0);
+					  pslot);
 		btrfs_set_node_key(parent, &mid_key, pslot);
 		btrfs_mark_buffer_dirty(parent);
 	}
@@ -2030,7 +2029,7 @@ static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans,
 			orig_slot += left_nr;
 			btrfs_node_key(mid, &disk_key, 0);
 			tree_mod_log_set_node_key(root->fs_info, parent,
-						  pslot, 0);
+						  pslot);
 			btrfs_set_node_key(parent, &disk_key, pslot);
 			btrfs_mark_buffer_dirty(parent);
 			if (btrfs_header_nritems(left) > orig_slot) {
@@ -2083,7 +2082,7 @@ static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans,
 
 			btrfs_node_key(right, &disk_key, 0);
 			tree_mod_log_set_node_key(root->fs_info, parent,
-						  pslot + 1, 0);
+						  pslot + 1);
 			btrfs_set_node_key(parent, &disk_key, pslot + 1);
 			btrfs_mark_buffer_dirty(parent);
 
@@ -2963,7 +2962,7 @@ static void fixup_low_keys(struct btrfs_root *root, struct btrfs_path *path,
 		if (!path->nodes[i])
 			break;
 		t = path->nodes[i];
-		tree_mod_log_set_node_key(root->fs_info, t, tslot, 1);
+		tree_mod_log_set_node_key(root->fs_info, t, tslot);
 		btrfs_set_node_key(t, key, tslot);
 		btrfs_mark_buffer_dirty(path->nodes[i]);
 		if (tslot != 0)
-- 
1.7.7.6






^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] Btrfs: fix passing wrong arg gfp_t to decide the correct allocation mode
  2013-05-07  6:20 [PATCH] Btrfs: fix passing wrong arg gfp_t to decide the correct allocation mode Wang Shilong
@ 2013-05-07  7:16 ` Jan Schmidt
  2013-05-07  8:07   ` Wang Shilong
  0 siblings, 1 reply; 3+ messages in thread
From: Jan Schmidt @ 2013-05-07  7:16 UTC (permalink / raw)
  To: Wang Shilong; +Cc: Linux Btrfs

On Tue, May 07, 2013 at 08:20 (+0200), Wang Shilong wrote:
> If you look the code carefully, you will see all the tree_mod_alloc()
> has to use GFP_ATOMIC. However, the original code pass the wrong arg
> gfp_t in some places, this dosen't cause any problems, because in the
> tree_mod_alloc(), it ignores arg gfp_t and just use GFP_ATOMIC directly,
> this is not good.
> 
> However, i think we should try best not to allocate with GFP_ATOMIC, so
> i keep the gfp_t there in the hope we can change allocation mode in the
> future.

NAK.

The code as it is now is prepared to get rid of at least some GFP_ATOMIC
allocations. You won't get rid of all of them, as there are a lot of spin lock
situations where we need to add to the tree mod lock anyway.

As a preparation we currently pass the "best" flags (least restrictive) we can
instead of always passing GFP_ATOMIC. I pointed you to this comment already:

 557         /*
 558          * once we switch from spin locks to something different, we should
 559          * honor the flags parameter here.
 560          */
 561         tm = *tm_ret = kzalloc(sizeof(*tm), GFP_ATOMIC);

So, if you want less atomic allocations, find something more suitable than an
rwlock for fs_info->tree_mod_log_lock an you can in fact replace "GFP_ATOMIC"
with "flags" in the kzalloc().

The good thing is, because everything is already prepared you don't have to
think about all the callers again an pass the correct flags.

-Jan


> Signed-off-by: Wang Shilong <wangsl-fnst@cn.fujitsu.com>
> ---
>  fs/btrfs/ctree.c |   37 ++++++++++++++++++-------------------
>  1 files changed, 18 insertions(+), 19 deletions(-)
> 
> diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
> index de6de8e..33c9061 100644
> --- a/fs/btrfs/ctree.c
> +++ b/fs/btrfs/ctree.c
> @@ -553,7 +553,7 @@ static inline int tree_mod_alloc(struct btrfs_fs_info *fs_info, gfp_t flags,
>  	 * once we switch from spin locks to something different, we should
>  	 * honor the flags parameter here.
>  	 */
> -	tm = *tm_ret = kzalloc(sizeof(*tm), GFP_ATOMIC);
> +	tm = *tm_ret = kzalloc(sizeof(*tm), flags);
>  	if (!tm)
>  		return -ENOMEM;
>  
> @@ -591,14 +591,14 @@ __tree_mod_log_insert_key(struct btrfs_fs_info *fs_info,
>  static noinline int
>  tree_mod_log_insert_key_mask(struct btrfs_fs_info *fs_info,
>  			     struct extent_buffer *eb, int slot,
> -			     enum mod_log_op op, gfp_t flags)
> +			     enum mod_log_op op)
>  {
>  	int ret;
>  
>  	if (tree_mod_dont_log(fs_info, eb))
>  		return 0;
>  
> -	ret = __tree_mod_log_insert_key(fs_info, eb, slot, op, flags);
> +	ret = __tree_mod_log_insert_key(fs_info, eb, slot, op, GFP_ATOMIC);
>  
>  	tree_mod_log_write_unlock(fs_info);
>  	return ret;
> @@ -608,7 +608,7 @@ static noinline int
>  tree_mod_log_insert_key(struct btrfs_fs_info *fs_info, struct extent_buffer *eb,
>  			int slot, enum mod_log_op op)
>  {
> -	return tree_mod_log_insert_key_mask(fs_info, eb, slot, op, GFP_NOFS);
> +	return tree_mod_log_insert_key_mask(fs_info, eb, slot, op);
>  }
>  
>  static noinline int
> @@ -616,13 +616,13 @@ tree_mod_log_insert_key_locked(struct btrfs_fs_info *fs_info,
>  			     struct extent_buffer *eb, int slot,
>  			     enum mod_log_op op)
>  {
> -	return __tree_mod_log_insert_key(fs_info, eb, slot, op, GFP_NOFS);
> +	return __tree_mod_log_insert_key(fs_info, eb, slot, op, GFP_ATOMIC);
>  }
>  
>  static noinline int
>  tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
>  			 struct extent_buffer *eb, int dst_slot, int src_slot,
> -			 int nr_items, gfp_t flags)
> +			 int nr_items)
>  {
>  	struct tree_mod_elem *tm;
>  	int ret;
> @@ -642,7 +642,7 @@ tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
>  		BUG_ON(ret < 0);
>  	}
>  
> -	ret = tree_mod_alloc(fs_info, flags, &tm);
> +	ret = tree_mod_alloc(fs_info, GFP_ATOMIC, &tm);
>  	if (ret < 0)
>  		goto out;
>  
> @@ -679,7 +679,7 @@ __tree_mod_log_free_eb(struct btrfs_fs_info *fs_info, struct extent_buffer *eb)
>  static noinline int
>  tree_mod_log_insert_root(struct btrfs_fs_info *fs_info,
>  			 struct extent_buffer *old_root,
> -			 struct extent_buffer *new_root, gfp_t flags,
> +			 struct extent_buffer *new_root,
>  			 int log_removal)
>  {
>  	struct tree_mod_elem *tm;
> @@ -691,7 +691,7 @@ tree_mod_log_insert_root(struct btrfs_fs_info *fs_info,
>  	if (log_removal)
>  		__tree_mod_log_free_eb(fs_info, old_root);
>  
> -	ret = tree_mod_alloc(fs_info, flags, &tm);
> +	ret = tree_mod_alloc(fs_info, GFP_ATOMIC, &tm);
>  	if (ret < 0)
>  		goto out;
>  
> @@ -809,19 +809,18 @@ tree_mod_log_eb_move(struct btrfs_fs_info *fs_info, struct extent_buffer *dst,
>  {
>  	int ret;
>  	ret = tree_mod_log_insert_move(fs_info, dst, dst_offset, src_offset,
> -				       nr_items, GFP_NOFS);
> +				       nr_items);
>  	BUG_ON(ret < 0);
>  }
>  
>  static noinline void
>  tree_mod_log_set_node_key(struct btrfs_fs_info *fs_info,
> -			  struct extent_buffer *eb, int slot, int atomic)
> +			  struct extent_buffer *eb, int slot)
>  {
>  	int ret;
>  
>  	ret = tree_mod_log_insert_key_mask(fs_info, eb, slot,
> -					   MOD_LOG_KEY_REPLACE,
> -					   atomic ? GFP_ATOMIC : GFP_NOFS);
> +					   MOD_LOG_KEY_REPLACE);
>  	BUG_ON(ret < 0);
>  }
>  
> @@ -843,7 +842,7 @@ tree_mod_log_set_root_pointer(struct btrfs_root *root,
>  {
>  	int ret;
>  	ret = tree_mod_log_insert_root(root->fs_info, root->node,
> -				       new_root_node, GFP_NOFS, log_removal);
> +				       new_root_node, log_removal);
>  	BUG_ON(ret < 0);
>  }
>  
> @@ -1886,7 +1885,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
>  			struct btrfs_disk_key right_key;
>  			btrfs_node_key(right, &right_key, 0);
>  			tree_mod_log_set_node_key(root->fs_info, parent,
> -						  pslot + 1, 0);
> +						  pslot + 1);
>  			btrfs_set_node_key(parent, &right_key, pslot + 1);
>  			btrfs_mark_buffer_dirty(parent);
>  		}
> @@ -1931,7 +1930,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
>  		struct btrfs_disk_key mid_key;
>  		btrfs_node_key(mid, &mid_key, 0);
>  		tree_mod_log_set_node_key(root->fs_info, parent,
> -					  pslot, 0);
> +					  pslot);
>  		btrfs_set_node_key(parent, &mid_key, pslot);
>  		btrfs_mark_buffer_dirty(parent);
>  	}
> @@ -2030,7 +2029,7 @@ static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans,
>  			orig_slot += left_nr;
>  			btrfs_node_key(mid, &disk_key, 0);
>  			tree_mod_log_set_node_key(root->fs_info, parent,
> -						  pslot, 0);
> +						  pslot);
>  			btrfs_set_node_key(parent, &disk_key, pslot);
>  			btrfs_mark_buffer_dirty(parent);
>  			if (btrfs_header_nritems(left) > orig_slot) {
> @@ -2083,7 +2082,7 @@ static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans,
>  
>  			btrfs_node_key(right, &disk_key, 0);
>  			tree_mod_log_set_node_key(root->fs_info, parent,
> -						  pslot + 1, 0);
> +						  pslot + 1);
>  			btrfs_set_node_key(parent, &disk_key, pslot + 1);
>  			btrfs_mark_buffer_dirty(parent);
>  
> @@ -2963,7 +2962,7 @@ static void fixup_low_keys(struct btrfs_root *root, struct btrfs_path *path,
>  		if (!path->nodes[i])
>  			break;
>  		t = path->nodes[i];
> -		tree_mod_log_set_node_key(root->fs_info, t, tslot, 1);
> +		tree_mod_log_set_node_key(root->fs_info, t, tslot);
>  		btrfs_set_node_key(t, key, tslot);
>  		btrfs_mark_buffer_dirty(path->nodes[i]);
>  		if (tslot != 0)
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Btrfs: fix passing wrong arg gfp_t to decide the correct allocation mode
  2013-05-07  7:16 ` Jan Schmidt
@ 2013-05-07  8:07   ` Wang Shilong
  0 siblings, 0 replies; 3+ messages in thread
From: Wang Shilong @ 2013-05-07  8:07 UTC (permalink / raw)
  To: Jan Schmidt; +Cc: Linux Btrfs

Hello Jan,

> On Tue, May 07, 2013 at 08:20 (+0200), Wang Shilong wrote:
>> If you look the code carefully, you will see all the tree_mod_alloc()
>> has to use GFP_ATOMIC. However, the original code pass the wrong arg
>> gfp_t in some places, this dosen't cause any problems, because in the
>> tree_mod_alloc(), it ignores arg gfp_t and just use GFP_ATOMIC directly,
>> this is not good.
>>
>> However, i think we should try best not to allocate with GFP_ATOMIC, so
>> i keep the gfp_t there in the hope we can change allocation mode in the
>> future.
> 
> NAK.
> 
> The code as it is now is prepared to get rid of at least some GFP_ATOMIC
> allocations. You won't get rid of all of them, as there are a lot of spin lock
> situations where we need to add to the tree mod lock anyway.
> 
> As a preparation we currently pass the "best" flags (least restrictive) we can
> instead of always passing GFP_ATOMIC. I pointed you to this comment already:
> 
>  557         /*
>  558          * once we switch from spin locks to something different, we should
>  559          * honor the flags parameter here.
>  560          */
>  561         tm = *tm_ret = kzalloc(sizeof(*tm), GFP_ATOMIC);
> 
> So, if you want less atomic allocations, find something more suitable than an
> rwlock for fs_info->tree_mod_log_lock an you can in fact replace "GFP_ATOMIC"
> with "flags" in the kzalloc().
> 
> The good thing is, because everything is already prepared you don't have to
> think about all the callers again an pass the correct flags.

 
Anyway, your original code looks messy about passing arg gfp_t..isn't it?
And you pass GFP_NOFS to a function, but in fact this function is surrounded 
by rw locks.

I make it clear to the caller what kind of gfp_t we should pass(although now we always
come to GFP_ATOMIC)...

> 
> -Jan
> 
> 
>> Signed-off-by: Wang Shilong <wangsl-fnst@cn.fujitsu.com>
>> ---
>>  fs/btrfs/ctree.c |   37 ++++++++++++++++++-------------------
>>  1 files changed, 18 insertions(+), 19 deletions(-)
>>
>> diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
>> index de6de8e..33c9061 100644
>> --- a/fs/btrfs/ctree.c
>> +++ b/fs/btrfs/ctree.c
>> @@ -553,7 +553,7 @@ static inline int tree_mod_alloc(struct btrfs_fs_info *fs_info, gfp_t flags,
>>  	 * once we switch from spin locks to something different, we should
>>  	 * honor the flags parameter here.
>>  	 */
>> -	tm = *tm_ret = kzalloc(sizeof(*tm), GFP_ATOMIC);
>> +	tm = *tm_ret = kzalloc(sizeof(*tm), flags);
>>  	if (!tm)
>>  		return -ENOMEM;
>>  
>> @@ -591,14 +591,14 @@ __tree_mod_log_insert_key(struct btrfs_fs_info *fs_info,
>>  static noinline int
>>  tree_mod_log_insert_key_mask(struct btrfs_fs_info *fs_info,
>>  			     struct extent_buffer *eb, int slot,
>> -			     enum mod_log_op op, gfp_t flags)
>> +			     enum mod_log_op op)
>>  {
>>  	int ret;
>>  
>>  	if (tree_mod_dont_log(fs_info, eb))
>>  		return 0;
>>  
>> -	ret = __tree_mod_log_insert_key(fs_info, eb, slot, op, flags);
>> +	ret = __tree_mod_log_insert_key(fs_info, eb, slot, op, GFP_ATOMIC);
>>  
>>  	tree_mod_log_write_unlock(fs_info);
>>  	return ret;
>> @@ -608,7 +608,7 @@ static noinline int
>>  tree_mod_log_insert_key(struct btrfs_fs_info *fs_info, struct extent_buffer *eb,
>>  			int slot, enum mod_log_op op)
>>  {
>> -	return tree_mod_log_insert_key_mask(fs_info, eb, slot, op, GFP_NOFS);
>> +	return tree_mod_log_insert_key_mask(fs_info, eb, slot, op);
>>  }
>>  
>>  static noinline int
>> @@ -616,13 +616,13 @@ tree_mod_log_insert_key_locked(struct btrfs_fs_info *fs_info,
>>  			     struct extent_buffer *eb, int slot,
>>  			     enum mod_log_op op)
>>  {
>> -	return __tree_mod_log_insert_key(fs_info, eb, slot, op, GFP_NOFS);
>> +	return __tree_mod_log_insert_key(fs_info, eb, slot, op, GFP_ATOMIC);
>>  }
>>  
>>  static noinline int
>>  tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
>>  			 struct extent_buffer *eb, int dst_slot, int src_slot,
>> -			 int nr_items, gfp_t flags)
>> +			 int nr_items)
>>  {
>>  	struct tree_mod_elem *tm;
>>  	int ret;
>> @@ -642,7 +642,7 @@ tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
>>  		BUG_ON(ret < 0);
>>  	}
>>  
>> -	ret = tree_mod_alloc(fs_info, flags, &tm);
>> +	ret = tree_mod_alloc(fs_info, GFP_ATOMIC, &tm);
>>  	if (ret < 0)
>>  		goto out;
>>  
>> @@ -679,7 +679,7 @@ __tree_mod_log_free_eb(struct btrfs_fs_info *fs_info, struct extent_buffer *eb)
>>  static noinline int
>>  tree_mod_log_insert_root(struct btrfs_fs_info *fs_info,
>>  			 struct extent_buffer *old_root,
>> -			 struct extent_buffer *new_root, gfp_t flags,
>> +			 struct extent_buffer *new_root,
>>  			 int log_removal)
>>  {
>>  	struct tree_mod_elem *tm;
>> @@ -691,7 +691,7 @@ tree_mod_log_insert_root(struct btrfs_fs_info *fs_info,
>>  	if (log_removal)
>>  		__tree_mod_log_free_eb(fs_info, old_root);
>>  
>> -	ret = tree_mod_alloc(fs_info, flags, &tm);
>> +	ret = tree_mod_alloc(fs_info, GFP_ATOMIC, &tm);
>>  	if (ret < 0)
>>  		goto out;
>>  
>> @@ -809,19 +809,18 @@ tree_mod_log_eb_move(struct btrfs_fs_info *fs_info, struct extent_buffer *dst,
>>  {
>>  	int ret;
>>  	ret = tree_mod_log_insert_move(fs_info, dst, dst_offset, src_offset,
>> -				       nr_items, GFP_NOFS);
>> +				       nr_items);
>>  	BUG_ON(ret < 0);
>>  }
>>  
>>  static noinline void
>>  tree_mod_log_set_node_key(struct btrfs_fs_info *fs_info,
>> -			  struct extent_buffer *eb, int slot, int atomic)
>> +			  struct extent_buffer *eb, int slot)
>>  {
>>  	int ret;
>>  
>>  	ret = tree_mod_log_insert_key_mask(fs_info, eb, slot,
>> -					   MOD_LOG_KEY_REPLACE,
>> -					   atomic ? GFP_ATOMIC : GFP_NOFS);
>> +					   MOD_LOG_KEY_REPLACE);
>>  	BUG_ON(ret < 0);
>>  }
>>  
>> @@ -843,7 +842,7 @@ tree_mod_log_set_root_pointer(struct btrfs_root *root,
>>  {
>>  	int ret;
>>  	ret = tree_mod_log_insert_root(root->fs_info, root->node,
>> -				       new_root_node, GFP_NOFS, log_removal);
>> +				       new_root_node, log_removal);
>>  	BUG_ON(ret < 0);
>>  }
>>  
>> @@ -1886,7 +1885,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
>>  			struct btrfs_disk_key right_key;
>>  			btrfs_node_key(right, &right_key, 0);
>>  			tree_mod_log_set_node_key(root->fs_info, parent,
>> -						  pslot + 1, 0);
>> +						  pslot + 1);
>>  			btrfs_set_node_key(parent, &right_key, pslot + 1);
>>  			btrfs_mark_buffer_dirty(parent);
>>  		}
>> @@ -1931,7 +1930,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
>>  		struct btrfs_disk_key mid_key;
>>  		btrfs_node_key(mid, &mid_key, 0);
>>  		tree_mod_log_set_node_key(root->fs_info, parent,
>> -					  pslot, 0);
>> +					  pslot);
>>  		btrfs_set_node_key(parent, &mid_key, pslot);
>>  		btrfs_mark_buffer_dirty(parent);
>>  	}
>> @@ -2030,7 +2029,7 @@ static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans,
>>  			orig_slot += left_nr;
>>  			btrfs_node_key(mid, &disk_key, 0);
>>  			tree_mod_log_set_node_key(root->fs_info, parent,
>> -						  pslot, 0);
>> +						  pslot);
>>  			btrfs_set_node_key(parent, &disk_key, pslot);
>>  			btrfs_mark_buffer_dirty(parent);
>>  			if (btrfs_header_nritems(left) > orig_slot) {
>> @@ -2083,7 +2082,7 @@ static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans,
>>  
>>  			btrfs_node_key(right, &disk_key, 0);
>>  			tree_mod_log_set_node_key(root->fs_info, parent,
>> -						  pslot + 1, 0);
>> +						  pslot + 1);
>>  			btrfs_set_node_key(parent, &disk_key, pslot + 1);
>>  			btrfs_mark_buffer_dirty(parent);
>>  
>> @@ -2963,7 +2962,7 @@ static void fixup_low_keys(struct btrfs_root *root, struct btrfs_path *path,
>>  		if (!path->nodes[i])
>>  			break;
>>  		t = path->nodes[i];
>> -		tree_mod_log_set_node_key(root->fs_info, t, tslot, 1);
>> +		tree_mod_log_set_node_key(root->fs_info, t, tslot);
>>  		btrfs_set_node_key(t, key, tslot);
>>  		btrfs_mark_buffer_dirty(path->nodes[i]);
>>  		if (tslot != 0)
>>
> 
> 




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-05-07  8:16 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-07  6:20 [PATCH] Btrfs: fix passing wrong arg gfp_t to decide the correct allocation mode Wang Shilong
2013-05-07  7:16 ` Jan Schmidt
2013-05-07  8:07   ` Wang Shilong

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.