aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc
diff options
context:
space:
mode:
authorJames Smart <james.smart@emulex.com>2013-03-01 16:36:54 -0500
committerJames Bottomley <JBottomley@Parallels.com>2013-04-09 18:20:27 -0400
commit2562669cf681f155be0746f7965bbcb6753bdb64 (patch)
treed8cc910ac0839a2dc655f1b8ea32d05130ed2915 /drivers/scsi/lpfc
parenta33c4f7bff84c3546b1a4c647462009fa601a160 (diff)
[SCSI] lpfc 8.3.38: Fixed deadlock condition in FCF round robin handling
Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/lpfc')
-rw-r--r--drivers/scsi/lpfc/lpfc_hbadisc.c2
-rw-r--r--drivers/scsi/lpfc/lpfc_sli.c9
2 files changed, 10 insertions, 1 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index 6e74a75fa8fd..d489a0da3c9d 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -1793,6 +1793,8 @@ lpfc_sli4_fcf_rec_mbox_parse(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
1793 virt_addr = mboxq->sge_array->addr[0]; 1793 virt_addr = mboxq->sge_array->addr[0];
1794 1794
1795 shdr = (union lpfc_sli4_cfg_shdr *)virt_addr; 1795 shdr = (union lpfc_sli4_cfg_shdr *)virt_addr;
1796 lpfc_sli_pcimem_bcopy(shdr, shdr,
1797 sizeof(union lpfc_sli4_cfg_shdr));
1796 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); 1798 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
1797 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); 1799 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
1798 if (shdr_status || shdr_add_status) { 1800 if (shdr_status || shdr_add_status) {
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index a0ef439058f0..57cb974af1fb 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -15507,11 +15507,18 @@ lpfc_check_next_fcf_pri_level(struct lpfc_hba *phba)
15507 LPFC_SLI4_FCF_TBL_INDX_MAX); 15507 LPFC_SLI4_FCF_TBL_INDX_MAX);
15508 lpfc_printf_log(phba, KERN_INFO, LOG_FIP, 15508 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
15509 "3060 Last IDX %d\n", last_index); 15509 "3060 Last IDX %d\n", last_index);
15510 if (list_empty(&phba->fcf.fcf_pri_list)) { 15510
15511 /* Verify the priority list has 2 or more entries */
15512 spin_lock_irq(&phba->hbalock);
15513 if (list_empty(&phba->fcf.fcf_pri_list) ||
15514 list_is_singular(&phba->fcf.fcf_pri_list)) {
15515 spin_unlock_irq(&phba->hbalock);
15511 lpfc_printf_log(phba, KERN_ERR, LOG_FIP, 15516 lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
15512 "3061 Last IDX %d\n", last_index); 15517 "3061 Last IDX %d\n", last_index);
15513 return 0; /* Empty rr list */ 15518 return 0; /* Empty rr list */
15514 } 15519 }
15520 spin_unlock_irq(&phba->hbalock);
15521
15515 next_fcf_pri = 0; 15522 next_fcf_pri = 0;
15516 /* 15523 /*
15517 * Clear the rr_bmask and set all of the bits that are at this 15524 * Clear the rr_bmask and set all of the bits that are at this