RE: CmdSN greather than MaxCmdSN protocol error in LIO Iser

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

 



The patch does not apply to 3.12, are you patching against 3.11? The MaxCmdSN error shows up on 3.12, the 3.11 error is a different one I am still chasing.

Moussa

> -----Original Message-----
> From: target-devel-owner@xxxxxxxxxxxxxxx [mailto:target-devel-
> owner@xxxxxxxxxxxxxxx] On Behalf Of Nicholas A. Bellinger
> Sent: Tuesday, November 12, 2013 1:16 PM
> To: Moussa Ba (moussaba)
> Cc: Mike Christie; target-devel@xxxxxxxxxxxxxxx; Nicholas Bellinger; Or
> Gerlitz; linux-scsi
> Subject: Re: CmdSN greather than MaxCmdSN protocol error in LIO Iser
> 
> On Tue, 2013-11-12 at 18:18 +0000, Moussa Ba (moussaba) wrote:
> 
> <SNIP>
> 
> > > >
> > > > Or to put it another way: what is preventing iscsi_data_xmit()
> from
> > > > completely draining both conn->cmdqueue + conn->requeue, even
> when
> > > the
> > > > CmdSN window has potentially been closed again..?
> > > >
> > >
> > > If the window was not big enough we would have not accepted the cmd
> > > from
> > > scsi-ml in iscsi_queuecommand. We would have never put it on the
> list
> > > above then.
> > >
> > > In the initiator we have:
> > >
> > > session->queued_cmdsn - It will always be less than or equal to the
> > > max_cmdsn, but greater than or equal to session->cmdsn. Think of it
> > > like
> > > preallocating the sn we are going to give the cmd. Depending on
> > > ordering
> > > it might be different (3 instead of 4), but the final value it gets
> > > will
> > > be less than the max_cmdsn.
> > >
> > > session->cmdsn - the sn we give the cmd when we actually put it on
> the
> > > wire. It is always less than or equal to queued_cmdsn.
> > >
> > > So we have cmdsn <= queued_cmdsn <= max_cmdsn.
> > >
> > > The iscsi_queuecommand window check makes sure we will only have
> put a
> > > cmd on the cmdqueue list if queued_cmdsn was less than or equal to
> the
> > > max_cmdsn. And cmdsn is less than or equal to queued_cmdsn, so we
> can
> > > run iscsi_data_xmit without checking the window values again,
> because
> > > it
> > > is not possible for something like max_cmdsn to decrease on us.
> >
> >
> >
> > I am attaching error codes on the inititator that seem to coincide
> with the timeout errors.
> >
> > [  261.855254]  connection6:0: pdu (op 0x65 itt 0x1) rejected. Reason
> code 0x4
> > [  261.855266]  connection6:0: pdu (op 0xa itt 0x1) rejected. Reason
> code 0x4
> > [  261.855268]  connection6:0: pdu (op 0x51 itt 0x1) rejected. Reason
> code 0x4
> >
> >
> 
> Hi Moussa,
> 
> After a bit more review, there may be a scenario introduced with v3.10
> code that could cause something like the reported CmdSN > MaxCmdSN
> error
> to occur..
> 
> Care to attempt to reproduce with the following target patch..?
> 
> Thanks,
> 
> --nab
> 
> diff --git a/drivers/infiniband/ulp/isert/ib_isert.c
> b/drivers/infiniband/ulp/isert/ib_isert.c
> index bbd86e8..5661075 100644
> --- a/drivers/infiniband/ulp/isert/ib_isert.c
> +++ b/drivers/infiniband/ulp/isert/ib_isert.c
> @@ -2029,8 +2029,6 @@ isert_map_rdma(struct iscsi_conn *conn, struct
> iscsi_cmd *cmd,
> 
>         if (wr->iser_ib_op == ISER_IB_RDMA_WRITE) {
>                 data_left = se_cmd->data_length;
> -               iscsit_increment_maxcmdsn(cmd, conn->sess);
> -               cmd->stat_sn = conn->stat_sn++;
>         } else {
>                 sg_off = cmd->write_data_done / PAGE_SIZE;
>                 data_left = se_cmd->data_length - cmd->write_data_done;
> @@ -2242,8 +2240,6 @@ isert_reg_rdma_frwr(struct iscsi_conn *conn,
> struct iscsi_cmd *cmd,
> 
>         if (wr->iser_ib_op == ISER_IB_RDMA_WRITE) {
>                 data_left = se_cmd->data_length;
> -               iscsit_increment_maxcmdsn(cmd, conn->sess);
> -               cmd->stat_sn = conn->stat_sn++;
>         } else {
>                 sg_off = cmd->write_data_done / PAGE_SIZE;
>                 data_left = se_cmd->data_length - cmd->write_data_done;
> @@ -2352,7 +2348,7 @@ isert_put_datain(struct iscsi_conn *conn, struct
> iscsi_cmd *cmd)
>          * Build isert_conn->tx_desc for iSCSI response PDU and attach
>          */
>         isert_create_send_desc(isert_conn, isert_cmd, &isert_cmd-
> >tx_desc);
> -       iscsit_build_rsp_pdu(cmd, conn, false, (struct iscsi_scsi_rsp
> *)
> +       iscsit_build_rsp_pdu(cmd, conn, true, (struct iscsi_scsi_rsp *)
>                              &isert_cmd->tx_desc.iscsi_header);
>         isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
>         isert_init_send_wr(isert_conn, isert_cmd,
> diff --git a/drivers/target/iscsi/iscsi_target_configfs.c
> b/drivers/target/iscsi/iscsi_target_config
> index 1eec37c..fde3624 100644
> --- a/drivers/target/iscsi/iscsi_target_configfs.c
> +++ b/drivers/target/iscsi/iscsi_target_configfs.c
> @@ -1790,6 +1790,11 @@ static int lio_queue_status(struct se_cmd
> *se_cmd)
>         struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd,
> se_cmd);
> 
>         cmd->i_state = ISTATE_SEND_STATUS;
> +
> +       if (cmd->se_cmd.scsi_status || cmd->sense_reason) {
> +               iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd-
> >i_state);
> +               return 0;
> +       }
>         cmd->conn->conn_transport->iscsit_queue_status(cmd->conn, cmd);
> 
>         return 0;
> diff --git a/drivers/target/iscsi/iscsi_target_device.c
> b/drivers/target/iscsi/iscsi_target_device.c
> index 6c7a510..7087c73 100644
> --- a/drivers/target/iscsi/iscsi_target_device.c
> +++ b/drivers/target/iscsi/iscsi_target_device.c
> @@ -58,11 +58,7 @@ void iscsit_increment_maxcmdsn(struct iscsi_cmd
> *cmd, struct iscsi_session *sess
> 
>         cmd->maxcmdsn_inc = 1;
> 
> -       if (!mutex_trylock(&sess->cmdsn_mutex)) {
> -               sess->max_cmd_sn += 1;
> -               pr_debug("Updated MaxCmdSN to 0x%08x\n", sess-
> >max_cmd_sn);
> -               return;
> -       }
> +       mutex_lock(&sess->cmdsn_mutex);
>         sess->max_cmd_sn += 1;
>         pr_debug("Updated MaxCmdSN to 0x%08x\n", sess->max_cmd_sn);
>         mutex_unlock(&sess->cmdsn_mutex);
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe target-devel"
> in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
��.n��������+%������w��{.n�����{������ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f





[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