libata: fix dma_unmap_sg misuse
libata passes the returned value of dma_map_sg() to dma_unmap_sg(),which is the misuse of dma_unmap_sg(). DMA-mapping.txt says: To unmap a scatterlist, just call: pci_unmap_sg(pdev, sglist, nents, direction); Again, make sure DMA activity has already finished. PLEASE NOTE: The 'nents' argument to the pci_unmap_sg call must be the _same_ one you passed into the pci_map_sg call, it should _NOT_ be the 'count' value _returned_ from the pci_map_sg call. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Acked-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
e7d3ef13d5
commit
5825627c94
|
@ -4612,7 +4612,7 @@ void ata_sg_clean(struct ata_queued_cmd *qc)
|
|||
VPRINTK("unmapping %u sg elements\n", qc->n_elem);
|
||||
|
||||
if (qc->n_elem)
|
||||
dma_unmap_sg(ap->dev, sg, qc->n_elem, dir);
|
||||
dma_unmap_sg(ap->dev, sg, qc->orig_n_elem, dir);
|
||||
|
||||
qc->flags &= ~ATA_QCFLAG_DMAMAP;
|
||||
qc->sg = NULL;
|
||||
|
@ -4727,7 +4727,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
|
|||
return -1;
|
||||
|
||||
DPRINTK("%d sg elements mapped\n", n_elem);
|
||||
|
||||
qc->orig_n_elem = qc->n_elem;
|
||||
qc->n_elem = n_elem;
|
||||
qc->flags |= ATA_QCFLAG_DMAMAP;
|
||||
|
||||
|
|
|
@ -530,6 +530,7 @@ struct ata_queued_cmd {
|
|||
unsigned long flags; /* ATA_QCFLAG_xxx */
|
||||
unsigned int tag;
|
||||
unsigned int n_elem;
|
||||
unsigned int orig_n_elem;
|
||||
|
||||
int dma_dir;
|
||||
|
||||
|
|
Loading…
Reference in New Issue