lkml.org 
[lkml]   [2018]   [Jul]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.17 137/220] scsi: qla2xxx: Spinlock recursion in qla_target
    Date
    4.17-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mikhail Malygin <m.malygin@yadro.com>

    commit 49d7bd36813ea8e6b4c97b640d24e7fbd44c84f0 upstream.

    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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/scsi/qla2xxx/qla_target.c | 7 +++----
    1 file changed, 3 insertions(+), 4 deletions(-)

    --- a/drivers/scsi/qla2xxx/qla_target.c
    +++ b/drivers/scsi/qla2xxx/qla_target.c
    @@ -1230,7 +1230,6 @@ static void qla24xx_chk_fcp_state(struct
    void qlt_schedule_sess_for_deletion(struct fc_port *sess)
    {
    struct qla_tgt *tgt = sess->tgt;
    - struct qla_hw_data *ha = sess->vha->hw;
    unsigned long flags;

    if (sess->disc_state == DSC_DELETE_PEND)
    @@ -1247,16 +1246,16 @@ void qlt_schedule_sess_for_deletion(stru
    return;
    }

    - spin_lock_irqsave(&ha->tgt.sess_lock, flags);
    if (sess->deleted == QLA_SESS_DELETED)
    sess->logout_on_delete = 0;

    + spin_lock_irqsave(&sess->vha->work_lock, flags);
    if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
    - spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
    + spin_unlock_irqrestore(&sess->vha->work_lock, flags);
    return;
    }
    sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
    - spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
    + spin_unlock_irqrestore(&sess->vha->work_lock, flags);

    sess->disc_state = DSC_DELETE_PEND;


    \
     
     \ /
      Last update: 2018-07-01 19:05    [W:4.139 / U:1.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site