diff mbox

[3/9] lpfc: Devices are not discovered during takeaway/giveback testing

Message ID 555f405d.19aP4Ju4SItrRE4D%james.smart@avagotech.com (mailing list archive)
State New, archived
Headers show

Commit Message

James Smart May 22, 2015, 2:42 p.m. UTC
Devices are not discovered during takeaway/giveback testing

When a remote nport changes it's DID, a new ndlp is used.
However, we left the old ndlp state unchanged and still in
a discovery state. The may stall discovery resulting in some
devices not being discovered.  Correct by swapping the state
of the 2 ndlp's when a DID swap is detected.

Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: James Smart <james.smart@avagotech.com>
---
 drivers/scsi/lpfc/lpfc_els.c | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

Comments

Sebastian Herbszt May 24, 2015, 7:56 p.m. UTC | #1
James Smart wrote:
> 
> Devices are not discovered during takeaway/giveback testing
> 
> When a remote nport changes it's DID, a new ndlp is used.

its

> However, we left the old ndlp state unchanged and still in
> a discovery state. The may stall discovery resulting in some

The?

> devices not being discovered.  Correct by swapping the state

two spaces

> of the 2 ndlp's when a DID swap is detected.

Sebastian
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hannes Reinecke May 25, 2015, 3:15 p.m. UTC | #2
On 05/22/2015 04:42 PM, James Smart wrote:
> 
> Devices are not discovered during takeaway/giveback testing
> 
> When a remote nport changes it's DID, a new ndlp is used.
> However, we left the old ndlp state unchanged and still in
> a discovery state. The may stall discovery resulting in some
> devices not being discovered.  Correct by swapping the state
> of the 2 ndlp's when a DID swap is detected.
> 
> Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
> Signed-off-by: James Smart <james.smart@avagotech.com>
> ---
Reviewed-by: Hannes Reinecke <hare@suse.de>

Cheers,

Hannes
James Smart May 26, 2015, 1:36 p.m. UTC | #3
uh - we're flagging issues with in a patch explanation (such as 2 spaces 
after a period) and not something in the patch itself ??

I'm not going to revise patches for minor typos or styles disagreements 
in patch descriptions.

-- james


On 5/24/2015 3:56 PM, Sebastian Herbszt wrote:
> James Smart wrote:
>> Devices are not discovered during takeaway/giveback testing
>>
>> When a remote nport changes it's DID, a new ndlp is used.
> its
>
>> However, we left the old ndlp state unchanged and still in
>> a discovery state. The may stall discovery resulting in some
> The?
>
>> devices not being discovered.  Correct by swapping the state
> two spaces
>
>> of the 2 ndlp's when a DID swap is detected.
> Sebastian

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index 30021f3..21c4a3d 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -1509,12 +1509,14 @@  lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
 			 struct lpfc_nodelist *ndlp)
 {
 	struct lpfc_vport    *vport = ndlp->vport;
+	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
 	struct lpfc_nodelist *new_ndlp;
 	struct lpfc_rport_data *rdata;
 	struct fc_rport *rport;
 	struct serv_parm *sp;
 	uint8_t  name[sizeof(struct lpfc_name)];
 	uint32_t rc, keepDID = 0, keep_nlp_flag = 0;
+	uint16_t keep_nlp_state;
 	int  put_node;
 	int  put_rport;
 	unsigned long *active_rrqs_xri_bitmap = NULL;
@@ -1603,11 +1605,14 @@  lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
 		       ndlp->active_rrqs_xri_bitmap,
 		       phba->cfg_rrq_xri_bitmap_sz);
 
+	spin_lock_irq(shost->host_lock);
 	keep_nlp_flag = new_ndlp->nlp_flag;
 	new_ndlp->nlp_flag = ndlp->nlp_flag;
 	ndlp->nlp_flag = keep_nlp_flag;
+	spin_unlock_irq(shost->host_lock);
 
-	/* Set state will put new_ndlp on to node list if not already done */
+	/* Set nlp_states accordingly */
+	keep_nlp_state = new_ndlp->nlp_state;
 	lpfc_nlp_set_state(vport, new_ndlp, ndlp->nlp_state);
 
 	/* Move this back to NPR state */
@@ -1668,20 +1673,13 @@  lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
 			       active_rrqs_xri_bitmap,
 			       phba->cfg_rrq_xri_bitmap_sz);
 
-		/* Since we are swapping the ndlp passed in with the new one
-		 * and the did has already been swapped, copy over state.
-		 * The new WWNs are already in new_ndlp since thats what
-		 * we looked it up by in the begining of this routine.
-		 */
-		new_ndlp->nlp_state = ndlp->nlp_state;
-
-		/* Since we are switching over to the new_ndlp, the old
-		 * ndlp should be put in the NPR state, unless we have
-		 * already started re-discovery on it.
+		/* Since we are switching over to the new_ndlp,
+		 * reset the old ndlp state
 		 */
 		if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) ||
 		    (ndlp->nlp_state == NLP_STE_MAPPED_NODE))
-			lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
+			keep_nlp_state = NLP_STE_NPR_NODE;
+		lpfc_nlp_set_state(vport, ndlp, keep_nlp_state);
 
 		/* Fix up the rport accordingly */
 		rport = ndlp->rport;