All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2 v2] btrfs: fix error handling when run_delayed_extent_op fails
@ 2016-12-20 18:28 jeffm
  2016-12-20 18:28 ` [PATCH 2/2] btrfs: fix locking when we put back a delayed ref that's too new jeffm
  2016-12-22  5:46 ` [PATCH 1/2 v2] btrfs: fix error handling when run_delayed_extent_op fails Liu Bo
  0 siblings, 2 replies; 4+ messages in thread
From: jeffm @ 2016-12-20 18:28 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Jeff Mahoney

From: Jeff Mahoney <jeffm@suse.com>

In __btrfs_run_delayed_refs, the error path when run_delayed_extent_op
fails sets locked_ref->processing = 0 but doesn't re-increment
delayed_refs->num_heads_ready.  As a result, we end up triggering
the WARN_ON in btrfs_select_ref_head.

Fixes: d7df2c796d7 (Btrfs: attach delayed ref updates to delayed ref heads)
Reported-by: Jon Nelson <jnelson-suse@jamponi.net>
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
 fs/btrfs/extent-tree.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index db74889..d74adf1 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -2576,7 +2576,10 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
 					 */
 					if (must_insert_reserved)
 						locked_ref->must_insert_reserved = 1;
+					spin_lock(&delayed_refs->lock);
 					locked_ref->processing = 0;
+					delayed_refs->num_heads_ready++;
+					spin_unlock(&delayed_refs->lock);
 					btrfs_debug(fs_info,
 						    "run_delayed_extent_op returned %d",
 						    ret);
-- 
1.8.5.6


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

* [PATCH 2/2] btrfs: fix locking when we put back a delayed ref that's too new
  2016-12-20 18:28 [PATCH 1/2 v2] btrfs: fix error handling when run_delayed_extent_op fails jeffm
@ 2016-12-20 18:28 ` jeffm
  2016-12-22  5:42   ` Liu Bo
  2016-12-22  5:46 ` [PATCH 1/2 v2] btrfs: fix error handling when run_delayed_extent_op fails Liu Bo
  1 sibling, 1 reply; 4+ messages in thread
From: jeffm @ 2016-12-20 18:28 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Jeff Mahoney

From: Jeff Mahoney <jeffm@suse.com>

In __btrfs_run_delayed_refs, when we put back a delayed ref that's too
new, we have already dropped the lock on locked_ref when we set
->processing = 0.

This patch keeps the lock to cover that assignment.

Fixes: d7df2c796d7 (Btrfs: attach delayed ref updates to delayed ref heads)
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
 fs/btrfs/extent-tree.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index d74adf1..930ac8e 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -2526,11 +2526,11 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
 		if (ref && ref->seq &&
 		    btrfs_check_delayed_seq(fs_info, delayed_refs, ref->seq)) {
 			spin_unlock(&locked_ref->lock);
-			btrfs_delayed_ref_unlock(locked_ref);
 			spin_lock(&delayed_refs->lock);
 			locked_ref->processing = 0;
 			delayed_refs->num_heads_ready++;
 			spin_unlock(&delayed_refs->lock);
+			btrfs_delayed_ref_unlock(locked_ref);
 			locked_ref = NULL;
 			cond_resched();
 			count++;
-- 
1.8.5.6


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

* Re: [PATCH 2/2] btrfs: fix locking when we put back a delayed ref that's too new
  2016-12-20 18:28 ` [PATCH 2/2] btrfs: fix locking when we put back a delayed ref that's too new jeffm
@ 2016-12-22  5:42   ` Liu Bo
  0 siblings, 0 replies; 4+ messages in thread
From: Liu Bo @ 2016-12-22  5:42 UTC (permalink / raw)
  To: jeffm; +Cc: linux-btrfs

On Tue, Dec 20, 2016 at 01:28:28PM -0500, jeffm@suse.com wrote:
> From: Jeff Mahoney <jeffm@suse.com>
> 
> In __btrfs_run_delayed_refs, when we put back a delayed ref that's too
> new, we have already dropped the lock on locked_ref when we set
> ->processing = 0.
> 
> This patch keeps the lock to cover that assignment.
> 
> Fixes: d7df2c796d7 (Btrfs: attach delayed ref updates to delayed ref heads)
> Signed-off-by: Jeff Mahoney <jeffm@suse.com>
> ---
>  fs/btrfs/extent-tree.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index d74adf1..930ac8e 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -2526,11 +2526,11 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
>  		if (ref && ref->seq &&
>  		    btrfs_check_delayed_seq(fs_info, delayed_refs, ref->seq)) {
>  			spin_unlock(&locked_ref->lock);
> -			btrfs_delayed_ref_unlock(locked_ref);
>  			spin_lock(&delayed_refs->lock);
>  			locked_ref->processing = 0;
>  			delayed_refs->num_heads_ready++;
>  			spin_unlock(&delayed_refs->lock);
> +			btrfs_delayed_ref_unlock(locked_ref);

I don't think that this would end up a deadlock as we use mutex_try_lock
for head->mutex everywhere, but I'd rather have it cleaned up.

Reviewed-by: Liu Bo <bo.li.liu@oracle.com>

Thanks,

-liubo
>  			locked_ref = NULL;
>  			cond_resched();
>  			count++;
> -- 
> 1.8.5.6
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 1/2 v2] btrfs: fix error handling when run_delayed_extent_op fails
  2016-12-20 18:28 [PATCH 1/2 v2] btrfs: fix error handling when run_delayed_extent_op fails jeffm
  2016-12-20 18:28 ` [PATCH 2/2] btrfs: fix locking when we put back a delayed ref that's too new jeffm
@ 2016-12-22  5:46 ` Liu Bo
  1 sibling, 0 replies; 4+ messages in thread
From: Liu Bo @ 2016-12-22  5:46 UTC (permalink / raw)
  To: jeffm; +Cc: linux-btrfs

On Tue, Dec 20, 2016 at 01:28:27PM -0500, jeffm@suse.com wrote:
> From: Jeff Mahoney <jeffm@suse.com>
> 
> In __btrfs_run_delayed_refs, the error path when run_delayed_extent_op
> fails sets locked_ref->processing = 0 but doesn't re-increment
> delayed_refs->num_heads_ready.  As a result, we end up triggering
> the WARN_ON in btrfs_select_ref_head.
> 
> Fixes: d7df2c796d7 (Btrfs: attach delayed ref updates to delayed ref heads)
> Reported-by: Jon Nelson <jnelson-suse@jamponi.net>
> Signed-off-by: Jeff Mahoney <jeffm@suse.com>
> ---
>  fs/btrfs/extent-tree.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index db74889..d74adf1 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -2576,7 +2576,10 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
>  					 */
>  					if (must_insert_reserved)
>  						locked_ref->must_insert_reserved = 1;
> +					spin_lock(&delayed_refs->lock);
>  					locked_ref->processing = 0;
> +					delayed_refs->num_heads_ready++;
> +					spin_unlock(&delayed_refs->lock);

Looks good to me.

Reviewed-by: Liu Bo <bo.li.liu@oracle.com>

Thanks,

-liubo
>  					btrfs_debug(fs_info,
>  						    "run_delayed_extent_op returned %d",
>  						    ret);
> -- 
> 1.8.5.6
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

end of thread, other threads:[~2016-12-22  5:47 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-20 18:28 [PATCH 1/2 v2] btrfs: fix error handling when run_delayed_extent_op fails jeffm
2016-12-20 18:28 ` [PATCH 2/2] btrfs: fix locking when we put back a delayed ref that's too new jeffm
2016-12-22  5:42   ` Liu Bo
2016-12-22  5:46 ` [PATCH 1/2 v2] btrfs: fix error handling when run_delayed_extent_op fails Liu Bo

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.