Re: [PATCH] Move debug messages before sending srb preventing panic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Bill,

On 2/14/19, 7:52 AM, "Bill Kuzeja" <William.Kuzeja@xxxxxxxxxxx> wrote:

    External Email
    
    When sending an srb with qla2x00_start_sp, the sp can complete and be
    freed by the time we log the debug message saying we sent it. This can
    cause a panic if sp gets reused quickly or when running a kernel that
    poisons freed memory.
    
    This was partially fixed by (not every case was addressed):
    
    commit 9fe278f44b4b ("scsi: qla2xxx: Move log messages before issuing command to firmware")
    
    Signed-off-by: Bill Kuzeja <william.kuzeja@xxxxxxxxxxx>
    ---
     drivers/scsi/qla2xxx/qla_gs.c     | 66 ++++++++++++++++++++++-----------------
     drivers/scsi/qla2xxx/qla_init.c   | 26 ++++++++-------
     drivers/scsi/qla2xxx/qla_target.c |  8 ++---
     3 files changed, 55 insertions(+), 45 deletions(-)
    
    diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
    index cbc3bc4..b19185a 100644
    --- a/drivers/scsi/qla2xxx/qla_gs.c
    +++ b/drivers/scsi/qla2xxx/qla_gs.c
    @@ -657,15 +657,16 @@ static int qla_async_rftid(scsi_qla_host_t *vha, port_id_t *d_id)
            sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout;
            sp->done = qla2x00_async_sns_sp_done;
    
    +       ql_dbg(ql_dbg_disc, vha, 0xffff,
    +           "Async-%s - hdl=%x portid %06x.\n",
    +           sp->name, sp->handle, d_id->b24);
    +
            rval = qla2x00_start_sp(sp);
            if (rval != QLA_SUCCESS) {
                    ql_dbg(ql_dbg_disc, vha, 0x2043,
                        "RFT_ID issue IOCB failed (%d).\n", rval);
                    goto done_free_sp;
            }
    -       ql_dbg(ql_dbg_disc, vha, 0xffff,
    -           "Async-%s - hdl=%x portid %06x.\n",
    -           sp->name, sp->handle, d_id->b24);
            return rval;
     done_free_sp:
            sp->free(sp);
    @@ -752,6 +753,10 @@ static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id,
            sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout;
            sp->done = qla2x00_async_sns_sp_done;
    
    +       ql_dbg(ql_dbg_disc, vha, 0xffff,
    +           "Async-%s - hdl=%x portid %06x feature %x type %x.\n",
    +           sp->name, sp->handle, d_id->b24, fc4feature, fc4type);
    +
            rval = qla2x00_start_sp(sp);
            if (rval != QLA_SUCCESS) {
                    ql_dbg(ql_dbg_disc, vha, 0x2047,
    @@ -759,9 +764,6 @@ static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id,
                    goto done_free_sp;
            }
    
    -       ql_dbg(ql_dbg_disc, vha, 0xffff,
    -           "Async-%s - hdl=%x portid %06x feature %x type %x.\n",
    -           sp->name, sp->handle, d_id->b24, fc4feature, fc4type);
            return rval;
    
     done_free_sp:
    @@ -844,15 +846,16 @@ static int qla_async_rnnid(scsi_qla_host_t *vha, port_id_t *d_id,
            sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout;
            sp->done = qla2x00_async_sns_sp_done;
    
    +       ql_dbg(ql_dbg_disc, vha, 0xffff,
    +           "Async-%s - hdl=%x portid %06x\n",
    +           sp->name, sp->handle, d_id->b24);
    +
            rval = qla2x00_start_sp(sp);
            if (rval != QLA_SUCCESS) {
                    ql_dbg(ql_dbg_disc, vha, 0x204d,
                        "RNN_ID issue IOCB failed (%d).\n", rval);
                    goto done_free_sp;
            }
    -       ql_dbg(ql_dbg_disc, vha, 0xffff,
    -           "Async-%s - hdl=%x portid %06x\n",
    -           sp->name, sp->handle, d_id->b24);
    
            return rval;
    
    @@ -957,15 +960,16 @@ static int qla_async_rsnn_nn(scsi_qla_host_t *vha)
            sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout;
            sp->done = qla2x00_async_sns_sp_done;
    
    +       ql_dbg(ql_dbg_disc, vha, 0xffff,
    +           "Async-%s - hdl=%x.\n",
    +           sp->name, sp->handle);
    +
            rval = qla2x00_start_sp(sp);
            if (rval != QLA_SUCCESS) {
                    ql_dbg(ql_dbg_disc, vha, 0x2043,
                        "RFT_ID issue IOCB failed (%d).\n", rval);
                    goto done_free_sp;
            }
    -       ql_dbg(ql_dbg_disc, vha, 0xffff,
    -           "Async-%s - hdl=%x.\n",
    -           sp->name, sp->handle);
    
            return rval;
    
    @@ -3578,14 +3582,14 @@ int qla24xx_async_gffid(scsi_qla_host_t *vha, fc_port_t *fcport)
    
            sp->done = qla24xx_async_gffid_sp_done;
    
    -       rval = qla2x00_start_sp(sp);
    -       if (rval != QLA_SUCCESS)
    -               goto done_free_sp;
    -
            ql_dbg(ql_dbg_disc, vha, 0x2132,
                "Async-%s hdl=%x  %8phC.\n", sp->name,
                sp->handle, fcport->port_name);
    
    +       rval = qla2x00_start_sp(sp);
    +       if (rval != QLA_SUCCESS)
    +               goto done_free_sp;
    +
            return rval;
     done_free_sp:
            sp->free(sp);
    @@ -4067,6 +4071,10 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, struct srb *sp,
    
            sp->done = qla2x00_async_gpnft_gnnft_sp_done;
    
    +       ql_dbg(ql_dbg_disc, vha, 0xffff,
    +           "Async-%s hdl=%x FC4Type %x.\n", sp->name,
    +           sp->handle, ct_req->req.gpn_ft.port_type);
    +
            rval = qla2x00_start_sp(sp);
            if (rval != QLA_SUCCESS) {
                    spin_lock_irqsave(&vha->work_lock, flags);
    @@ -4075,9 +4083,6 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, struct srb *sp,
                    goto done_free_sp;
            }
    
    -       ql_dbg(ql_dbg_disc, vha, 0xffff,
    -           "Async-%s hdl=%x FC4Type %x.\n", sp->name,
    -           sp->handle, ct_req->req.gpn_ft.port_type);
            return rval;
    
     done_free_sp:
    @@ -4214,6 +4219,10 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
    
            sp->done = qla2x00_async_gpnft_gnnft_sp_done;
    
    +       ql_dbg(ql_dbg_disc, vha, 0xffff,
    +           "Async-%s hdl=%x FC4Type %x.\n", sp->name,
    +           sp->handle, ct_req->req.gpn_ft.port_type);
    +
            rval = qla2x00_start_sp(sp);
            if (rval != QLA_SUCCESS) {
                    spin_lock_irqsave(&vha->work_lock, flags);
    @@ -4222,9 +4231,6 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
                    goto done_free_sp;
            }
    
    -       ql_dbg(ql_dbg_disc, vha, 0xffff,
    -           "Async-%s hdl=%x FC4Type %x.\n", sp->name,
    -           sp->handle, ct_req->req.gpn_ft.port_type);
            return rval;
    
     done_free_sp:
    @@ -4345,13 +4351,14 @@ int qla24xx_async_gnnid(scsi_qla_host_t *vha, fc_port_t *fcport)
    
            sp->done = qla2x00_async_gnnid_sp_done;
    
    -       rval = qla2x00_start_sp(sp);
    -       if (rval != QLA_SUCCESS)
    -               goto done_free_sp;
            ql_dbg(ql_dbg_disc, vha, 0xffff,
                "Async-%s - %8phC hdl=%x loopid=%x portid %06x.\n",
                sp->name, fcport->port_name,
                sp->handle, fcport->loop_id, fcport->d_id.b24);
    +
    +       rval = qla2x00_start_sp(sp);
    +       if (rval != QLA_SUCCESS)
    +               goto done_free_sp;
            return rval;
    
     done_free_sp:
    @@ -4475,14 +4482,15 @@ int qla24xx_async_gfpnid(scsi_qla_host_t *vha, fc_port_t *fcport)
    
            sp->done = qla2x00_async_gfpnid_sp_done;
    
    -       rval = qla2x00_start_sp(sp);
    -       if (rval != QLA_SUCCESS)
    -               goto done_free_sp;
    -
            ql_dbg(ql_dbg_disc, vha, 0xffff,
                "Async-%s - %8phC hdl=%x loopid=%x portid %06x.\n",
                sp->name, fcport->port_name,
                sp->handle, fcport->loop_id, fcport->d_id.b24);
    +
    +       rval = qla2x00_start_sp(sp);
    +       if (rval != QLA_SUCCESS)
    +               goto done_free_sp;
    +
            return rval;
    
     done_free_sp:
    diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
    index aeeb014..1ad85ee 100644
    --- a/drivers/scsi/qla2xxx/qla_init.c
    +++ b/drivers/scsi/qla2xxx/qla_init.c
    @@ -366,14 +366,16 @@ static void qla24xx_handle_prli_done_event(struct scsi_qla_host *,
            qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
    
            sp->done = qla2x00_async_prlo_sp_done;
    -       rval = qla2x00_start_sp(sp);
    -       if (rval != QLA_SUCCESS)
    -               goto done_free_sp;
    
            ql_dbg(ql_dbg_disc, vha, 0x2070,
                "Async-prlo - hdl=%x loop-id=%x portid=%02x%02x%02x.\n",
                sp->handle, fcport->loop_id, fcport->d_id.b.domain,
                fcport->d_id.b.area, fcport->d_id.b.al_pa);
    +
    +       rval = qla2x00_start_sp(sp);
    +       if (rval != QLA_SUCCESS)
    +               goto done_free_sp;
    +
            return rval;
    
     done_free_sp:
    @@ -931,14 +933,14 @@ int qla24xx_async_gnl(struct scsi_qla_host *vha, fc_port_t *fcport)
    
            sp->done = qla24xx_async_gnl_sp_done;
    
    -       rval = qla2x00_start_sp(sp);
    -       if (rval != QLA_SUCCESS)
    -               goto done_free_sp;
    -
            ql_dbg(ql_dbg_disc, vha, 0x20da,
                "Async-%s - OUT WWPN %8phC hndl %x\n",
                sp->name, fcport->port_name, sp->handle);
    
    +       rval = qla2x00_start_sp(sp);
    +       if (rval != QLA_SUCCESS)
    +               goto done_free_sp;
    +
            return rval;
    
     done_free_sp:
    @@ -1072,6 +1074,11 @@ static int qla24xx_post_prli_work(struct scsi_qla_host *vha, fc_port_t *fcport)
            if  (fcport->fc4f_nvme)
                    lio->u.logio.flags |= SRB_LOGIN_NVME_PRLI;
    
    +       ql_dbg(ql_dbg_disc, vha, 0x211b,
    +           "Async-prli - %8phC hdl=%x, loopid=%x portid=%06x retries=%d %s.\n",
    +           fcport->port_name, sp->handle, fcport->loop_id, fcport->d_id.b24,
    +           fcport->login_retry, fcport->fc4f_nvme ? "nvme" : "fc");
    +
            rval = qla2x00_start_sp(sp);
            if (rval != QLA_SUCCESS) {
                    fcport->flags |= FCF_LOGIN_NEEDED;
    @@ -1079,11 +1086,6 @@ static int qla24xx_post_prli_work(struct scsi_qla_host *vha, fc_port_t *fcport)
                    goto done_free_sp;
            }
    
    -       ql_dbg(ql_dbg_disc, vha, 0x211b,
    -           "Async-prli - %8phC hdl=%x, loopid=%x portid=%06x retries=%d %s.\n",
    -           fcport->port_name, sp->handle, fcport->loop_id, fcport->d_id.b24,
    -           fcport->login_retry, fcport->fc4f_nvme ? "nvme" : "fc");
    -
            return rval;
    
     done_free_sp:
    diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
    index 510337e..c21d55d 100644
    --- a/drivers/scsi/qla2xxx/qla_target.c
    +++ b/drivers/scsi/qla2xxx/qla_target.c
    @@ -660,14 +660,14 @@ int qla24xx_async_notify_ack(scsi_qla_host_t *vha, fc_port_t *fcport,
            sp->u.iocb_cmd.u.nack.ntfy = ntfy;
            sp->done = qla2x00_async_nack_sp_done;
    
    -       rval = qla2x00_start_sp(sp);
    -       if (rval != QLA_SUCCESS)
    -               goto done_free_sp;
    -
            ql_dbg(ql_dbg_disc, vha, 0x20f4,
                "Async-%s %8phC hndl %x %s\n",
                sp->name, fcport->port_name, sp->handle, c);
    
    +       rval = qla2x00_start_sp(sp);
    +       if (rval != QLA_SUCCESS)
    +               goto done_free_sp;
    +
            return rval;
    
     done_free_sp:
    --
    1.8.3.1
    
Thanks for the patch.  Looks good. 

Acked-By: Himanshu Madhani <hmadhani@xxxxxxxxxxx>





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux