Loading drivers/scsi/lpfc/lpfc_scsi.c +24 −16 Original line number Diff line number Diff line Loading @@ -153,22 +153,6 @@ static void lpfc_release_scsi_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb) { unsigned long iflag = 0; /* * There are only two special cases to consider. (1) the scsi command * requested scatter-gather usage or (2) the scsi command allocated * a request buffer, but did not request use_sg. There is a third * case, but it does not require resource deallocation. */ if ((psb->seg_cnt > 0) && (psb->pCmd->use_sg)) { dma_unmap_sg(&phba->pcidev->dev, psb->pCmd->request_buffer, psb->seg_cnt, psb->pCmd->sc_data_direction); } else { if ((psb->nonsg_phys) && (psb->pCmd->request_bufflen)) { dma_unmap_single(&phba->pcidev->dev, psb->nonsg_phys, psb->pCmd->request_bufflen, psb->pCmd->sc_data_direction); } } spin_lock_irqsave(&phba->scsi_buf_list_lock, iflag); psb->pCmd = NULL; Loading Loading @@ -281,6 +265,27 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * lpfc_cmd) return 0; } static void lpfc_scsi_unprep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb) { /* * There are only two special cases to consider. (1) the scsi command * requested scatter-gather usage or (2) the scsi command allocated * a request buffer, but did not request use_sg. There is a third * case, but it does not require resource deallocation. */ if ((psb->seg_cnt > 0) && (psb->pCmd->use_sg)) { dma_unmap_sg(&phba->pcidev->dev, psb->pCmd->request_buffer, psb->seg_cnt, psb->pCmd->sc_data_direction); } else { if ((psb->nonsg_phys) && (psb->pCmd->request_bufflen)) { dma_unmap_single(&phba->pcidev->dev, psb->nonsg_phys, psb->pCmd->request_bufflen, psb->pCmd->sc_data_direction); } } } static void lpfc_handle_fcp_err(struct lpfc_scsi_buf *lpfc_cmd) { Loading Loading @@ -454,6 +459,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, cmd->scsi_done(cmd); if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); lpfc_release_scsi_buf(phba, lpfc_cmd); return; } Loading Loading @@ -511,6 +517,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, } } lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); lpfc_release_scsi_buf(phba, lpfc_cmd); } Loading Loading @@ -822,6 +829,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) return 0; out_host_busy_free_buf: lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); lpfc_release_scsi_buf(phba, lpfc_cmd); out_host_busy: return SCSI_MLQUEUE_HOST_BUSY; Loading Loading
drivers/scsi/lpfc/lpfc_scsi.c +24 −16 Original line number Diff line number Diff line Loading @@ -153,22 +153,6 @@ static void lpfc_release_scsi_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb) { unsigned long iflag = 0; /* * There are only two special cases to consider. (1) the scsi command * requested scatter-gather usage or (2) the scsi command allocated * a request buffer, but did not request use_sg. There is a third * case, but it does not require resource deallocation. */ if ((psb->seg_cnt > 0) && (psb->pCmd->use_sg)) { dma_unmap_sg(&phba->pcidev->dev, psb->pCmd->request_buffer, psb->seg_cnt, psb->pCmd->sc_data_direction); } else { if ((psb->nonsg_phys) && (psb->pCmd->request_bufflen)) { dma_unmap_single(&phba->pcidev->dev, psb->nonsg_phys, psb->pCmd->request_bufflen, psb->pCmd->sc_data_direction); } } spin_lock_irqsave(&phba->scsi_buf_list_lock, iflag); psb->pCmd = NULL; Loading Loading @@ -281,6 +265,27 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * lpfc_cmd) return 0; } static void lpfc_scsi_unprep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb) { /* * There are only two special cases to consider. (1) the scsi command * requested scatter-gather usage or (2) the scsi command allocated * a request buffer, but did not request use_sg. There is a third * case, but it does not require resource deallocation. */ if ((psb->seg_cnt > 0) && (psb->pCmd->use_sg)) { dma_unmap_sg(&phba->pcidev->dev, psb->pCmd->request_buffer, psb->seg_cnt, psb->pCmd->sc_data_direction); } else { if ((psb->nonsg_phys) && (psb->pCmd->request_bufflen)) { dma_unmap_single(&phba->pcidev->dev, psb->nonsg_phys, psb->pCmd->request_bufflen, psb->pCmd->sc_data_direction); } } } static void lpfc_handle_fcp_err(struct lpfc_scsi_buf *lpfc_cmd) { Loading Loading @@ -454,6 +459,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, cmd->scsi_done(cmd); if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); lpfc_release_scsi_buf(phba, lpfc_cmd); return; } Loading Loading @@ -511,6 +517,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, } } lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); lpfc_release_scsi_buf(phba, lpfc_cmd); } Loading Loading @@ -822,6 +829,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) return 0; out_host_busy_free_buf: lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); lpfc_release_scsi_buf(phba, lpfc_cmd); out_host_busy: return SCSI_MLQUEUE_HOST_BUSY; Loading