On Wed, 2012-01-11 at 16:58 -0800, Roland Dreier wrote: > From: Roland Dreier <roland@xxxxxxxxxxxxxxx> > > If tgt->tgt_stop is set, current code in qla_tgt_do_work() jumps to the > exit path before setting sess, so the code > > if (sess) > __qla_tgt_sess_put(sess); > > skips the kref_put() and therefore sess is be left with an extra > reference forever. When this happens, qla_tgt_stop_phase1() waits > forever for all the sessions to go away. Fix this by making sure sess > is always set in qla_tgt_do_work(). > > Signed-off-by: Roland Dreier <roland@xxxxxxxxxxxxxxx> > --- > drivers/scsi/qla2xxx/qla_target.c | 3 +-- > 1 files changed, 1 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c > index b1ef4b1..51de953 100644 > --- a/drivers/scsi/qla2xxx/qla_target.c > +++ b/drivers/scsi/qla2xxx/qla_target.c > @@ -2955,7 +2955,7 @@ static void qla_tgt_do_work(struct work_struct *work) > scsi_qla_host_t *vha = cmd->vha; > struct qla_hw_data *ha = vha->hw; > struct qla_tgt *tgt = ha->qla_tgt; > - struct qla_tgt_sess *sess = NULL; > + struct qla_tgt_sess *sess = cmd->sess; > atio_from_isp_t *atio = &cmd->atio; > unsigned char *cdb; > unsigned long flags; > @@ -2965,7 +2965,6 @@ static void qla_tgt_do_work(struct work_struct *work) > if (tgt->tgt_stop) > goto out_term; > > - sess = cmd->sess; > if (!sess) { > uint8_t *s_id = NULL; > uint16_t loop_id = 0; A very nice catch here Roland. Applied to lio-core/qla_tgt-3.3, and will make sure this is included in the next RFC. Thanks, --nab -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html