lkml.org 
[lkml]   [2010]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: BUG at drivers/scsi/scsi_lib.c:1113
On 07/22/2010 10:37 AM, Neil Brown wrote:
> On Thu, 22 Jul 2010 09:04:27 +0200
> Jiri Slaby <jirislaby@gmail.com> wrote:
>
>> Hello,
>>
>> I'm seeing this BUG while booting:
>>
>> EXT3-fs (md1): using internal journal
>> ------------[ cut here ]------------
>> kernel BUG at /home/l/latest/xxx/drivers/scsi/scsi_lib.c:1113!
>
> You aren't the only one.
> https://bugzilla.kernel.org/show_bug.cgi?id=16275
>
>
>> I bisected it down to:
>> commit 74450be123b6f3cb480c358a056be398cce6aa6e
>> Author: Christoph Hellwig <hch@lst.de>
>> Date: Fri Jun 18 11:53:43 2010 +0200
>>
>> block: unify flags for struct bio and struct request
>>
>> Remove the current bio flags and reuse the request flags for the
>> bio, too.
>> This allows to more easily trace the type of I/O from the filesystem
>> down to the block driver. There were two flags in the bio that were
>> missing in the requests: BIO_RW_UNPLUG and BIO_RW_AHEAD. Also I've
>> renamed two request flags that had a superflous RW in them.
>>
>> Note that the flags are in bio.h despite having the REQ_ name - as
>> blkdev.h includes bio.h that is the only way to go for now.
>>
>> Signed-off-by: Christoph Hellwig <hch@lst.de>
>> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
>>
>>
>
> Thanks for doing that.
>
> I suspect that problem is that "do_sync" and "do_barriers" in
> drivers/md/raid1.c are still 'bool' and should now be 'unsigned long'.
>
> I'm not sure how wide '_Bool' is, but I'm guess it isn't wide enough.
>
> Could you please try changing ever 'bool' in that file to 'unsigned long'
> and see if that fixes it?
>

Please don't. This is really bad programming, and produces slower
code. You should do:

diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 73cc74f..8bd1ecb 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -787,7 +787,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
struct bio_list bl;
struct page **behind_pages = NULL;
const int rw = bio_data_dir(bio);
- const bool do_sync = (bio->bi_rw & REQ_SYNC);
+ const bool do_sync = (bio->bi_rw & REQ_SYNC) != 0;
bool do_barriers;
mdk_rdev_t *blocked_rdev;

Boaz
> Thanks,
> NeilBrown


\
 
 \ /
  Last update: 2010-07-22 12:41    [W:0.159 / U:0.080 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site