linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch 1/2] Btrfs: double unlock bug in error handling
@ 2012-04-18  6:59 Dan Carpenter
  2012-04-18 10:14 ` David Sterba
  2012-04-18 11:29 ` Jan Schmidt
  0 siblings, 2 replies; 5+ messages in thread
From: Dan Carpenter @ 2012-04-18  6:59 UTC (permalink / raw)
  To: Chris Mason, Jeff Mahoney; +Cc: linux-btrfs, kernel-janitors

The caller expects this function to return with the lock held and
releases it immediately on error.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 2b35f8d..a0bb9dc 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -2301,6 +2301,7 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans,
 
 				if (ret) {
 					printk(KERN_DEBUG "btrfs: run_delayed_extent_op returned %d\n", ret);
+					spin_lock(&delayed_refs->lock);
 					return ret;
 				}
 
@@ -2331,6 +2332,7 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans,
 
 		if (ret) {
 			printk(KERN_DEBUG "btrfs: run_one_delayed_ref returned %d\n", ret);
+			spin_lock(&delayed_refs->lock);
 			return ret;
 		}
 

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

* Re: [patch 1/2] Btrfs: double unlock bug in error handling
  2012-04-18  6:59 [patch 1/2] Btrfs: double unlock bug in error handling Dan Carpenter
@ 2012-04-18 10:14 ` David Sterba
  2012-04-18 11:29 ` Jan Schmidt
  1 sibling, 0 replies; 5+ messages in thread
From: David Sterba @ 2012-04-18 10:14 UTC (permalink / raw)
  To: Dan Carpenter; +Cc: Chris Mason, Jeff Mahoney, linux-btrfs, kernel-janitors

On Wed, Apr 18, 2012 at 09:59:03AM +0300, Dan Carpenter wrote:
> The caller expects this function to return with the lock held and
> releases it immediately on error.
> 
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.cz>

Good catch, thanks.

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

* Re: [patch 1/2] Btrfs: double unlock bug in error handling
  2012-04-18  6:59 [patch 1/2] Btrfs: double unlock bug in error handling Dan Carpenter
  2012-04-18 10:14 ` David Sterba
@ 2012-04-18 11:29 ` Jan Schmidt
  2012-04-18 11:58   ` David Sterba
  2012-04-18 12:06   ` Dan Carpenter
  1 sibling, 2 replies; 5+ messages in thread
From: Jan Schmidt @ 2012-04-18 11:29 UTC (permalink / raw)
  To: Dan Carpenter; +Cc: Chris Mason, Jeff Mahoney, linux-btrfs, kernel-janitors

On 18.04.2012 08:59, Dan Carpenter wrote:
> The caller expects this function to return with the lock held and
> releases it immediately on error.
>
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
>
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index 2b35f8d..a0bb9dc 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -2301,6 +2301,7 @@ static noinline int run_clustered_refs(struct
btrfs_trans_handle *trans,
>
>  				if (ret) {
>  					printk(KERN_DEBUG "btrfs: run_delayed_extent_op returned %d\n",
ret);
> +					spin_lock(&delayed_refs->lock);
>  					return ret;
>  				}
>
> @@ -2331,6 +2332,7 @@ static noinline int run_clustered_refs(struct
btrfs_trans_handle *trans,
>
>  		if (ret) {
>  			printk(KERN_DEBUG "btrfs: run_one_delayed_ref returned %d\n", ret);
> +			spin_lock(&delayed_refs->lock);
>  			return ret;
>  		}

I think the correct way to fix this is:

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index a844204..9af261a 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -2450,7 +2450,6 @@ again:

                ret = run_clustered_refs(trans, root, &cluster);
                if (ret < 0) {
-                       spin_unlock(&delayed_refs->lock);
                        btrfs_abort_transaction(trans, root, ret);
                        return ret;
                }

-Jan

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

* Re: [patch 1/2] Btrfs: double unlock bug in error handling
  2012-04-18 11:29 ` Jan Schmidt
@ 2012-04-18 11:58   ` David Sterba
  2012-04-18 12:06   ` Dan Carpenter
  1 sibling, 0 replies; 5+ messages in thread
From: David Sterba @ 2012-04-18 11:58 UTC (permalink / raw)
  To: Jan Schmidt
  Cc: Dan Carpenter, Chris Mason, Jeff Mahoney, linux-btrfs,
	kernel-janitors

On Wed, Apr 18, 2012 at 01:29:46PM +0200, Jan Schmidt wrote:
> I think the correct way to fix this is:
> 
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index a844204..9af261a 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -2450,7 +2450,6 @@ again:
> 
>                 ret = run_clustered_refs(trans, root, &cluster);
>                 if (ret < 0) {
> -                       spin_unlock(&delayed_refs->lock);
>                         btrfs_abort_transaction(trans, root, ret);
>                         return ret;
>                 }

That's another way to fix it, but I'd rather see the lock/unlock
balanced within a function, and in this case the extra lock does not
hurt as it's a rare codepath.


david

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

* Re: [patch 1/2] Btrfs: double unlock bug in error handling
  2012-04-18 11:29 ` Jan Schmidt
  2012-04-18 11:58   ` David Sterba
@ 2012-04-18 12:06   ` Dan Carpenter
  1 sibling, 0 replies; 5+ messages in thread
From: Dan Carpenter @ 2012-04-18 12:06 UTC (permalink / raw)
  To: Jan Schmidt; +Cc: Chris Mason, Jeff Mahoney, linux-btrfs, kernel-janitors

On Wed, Apr 18, 2012 at 01:29:46PM +0200, Jan Schmidt wrote:
> On 18.04.2012 08:59, Dan Carpenter wrote:
> I think the correct way to fix this is:
> 

Yeah.  I considered both ways, but I chose the one which makes the
tools happy.  Which is the wrong choice, because taking a pointless
lock is wrong even on the slow path and we should improve the tools.

I'll resend.

regards,
dan carpenter


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

end of thread, other threads:[~2012-04-18 12:06 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-04-18  6:59 [patch 1/2] Btrfs: double unlock bug in error handling Dan Carpenter
2012-04-18 10:14 ` David Sterba
2012-04-18 11:29 ` Jan Schmidt
2012-04-18 11:58   ` David Sterba
2012-04-18 12:06   ` Dan Carpenter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).