diff options
author | James Smart <james.smart@emulex.com> | 2013-03-01 16:37:44 -0500 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-04-09 18:20:29 -0400 |
commit | 38c206736612550ab946889e1522fc71bc2eed4a (patch) | |
tree | 25390e99f5a816329ef671dcda7fe52fe842b31c /drivers/scsi | |
parent | 9466150489c53b4425dde7f4634fe2b0cfcb61a5 (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.c | 18 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 8 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 4 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 8 |
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"); |