diff options
author | Quinn Tran <quinn.tran@cavium.com> | 2018-07-18 17:29:52 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2018-07-19 22:02:33 -0400 |
commit | efa93f48fa9d423fda166bc3b6c0cbb09682492e (patch) | |
tree | bc77793248d63c06444efbdaeebdfdf80a47f9d6 | |
parent | e3dde080ebbdbb4bda8eee35d770714fee8c59ac (diff) |
scsi: qla2xxx: Fix NPIV deletion by calling wait_for_sess_deletion
Add wait for session deletion to finish before freeing an NPIV scsi host.
Fixes: 726b85487067 ("qla2xxx: Add framework for async fabric discovery")
Cc: <stable@vger.kernel.org>
Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 1 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 1 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mid.c | 5 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 2 |
4 files changed, 8 insertions, 1 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 89a4999fa631..c8731568f9c4 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -2141,6 +2141,7 @@ qla24xx_vport_delete(struct fc_vport *fc_vport) | |||
2141 | msleep(1000); | 2141 | msleep(1000); |
2142 | 2142 | ||
2143 | qla24xx_disable_vp(vha); | 2143 | qla24xx_disable_vp(vha); |
2144 | qla2x00_wait_for_sess_deletion(vha); | ||
2144 | 2145 | ||
2145 | vha->flags.delete_progress = 1; | 2146 | vha->flags.delete_progress = 1; |
2146 | 2147 | ||
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index f68eb6096559..2660a48d918a 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -214,6 +214,7 @@ void qla2x00_handle_login_done_event(struct scsi_qla_host *, fc_port_t *, | |||
214 | int qla24xx_post_gnl_work(struct scsi_qla_host *, fc_port_t *); | 214 | int qla24xx_post_gnl_work(struct scsi_qla_host *, fc_port_t *); |
215 | int qla24xx_async_abort_cmd(srb_t *); | 215 | int qla24xx_async_abort_cmd(srb_t *); |
216 | int qla24xx_post_relogin_work(struct scsi_qla_host *vha); | 216 | int qla24xx_post_relogin_work(struct scsi_qla_host *vha); |
217 | void qla2x00_wait_for_sess_deletion(scsi_qla_host_t *); | ||
217 | 218 | ||
218 | /* | 219 | /* |
219 | * Global Functions in qla_mid.c source file. | 220 | * Global Functions in qla_mid.c source file. |
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index f6f0a759a7c2..2c1aaf9b7a00 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
@@ -153,10 +153,15 @@ qla24xx_disable_vp(scsi_qla_host_t *vha) | |||
153 | { | 153 | { |
154 | unsigned long flags; | 154 | unsigned long flags; |
155 | int ret; | 155 | int ret; |
156 | fc_port_t *fcport; | ||
156 | 157 | ||
157 | ret = qla24xx_control_vp(vha, VCE_COMMAND_DISABLE_VPS_LOGO_ALL); | 158 | ret = qla24xx_control_vp(vha, VCE_COMMAND_DISABLE_VPS_LOGO_ALL); |
158 | atomic_set(&vha->loop_state, LOOP_DOWN); | 159 | atomic_set(&vha->loop_state, LOOP_DOWN); |
159 | atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); | 160 | atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); |
161 | list_for_each_entry(fcport, &vha->vp_fcports, list) | ||
162 | fcport->logout_on_delete = 0; | ||
163 | |||
164 | qla2x00_mark_all_devices_lost(vha, 0); | ||
160 | 165 | ||
161 | /* Remove port id from vp target map */ | 166 | /* Remove port id from vp target map */ |
162 | spin_lock_irqsave(&vha->hw->hardware_lock, flags); | 167 | spin_lock_irqsave(&vha->hw->hardware_lock, flags); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 9f309e572be4..acc27808963c 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -1147,7 +1147,7 @@ static inline int test_fcport_count(scsi_qla_host_t *vha) | |||
1147 | * qla2x00_wait_for_sess_deletion can only be called from remove_one. | 1147 | * qla2x00_wait_for_sess_deletion can only be called from remove_one. |
1148 | * it has dependency on UNLOADING flag to stop device discovery | 1148 | * it has dependency on UNLOADING flag to stop device discovery |
1149 | */ | 1149 | */ |
1150 | static void | 1150 | void |
1151 | qla2x00_wait_for_sess_deletion(scsi_qla_host_t *vha) | 1151 | qla2x00_wait_for_sess_deletion(scsi_qla_host_t *vha) |
1152 | { | 1152 | { |
1153 | qla2x00_mark_all_devices_lost(vha, 0); | 1153 | qla2x00_mark_all_devices_lost(vha, 0); |