aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorJames Smart <james.smart@emulex.com>2013-03-01 16:37:44 -0500
committerJames Bottomley <JBottomley@Parallels.com>2013-04-09 18:20:29 -0400
commit38c206736612550ab946889e1522fc71bc2eed4a (patch)
tree25390e99f5a816329ef671dcda7fe52fe842b31c /drivers/scsi
parent9466150489c53b4425dde7f4634fe2b0cfcb61a5 (diff)
[SCSI] lpfc 8.3.38: Fixed circular locking dependency and inconsistent lock state issues
Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/lpfc/lpfc_hbadisc.c18
-rw-r--r--drivers/scsi/lpfc/lpfc_init.c8
-rw-r--r--drivers/scsi/lpfc/lpfc_scsi.c4
-rw-r--r--drivers/scsi/lpfc/lpfc_sli.c8
4 files changed, 20 insertions, 18 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index 8ab3e9622714..4decb868017e 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -2990,6 +2990,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
2990 struct lpfc_dmabuf *mp; 2990 struct lpfc_dmabuf *mp;
2991 int rc; 2991 int rc;
2992 struct fcf_record *fcf_record; 2992 struct fcf_record *fcf_record;
2993 uint32_t fc_flags = 0;
2993 2994
2994 spin_lock_irq(&phba->hbalock); 2995 spin_lock_irq(&phba->hbalock);
2995 switch (bf_get(lpfc_mbx_read_top_link_spd, la)) { 2996 switch (bf_get(lpfc_mbx_read_top_link_spd, la)) {
@@ -3021,11 +3022,8 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
3021 "1309 Link Up Event npiv not supported in loop " 3022 "1309 Link Up Event npiv not supported in loop "
3022 "topology\n"); 3023 "topology\n");
3023 /* Get Loop Map information */ 3024 /* Get Loop Map information */
3024 if (bf_get(lpfc_mbx_read_top_il, la)) { 3025 if (bf_get(lpfc_mbx_read_top_il, la))
3025 spin_lock(shost->host_lock); 3026 fc_flags |= FC_LBIT;
3026 vport->fc_flag |= FC_LBIT;
3027 spin_unlock(shost->host_lock);
3028 }
3029 3027
3030 vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la); 3028 vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la);
3031 i = la->lilpBde64.tus.f.bdeSize; 3029 i = la->lilpBde64.tus.f.bdeSize;
@@ -3074,12 +3072,16 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
3074 phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED; 3072 phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED;
3075 } 3073 }
3076 vport->fc_myDID = phba->fc_pref_DID; 3074 vport->fc_myDID = phba->fc_pref_DID;
3077 spin_lock(shost->host_lock); 3075 fc_flags |= FC_LBIT;
3078 vport->fc_flag |= FC_LBIT;
3079 spin_unlock(shost->host_lock);
3080 } 3076 }
3081 spin_unlock_irq(&phba->hbalock); 3077 spin_unlock_irq(&phba->hbalock);
3082 3078
3079 if (fc_flags) {
3080 spin_lock_irq(shost->host_lock);
3081 vport->fc_flag |= fc_flags;
3082 spin_unlock_irq(shost->host_lock);
3083 }
3084
3083 lpfc_linkup(phba); 3085 lpfc_linkup(phba);
3084 sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); 3086 sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
3085 if (!sparam_mbox) 3087 if (!sparam_mbox)
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 057c7c18b7e3..5da297290262 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -2914,9 +2914,9 @@ lpfc_sli4_xri_sgl_update(struct lpfc_hba *phba)
2914 sglq_entry->state = SGL_FREED; 2914 sglq_entry->state = SGL_FREED;
2915 list_add_tail(&sglq_entry->list, &els_sgl_list); 2915 list_add_tail(&sglq_entry->list, &els_sgl_list);
2916 } 2916 }
2917 spin_lock(&phba->hbalock); 2917 spin_lock_irq(&phba->hbalock);
2918 list_splice_init(&els_sgl_list, &phba->sli4_hba.lpfc_sgl_list); 2918 list_splice_init(&els_sgl_list, &phba->sli4_hba.lpfc_sgl_list);
2919 spin_unlock(&phba->hbalock); 2919 spin_unlock_irq(&phba->hbalock);
2920 } else if (els_xri_cnt < phba->sli4_hba.els_xri_cnt) { 2920 } else if (els_xri_cnt < phba->sli4_hba.els_xri_cnt) {
2921 /* els xri-sgl shrinked */ 2921 /* els xri-sgl shrinked */
2922 xri_cnt = phba->sli4_hba.els_xri_cnt - els_xri_cnt; 2922 xri_cnt = phba->sli4_hba.els_xri_cnt - els_xri_cnt;
@@ -3014,9 +3014,9 @@ lpfc_sli4_xri_sgl_update(struct lpfc_hba *phba)
3014 psb->cur_iocbq.sli4_lxritag = lxri; 3014 psb->cur_iocbq.sli4_lxritag = lxri;
3015 psb->cur_iocbq.sli4_xritag = phba->sli4_hba.xri_ids[lxri]; 3015 psb->cur_iocbq.sli4_xritag = phba->sli4_hba.xri_ids[lxri];
3016 } 3016 }
3017 spin_lock(&phba->scsi_buf_list_lock); 3017 spin_lock_irq(&phba->scsi_buf_list_lock);
3018 list_splice_init(&scsi_sgl_list, &phba->lpfc_scsi_buf_list); 3018 list_splice_init(&scsi_sgl_list, &phba->lpfc_scsi_buf_list);
3019 spin_unlock(&phba->scsi_buf_list_lock); 3019 spin_unlock_irq(&phba->scsi_buf_list_lock);
3020 3020
3021 return 0; 3021 return 0;
3022 3022
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index e75210d67970..74b8710e1e90 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -885,9 +885,9 @@ lpfc_sli4_repost_scsi_sgl_list(struct lpfc_hba *phba)
885 int num_posted, rc = 0; 885 int num_posted, rc = 0;
886 886
887 /* get all SCSI buffers need to repost to a local list */ 887 /* get all SCSI buffers need to repost to a local list */
888 spin_lock(&phba->scsi_buf_list_lock); 888 spin_lock_irq(&phba->scsi_buf_list_lock);
889 list_splice_init(&phba->lpfc_scsi_buf_list, &post_sblist); 889 list_splice_init(&phba->lpfc_scsi_buf_list, &post_sblist);
890 spin_unlock(&phba->scsi_buf_list_lock); 890 spin_unlock_irq(&phba->scsi_buf_list_lock);
891 891
892 /* post the list of scsi buffer sgls to port if available */ 892 /* post the list of scsi buffer sgls to port if available */
893 if (!list_empty(&post_sblist)) { 893 if (!list_empty(&post_sblist)) {
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index 5fade546f4f3..568cebea05bc 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -5999,9 +5999,9 @@ lpfc_sli4_repost_els_sgl_list(struct lpfc_hba *phba)
5999 LIST_HEAD(post_sgl_list); 5999 LIST_HEAD(post_sgl_list);
6000 LIST_HEAD(free_sgl_list); 6000 LIST_HEAD(free_sgl_list);
6001 6001
6002 spin_lock(&phba->hbalock); 6002 spin_lock_irq(&phba->hbalock);
6003 list_splice_init(&phba->sli4_hba.lpfc_sgl_list, &allc_sgl_list); 6003 list_splice_init(&phba->sli4_hba.lpfc_sgl_list, &allc_sgl_list);
6004 spin_unlock(&phba->hbalock); 6004 spin_unlock_irq(&phba->hbalock);
6005 6005
6006 list_for_each_entry_safe(sglq_entry, sglq_entry_next, 6006 list_for_each_entry_safe(sglq_entry, sglq_entry_next,
6007 &allc_sgl_list, list) { 6007 &allc_sgl_list, list) {
@@ -6102,10 +6102,10 @@ lpfc_sli4_repost_els_sgl_list(struct lpfc_hba *phba)
6102 6102
6103 /* push els sgls posted to the availble list */ 6103 /* push els sgls posted to the availble list */
6104 if (!list_empty(&post_sgl_list)) { 6104 if (!list_empty(&post_sgl_list)) {
6105 spin_lock(&phba->hbalock); 6105 spin_lock_irq(&phba->hbalock);
6106 list_splice_init(&post_sgl_list, 6106 list_splice_init(&post_sgl_list,
6107 &phba->sli4_hba.lpfc_sgl_list); 6107 &phba->sli4_hba.lpfc_sgl_list);
6108 spin_unlock(&phba->hbalock); 6108 spin_unlock_irq(&phba->hbalock);
6109 } else { 6109 } else {
6110 lpfc_printf_log(phba, KERN_ERR, LOG_SLI, 6110 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
6111 "3161 Failure to post els sgl to port.\n"); 6111 "3161 Failure to post els sgl to port.\n");