diff options
author | Anton Blanchard <anton@samba.org> | 2007-10-26 07:59:44 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2007-10-29 04:18:03 -0400 |
commit | acd054a5ef401e03e0047b487e572442614f81e5 (patch) | |
tree | 000704c359643885e3b0fd4e6d082321d5889ccb /drivers/ata | |
parent | 5336940dd8b11180a0340ba886db62f728377d19 (diff) |
Initialise scatter/gather list in ata_sg_setup
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 <anton@samba.org>
Note: this patch will fix it, but you could also get away with just
doing the sg_init_table() once at qc creation time.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-core.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 081e3dfb64d4..7ef515b3382d 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) | |||
4689 | * data in this function or read data in ata_sg_clean. | 4689 | * data in this function or read data in ata_sg_clean. |
4690 | */ | 4690 | */ |
4691 | offset = lsg->offset + lsg->length - qc->pad_len; | 4691 | offset = lsg->offset + lsg->length - qc->pad_len; |
4692 | sg_init_table(psg, 1); | ||
4692 | sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT), | 4693 | sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT), |
4693 | qc->pad_len, offset_in_page(offset)); | 4694 | qc->pad_len, offset_in_page(offset)); |
4694 | 4695 | ||