Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c59fd9ebc46da8d48b76955d4d48e3597f8c8726
Commit:     c59fd9ebc46da8d48b76955d4d48e3597f8c8726
Parent:     d4bd4cd0630060a64681590b9405b87e43c11f14
Author:     FUJITA Tomonori <[EMAIL PROTECTED]>
AuthorDate: Wed Jul 4 06:03:11 2007 -0700
Committer:  James Bottomley <[EMAIL PROTECTED]>
CommitDate: Sat Jul 14 17:13:02 2007 -0500

    [SCSI] lpfc: fix NPIV mapping problems
    
    This patch uses dma_map_sg with phba->pcidev->dev instead of
    scsi_dma_map.
    
    scsi_dma_map doesn't work for NPIV since fc_vport->dev isn't fully
    initialized. check_addr() in arch/x86_64/kernel/pci-nommu.c leads to
    the crash since dev->dma_mask is NULL.
    
    For more details:
    
    http://marc.info/?l=linux-scsi&m=118312448030633&w=2
    
    Signed-off-by: FUJITA Tomonori <[EMAIL PROTECTED]>
    Acked-by: James Smart <[EMAIL PROTECTED]>
    Signed-off-by: James Bottomley <[EMAIL PROTECTED]>
---
 drivers/scsi/lpfc/lpfc_scsi.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index 3d35eae..8f45bbc 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -332,8 +332,7 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct 
lpfc_scsi_buf *lpfc_cmd)
         * data bde entry.
         */
        bpl += 2;
-       nseg = scsi_dma_map(scsi_cmnd);
-       if (nseg > 0) {
+       if (scsi_sg_count(scsi_cmnd)) {
                /*
                 * The driver stores the segment count returned from pci_map_sg
                 * because this a count of dma-mappings used to map the use_sg
@@ -341,6 +340,11 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct 
lpfc_scsi_buf *lpfc_cmd)
                 * architectures that implement an IOMMU.
                 */
 
+               nseg = dma_map_sg(&phba->pcidev->dev, scsi_sglist(scsi_cmnd),
+                                 scsi_sg_count(scsi_cmnd), datadir);
+               if (unlikely(!nseg))
+                       return 1;
+
                lpfc_cmd->seg_cnt = nseg;
                if (lpfc_cmd->seg_cnt > phba->cfg_sg_seg_cnt) {
                        printk(KERN_ERR "%s: Too many sg segments from "
@@ -370,8 +374,7 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct 
lpfc_scsi_buf *lpfc_cmd)
                        bpl++;
                        num_bde++;
                }
-       } else if (nseg < 0)
-               return 1;
+       }
 
        /*
         * Finish initializing those IOCB fields that are dependent on the
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to