aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Malygin <m.malygin@yadro.com>2018-06-13 09:05:57 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2018-06-18 21:02:52 -0400
commit49d7bd36813ea8e6b4c97b640d24e7fbd44c84f0 (patch)
tree1676d8d8eb3df82368ed519aca42498992200e6c
parentf2233a33dc1fef4aa30dc11e4c676637bf358c3d (diff)
scsi: qla2xxx: Spinlock recursion in qla_target
The patch reverts changes done in qlt_schedule_sess_for_deletion() to avoid spinlock recursion sess->vha->work_lock should be used instead of ha->tgt.sess_lock, that can be locked in callers: qlt_reset() or qlt_handle_login() [mkp: roll in build warning reported by sfr] Fixes: 1c6cacf4ea6c04 ("scsi: qla2xxx: Fixup locking for session deletion") Cc: <stable@vger.kernel.org> #v4.17 Signed-off-by: Mikhail Malygin <m.malygin@yadro.com> Reported-by: Mikhail Malygin <m.malygin@yadro.com> Tested-by: Mikhail Malygin <m.malygin@yadro.com> Acked-by: Himanshu Madhani <himanshu.madhani@cavium.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/qla2xxx/qla_target.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index 0fea2e2326be..1027b0cb7fa3 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1224,7 +1224,6 @@ static void qla24xx_chk_fcp_state(struct fc_port *sess)
1224void qlt_schedule_sess_for_deletion(struct fc_port *sess) 1224void qlt_schedule_sess_for_deletion(struct fc_port *sess)
1225{ 1225{
1226 struct qla_tgt *tgt = sess->tgt; 1226 struct qla_tgt *tgt = sess->tgt;
1227 struct qla_hw_data *ha = sess->vha->hw;
1228 unsigned long flags; 1227 unsigned long flags;
1229 1228
1230 if (sess->disc_state == DSC_DELETE_PEND) 1229 if (sess->disc_state == DSC_DELETE_PEND)
@@ -1241,16 +1240,16 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess)
1241 return; 1240 return;
1242 } 1241 }
1243 1242
1244 spin_lock_irqsave(&ha->tgt.sess_lock, flags);
1245 if (sess->deleted == QLA_SESS_DELETED) 1243 if (sess->deleted == QLA_SESS_DELETED)
1246 sess->logout_on_delete = 0; 1244 sess->logout_on_delete = 0;
1247 1245
1246 spin_lock_irqsave(&sess->vha->work_lock, flags);
1248 if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) { 1247 if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
1249 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); 1248 spin_unlock_irqrestore(&sess->vha->work_lock, flags);
1250 return; 1249 return;
1251 } 1250 }
1252 sess->deleted = QLA_SESS_DELETION_IN_PROGRESS; 1251 sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
1253 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); 1252 spin_unlock_irqrestore(&sess->vha->work_lock, flags);
1254 1253
1255 sess->disc_state = DSC_DELETE_PEND; 1254 sess->disc_state = DSC_DELETE_PEND;
1256 1255