public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jan Schmidt <list.lkml@jan-o-sch.net>
To: Tejun Heo <tj@kernel.org>
Cc: Wanlong Gao <gaowanlong@cn.fujitsu.com>,
	Jens Axboe <axboe@kernel.dk>,
	Steven Rostedt <rostedt@goodmis.org>,
	namhyung@gmail.com, agk@redhat.com, dm-devel@redhat.com,
	neilb@suse.de, LKML <linux-kernel@vger.kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Chris Mason <chris.mason@fusionio.com>,
	linux-btrfs@vger.kernel.org
Subject: Re: [BUG REPORT] Kernel panic on 3.9.0-rc7-4-gbb33db7
Date: Fri, 19 Apr 2013 10:24:09 +0200	[thread overview]
Message-ID: <5170FF29.2020904@jan-o-sch.net> (raw)
In-Reply-To: <20130419055754.GA9691@mtj.dyndns.org>

On Fri, April 19, 2013 at 07:57 (+0200), Tejun Heo wrote:
> (cc'ing btrfs people)
> 
> On Fri, Apr 19, 2013 at 11:33:20AM +0800, Wanlong Gao wrote:
>> RIP: 0010:[<ffffffff812484d3>]  [<ffffffff812484d3>] ftrace_raw_event_block_bio_complete+0x73/0xf0
> ...
>>  [<ffffffff811b6c10>] bio_endio+0x80/0x90
>>  [<ffffffffa0790d26>] btrfs_end_bio+0xf6/0x190 [btrfs]
>>  [<ffffffff811b6bcd>] bio_endio+0x3d/0x90
>>  [<ffffffff81249873>] req_bio_endio+0xa3/0xe0
> 
> Ugh....
> 
> In fs/btrfs/volumes.c
> 
>   static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical)
>   {
> 	...
> 		bio->bi_bdev = (struct block_device *)
> 			       	       (unsigned long)bbio->mirror_num;
> 	...
>   }
> 
>   static void btrfs_end_bio(struct bio *bio, int err)
>   {
> 	...
> 		bio->bi_bdev = (struct block_device *)
> 					(unsigned long)bbio->mirror_num;
> 									
> 	...
>   }
> 
> In fs/btrfs/extent_io.c
> 
>   static void end_bio_extent_readpage(struct bio *bio, int err)
>   {
> 	int mirror;
> 	...
> 		mirror = (int)(unsigned long)bio->bi_bdev;
> 	...
>   }
> 
> Ewweeeeeeeeeeeeeeeeeehh........
> 
> No wonder this thing crashes.  Chris, can't the original bio carry
> bbio in bi_private and let end_bio_extent_readpage() free the bbio
> instead of abusing bi_bdev like this?

Oops.

It's been my patch back in 2011 (commit 2774b2ca3), sent as an RFC-Patch and
just slipped in without further discussion of that exact change. Hackish, yes -
my reasoning was because the block layer changed bio->bi_bdev anyway, no one
would want to look into it after the bio returned (and in fact it didn't hurt
for like two years now). Although the block layer changes bi_bdev, it stays a
valid bdev pointer, I admit.

One way around this would be what you suggest, however that would mean the
caller of (btrfs|btree)_submit_bio_hook gets its completion called in the end,
but must know that the private is in fact a bbio which in turn carries the
caller's private. Doesn't sound clean to me, either.

The best idea I currently have is to add a dispatcher function that does the
freeing of bbio and calls the actual completion with mirror_num as a separate
parameter. That would make all the btrfs completions incompatible with
bio_end_io_t, but it shouldn't hurt.

At least now I know I wasn't invited to LSF for a good reason :-)

-Jan

  parent reply	other threads:[~2013-04-19  8:34 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-17  8:36 [BUG REPORT] Kernel panic on 3.9.0-rc7-4-gbb33db7 Wanlong Gao
2013-04-17 14:46 ` Steven Rostedt
2013-04-18 12:37   ` Jens Axboe
2013-04-18 12:54     ` Wanlong Gao
2013-04-18 13:35       ` Jens Axboe
2013-04-18 14:14         ` Wanlong Gao
2013-04-18 14:30           ` Jens Axboe
2013-04-18 14:45             ` Wanlong Gao
2013-04-18 17:52               ` Tejun Heo
2013-04-19  4:06                 ` Wanlong Gao
2013-04-18 16:08             ` Linus Torvalds
2013-04-18 17:27               ` Tejun Heo
2013-04-18 17:39                 ` Jens Axboe
2013-04-18 18:07                   ` Tejun Heo
2013-04-18 18:13                     ` Jens Axboe
2013-04-18 19:10                       ` Linus Torvalds
2013-04-18 20:37                         ` Jens Axboe
2013-04-19  1:08                           ` srostedt@gmail.com
2013-04-19  6:10                         ` Wanlong Gao
2013-04-19  3:33             ` Wanlong Gao
2013-04-19  5:57               ` Tejun Heo
2013-04-19  6:17                 ` Tejun Heo
2013-04-19  6:30                   ` Wanlong Gao
2013-04-19 13:31                   ` Jens Axboe
2013-04-19  8:24                 ` Jan Schmidt [this message]
2013-04-19 12:15                 ` Chris Mason
2013-04-19 13:32                 ` Jens Axboe
2013-04-19 13:52                   ` Chris Mason

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5170FF29.2020904@jan-o-sch.net \
    --to=list.lkml@jan-o-sch.net \
    --cc=agk@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=chris.mason@fusionio.com \
    --cc=dm-devel@redhat.com \
    --cc=gaowanlong@cn.fujitsu.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=namhyung@gmail.com \
    --cc=neilb@suse.de \
    --cc=rostedt@goodmis.org \
    --cc=tj@kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox