ide: save the returned value of dma_map_sg
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Fri, 13 Mar 2009 20:16:13 +0000 (21:16 +0100)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 13 Mar 2009 20:16:13 +0000 (21:16 +0100)
dma_map_sg could return a value different to 'nents' argument of
dma_map_sg so the ide stack needs to save it for the later usage
(e.g. for_each_sg).

The ide stack also needs to save the original sg_nents value for
pci_unmap_sg.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
[bart: backport to Linus' tree]
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-dma.c
include/linux/ide.h

index 72ebab0bc755571c0735b87aed3574a72db12eec..059c90bb5ad2f4082c52ad695100ea83490c0263 100644 (file)
@@ -128,6 +128,7 @@ int ide_build_sglist(ide_drive_t *drive, struct request *rq)
 {
        ide_hwif_t *hwif = drive->hwif;
        struct scatterlist *sg = hwif->sg_table;
+       int i;
 
        ide_map_sg(drive, rq);
 
@@ -136,8 +137,13 @@ int ide_build_sglist(ide_drive_t *drive, struct request *rq)
        else
                hwif->sg_dma_direction = DMA_TO_DEVICE;
 
-       return dma_map_sg(hwif->dev, sg, hwif->sg_nents,
-                         hwif->sg_dma_direction);
+       i = dma_map_sg(hwif->dev, sg, hwif->sg_nents, hwif->sg_dma_direction);
+       if (i) {
+               hwif->orig_sg_nents = hwif->sg_nents;
+               hwif->sg_nents = i;
+       }
+
+       return i;
 }
 EXPORT_SYMBOL_GPL(ide_build_sglist);
 
@@ -156,7 +162,7 @@ void ide_destroy_dmatable(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = drive->hwif;
 
-       dma_unmap_sg(hwif->dev, hwif->sg_table, hwif->sg_nents,
+       dma_unmap_sg(hwif->dev, hwif->sg_table, hwif->orig_sg_nents,
                     hwif->sg_dma_direction);
 }
 EXPORT_SYMBOL_GPL(ide_destroy_dmatable);
index e0cedfe9fad46b63d13fad9ce0a006d5e75fecd3..25087aead65768401a8b32b582fd42780401fde1 100644 (file)
@@ -797,6 +797,7 @@ typedef struct hwif_s {
        struct scatterlist *sg_table;
        int sg_max_nents;               /* Maximum number of entries in it */
        int sg_nents;                   /* Current number of entries in it */
+       int orig_sg_nents;
        int sg_dma_direction;           /* dma transfer direction */
 
        /* data phase of the active command (currently only valid for PIO/DMA) */