qla2xxx: Wait for all conflicts before ack'ing PLOGI
Until now ack'ing of a new PLOGI has only been delayed if there was an existing session for the same WWN. Ack was released when the session deletion completed. If there was another WWN session with the same fc_id/loop_id pair (aka "conflicting session"), PLOGI was still ack'ed immediately. This potentially caused a problem when old session deletion logged fc_id/loop_id out of FW after new session has been established. Two work-arounds were attempted before: 1. Dropping PLOGIs until conflicting session goes away. 2. Detecting initiator being logged out of FW and issuing LOGO to force re-login. This patch introduces proper solution to the problem where PLOGI is held until either existing session with same WWN or any conflicting session goes away. Mechanism supports one session holding two PLOGI acks as well as one PLOGI ack being held by many sessions. Signed-off-by: Alexei Potashnik <alexei@purestorage.com> Acked-by: Quinn Tran <quinn.tran@qlogic.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
committed by
Nicholas Bellinger
parent
71cdc07964
commit
b7bd104e6f
@@ -896,6 +896,19 @@ enum qla_sess_deletion {
|
||||
QLA_SESS_DELETION_IN_PROGRESS = 2,
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
QLT_PLOGI_LINK_SAME_WWN,
|
||||
QLT_PLOGI_LINK_CONFLICT,
|
||||
QLT_PLOGI_LINK_MAX
|
||||
} qlt_plogi_link_t;
|
||||
|
||||
typedef struct {
|
||||
struct list_head list;
|
||||
struct imm_ntfy_from_isp iocb;
|
||||
port_id_t id;
|
||||
int ref_count;
|
||||
} qlt_plogi_ack_t;
|
||||
|
||||
/*
|
||||
* Equivilant to IT Nexus (Initiator-Target)
|
||||
*/
|
||||
@@ -907,7 +920,6 @@ struct qla_tgt_sess {
|
||||
unsigned int deleted:2;
|
||||
unsigned int local:1;
|
||||
unsigned int logout_on_delete:1;
|
||||
unsigned int plogi_ack_needed:1;
|
||||
unsigned int keep_nport_handle:1;
|
||||
unsigned int send_els_logo:1;
|
||||
|
||||
@@ -926,9 +938,7 @@ struct qla_tgt_sess {
|
||||
uint8_t port_name[WWN_SIZE];
|
||||
struct work_struct free_work;
|
||||
|
||||
union {
|
||||
struct imm_ntfy_from_isp tm_iocb;
|
||||
};
|
||||
qlt_plogi_ack_t *plogi_link[QLT_PLOGI_LINK_MAX];
|
||||
};
|
||||
|
||||
struct qla_tgt_cmd {
|
||||
|
||||
Reference in New Issue
Block a user