diff options
author | Albert Lee <albertcc@tw.ibm.com> | 2005-06-06 03:56:03 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-06-09 03:14:59 -0400 |
commit | 6952df035509717bdc46194b2a3d6ffb9349f267 (patch) | |
tree | bf8709691e303a533e5798c4c7c5a17c9d752fed | |
parent | e1dd23a0012c3929737798fda9fede0e783f4ff3 (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>
-rw-r--r-- | drivers/scsi/libata-core.c | 4 |
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) | |||
2577 | next_sg: | 2577 | next_sg: |
2578 | sg = &qc->sg[qc->cursg]; | 2578 | sg = &qc->sg[qc->cursg]; |
2579 | 2579 | ||
2580 | next_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 | } |