diff options
| author | Mikhail Malygin <m.malygin@yadro.com> | 2018-06-13 09:05:57 -0400 |
|---|---|---|
| committer | Martin K. Petersen <martin.petersen@oracle.com> | 2018-06-18 21:02:52 -0400 |
| commit | 49d7bd36813ea8e6b4c97b640d24e7fbd44c84f0 (patch) | |
| tree | 1676d8d8eb3df82368ed519aca42498992200e6c | |
| parent | f2233a33dc1fef4aa30dc11e4c676637bf358c3d (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.c | 7 |
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) | |||
| 1224 | void qlt_schedule_sess_for_deletion(struct fc_port *sess) | 1224 | void 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 | ||
