aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlbert Lee <albertcc@tw.ibm.com>2005-06-06 03:56:03 -0400
committerJeff Garzik <jgarzik@pobox.com>2005-06-09 03:14:59 -0400
commit6952df035509717bdc46194b2a3d6ffb9349f267 (patch)
treebf8709691e303a533e5798c4c7c5a17c9d752fed /drivers
parente1dd23a0012c3929737798fda9fede0e783f4ff3 (diff)
[PATCH] sg traverse fix for __atapi_pio_bytes()
Problem: Incorrect md5sum when using ATAPI PIO mode to verify a distro CD. Root cause: sg traverse problem. In __atapi_pio_bytes(), if qc->cursg++ is increased and "goto next_page" is executed, then sg is not updated to the new qc->cursg and the old sg is overwritten with the new data. Changes: - Replace "goto next_page" with "goto next_sg" to make sg updated. Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/libata-core.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 21d194c6ace3..9e58f134f68b 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -2577,7 +2577,6 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
2577next_sg: 2577next_sg:
2578 sg = &qc->sg[qc->cursg]; 2578 sg = &qc->sg[qc->cursg];
2579 2579
2580next_page:
2581 page = sg->page; 2580 page = sg->page;
2582 offset = sg->offset + qc->cursg_ofs; 2581 offset = sg->offset + qc->cursg_ofs;
2583 2582
@@ -2585,6 +2584,7 @@ next_page:
2585 page = nth_page(page, (offset >> PAGE_SHIFT)); 2584 page = nth_page(page, (offset >> PAGE_SHIFT));
2586 offset %= PAGE_SIZE; 2585 offset %= PAGE_SIZE;
2587 2586
2587 /* don't overrun current sg */
2588 count = min(sg->length - qc->cursg_ofs, bytes); 2588 count = min(sg->length - qc->cursg_ofs, bytes);
2589 2589
2590 /* don't cross page boundaries */ 2590 /* don't cross page boundaries */
@@ -2609,8 +2609,6 @@ next_page:
2609 kunmap(page); 2609 kunmap(page);
2610 2610
2611 if (bytes) { 2611 if (bytes) {
2612 if (qc->cursg_ofs < sg->length)
2613 goto next_page;
2614 goto next_sg; 2612 goto next_sg;
2615 } 2613 }
2616} 2614}