2007-10-25 19:31:07

by Anton Blanchard

[permalink] [raw]
Subject: [PATCH] Initialise scatter/gather list in sg driver


After turning on DEBUG_SG I hit a fail:

kernel BUG at include/linux/scatterlist.h:50!

ata_qc_issue
ata_scsi_translate
ipr_queuecommand
scsi_dispatch_cmd
scsi_request_fn
elv_insert
blk_execute_rq_nowait
blk_execute_rq
sg_io
scsi_cmd_ioctl
cdrom_ioctl
sr_block_ioctl
blkdev_driver_ioctl
blkdev_ioctl
block_ioctl
do_ioctl
vfs_ioctl
sys_ioctl
sg_ioctl_trans

It looks like ata_sg_setup is working on an uninitialised sg table. Call
sg_init_table to initialise it before use.

Signed-off-by: Anton Blanchard <[email protected]>
---

Jens this is against your sg branch. This fixes the fail but Id
appreciate a confirmation that it's the right fix :)

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index b5f7c59..4de41bb 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -4689,6 +4689,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
* data in this function or read data in ata_sg_clean.
*/
offset = lsg->offset + lsg->length - qc->pad_len;
+ sg_init_table(psg, 1);
sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT),
qc->pad_len, offset_in_page(offset));


2007-10-25 19:36:00

by Anton Blanchard

[permalink] [raw]
Subject: [PATCH] Initialise scatter/gather list in ata_sg_setup


(Sorry the subject was incorrect)...

After turning on DEBUG_SG I hit a fail:

kernel BUG at include/linux/scatterlist.h:50!

ata_qc_issue
ata_scsi_translate
ipr_queuecommand
scsi_dispatch_cmd
scsi_request_fn
elv_insert
blk_execute_rq_nowait
blk_execute_rq
sg_io
scsi_cmd_ioctl
cdrom_ioctl
sr_block_ioctl
blkdev_driver_ioctl
blkdev_ioctl
block_ioctl
do_ioctl
vfs_ioctl
sys_ioctl
sg_ioctl_trans

It looks like ata_sg_setup is working on an uninitialised sg table. Call
sg_init_table to initialise it before use.

Signed-off-by: Anton Blanchard <[email protected]>
---

Jens this is against your sg branch. This fixes the fail but Id
appreciate a confirmation that it's the right fix :)

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index b5f7c59..4de41bb 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -4689,6 +4689,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
* data in this function or read data in ata_sg_clean.
*/
offset = lsg->offset + lsg->length - qc->pad_len;
+ sg_init_table(psg, 1);
sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT),
qc->pad_len, offset_in_page(offset));

2007-10-26 12:01:05

by Jens Axboe

[permalink] [raw]
Subject: Re: [PATCH] Initialise scatter/gather list in ata_sg_setup

On Thu, Oct 25 2007, Anton Blanchard wrote:
>
> (Sorry the subject was incorrect)...
>
> After turning on DEBUG_SG I hit a fail:
>
> kernel BUG at include/linux/scatterlist.h:50!
>
> ata_qc_issue
> ata_scsi_translate
> ipr_queuecommand
> scsi_dispatch_cmd
> scsi_request_fn
> elv_insert
> blk_execute_rq_nowait
> blk_execute_rq
> sg_io
> scsi_cmd_ioctl
> cdrom_ioctl
> sr_block_ioctl
> blkdev_driver_ioctl
> blkdev_ioctl
> block_ioctl
> do_ioctl
> vfs_ioctl
> sys_ioctl
> sg_ioctl_trans
>
> It looks like ata_sg_setup is working on an uninitialised sg table. Call
> sg_init_table to initialise it before use.
>
> Signed-off-by: Anton Blanchard <[email protected]>
> ---
>
> Jens this is against your sg branch. This fixes the fail but Id
> appreciate a confirmation that it's the right fix :)

The patch looks OK, you could also get away with just doing that
sg_init_table() on qc init/alloc.


--
Jens Axboe