summaryrefslogtreecommitdiff
path: root/drivers/ata
diff options
context:
space:
mode:
authorAlbert Lee <albertcc@tw.ibm.com>2007-12-05 07:43:02 (GMT)
committerJeff Garzik <jeff@garzik.org>2008-01-23 10:24:13 (GMT)
commit0106372db6dc135f300035ce8e93cddd7283a26a (patch)
tree951eb0c3567cad2bccf7dc3804bbdee0c462f291 /drivers/ata
parent93f8fecbe72bc3c121f3605dd198ff39ef358522 (diff)
downloadlinux-0106372db6dc135f300035ce8e93cddd7283a26a.tar.xz
libata: zero xfer length on ATAPI data xfer IRQ is HSM violation
Treat zero xfer length as HSM violation. While at it, add unlikely()'s to ATAPI ireason and transfer length checks. tj: Formatted patch and added unlikely()'s. Signed-off-by: Albert Lee <albertcc@tw.ibm.com> Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-core.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 2b57547..c9e6bd4 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -5309,12 +5309,15 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
bytes = (bc_hi << 8) | bc_lo;
/* shall be cleared to zero, indicating xfer of data */
- if (ireason & (1 << 0))
+ if (unlikely(ireason & (1 << 0)))
goto err_out;
/* make sure transfer direction matches expected */
i_write = ((ireason & (1 << 1)) == 0) ? 1 : 0;
- if (do_write != i_write)
+ if (unlikely(do_write != i_write))
+ goto err_out;
+
+ if (unlikely(!bytes))
goto err_out;
VPRINTK("ata%u: xfering %d bytes\n", ap->print_id, bytes);