[stgt] [PATCH] Add residual handling for WRITE6/10/12/16 and WRITEVERIFY10/12/16

ronnie sahlberg ronniesahlberg at gmail.com
Sat Mar 30 16:19:07 CET 2013


ping?

On Sun, Mar 24, 2013 at 3:38 PM, Ronnie Sahlberg
<ronniesahlberg at gmail.com> wrote:
> This patch adds proper residual handling and reporting for the WRITE and
> WRITEVERIFY commands.
> In addition to setting the residual, for the case of underflow we have
> to clamp the DATA-IN buffer so that the bs-backends will not write
> more than what is specified in the SCSI TL.
>
> Tests for these conditions are availabel in the libiscsi testsuite.
>
> Test for WRITE10 follows :
> $ ./bin/iscsi-test-cu -t "TestWrite10.testWrite10Residuals" iscsi://127.0.0.1/iqn.ronnie.test/1 -V --dataloss
>
>      CUnit - A Unit testing framework for C - Version 2.1-0
>      http://cunit.sourceforge.net/
>
> Suite: TestWrite10
>   Test: testWrite10Residuals ...
>     Test WRITE10 commands with residuals
>     Block size is 512
>     Try writing one block but with iSCSI expected transfer length==0
>     Verify that the target returned SUCCESS
>     Verify residual overflow flag is set
>     Verify we got 512 bytes of residual overflow
>     Try writing one block but with iSCSI expected transfer length==10000
>     Verify that the target returned SUCCESS
>     Verify residual underflow flag is set
>     Verify we got 9488 bytes of residual underflow
>     Try writing one block but with iSCSI expected transfer length==200
>     Verify that the target returned SUCCESS
>     Verify residual overflow flag is set
>     Verify we got 312 bytes of residual overflow
>     Try writing two blocks but iSCSI expected transfer length==512 (==one block)
>     Verify that the target returned SUCCESS
>     Verify residual overflow flag is set
>     Verify we got one block of residual overflow
>     Verify that if iSCSI EDTL > SCSI TL then we only write SCSI TL amount of data
>     Write two blocks of 'a'
>     Send WRITE10 LBA:0 blocks:2 wrprotect:0 dpo:0 fua:0 fua_nv:0 group:0
>     [OK] WRITE10 returned SUCCESS.
>     Write one block of 'b' but set iSCSI EDTL to 2 blocks.
>     Verify that the target returned SUCCESS
>     Verify residual underflow flag is set
>     Verify we got one block of residual underflow
>     Read the two blocks
>     Send READ10 LBA:0 blocks:2 rdprotect:0 dpo:0 fua:0 fua_nv:0 group:0
>     [OK] READ10 returned SUCCESS.
>     Verify that the first block was changed to 'b'
>     Verify that the second block was NOT overwritten and still contains 'a'
>     Verify that if iSCSI EDTL < SCSI TL then we only write iSCSI EDTL amount of data
>     Write two blocks of 'a'
>     Send WRITE10 LBA:0 blocks:2 wrprotect:0 dpo:0 fua:0 fua_nv:0 group:0
>     [OK] WRITE10 returned SUCCESS.
>     Write two blocks of 'b' but set iSCSI EDTL to 1 blocks.
>     Verify that the target returned SUCCESS
>     Verify residual overflow flag is set
>     Verify we got one block of residual overflow
>     Read the two blocks
>     Send READ10 LBA:0 blocks:2 rdprotect:0 dpo:0 fua:0 fua_nv:0 group:0
>     [OK] READ10 returned SUCCESS.
>     Verify that the first block was changed to 'b'
>     Verify that the second block was NOT overwritten and still contains 'a'
> passed
>
> --Run Summary: Type      Total     Ran  Passed  Failed
>                suites        1       1     n/a       0
>                tests         1       1       1       0
>                asserts      35      35      35       0
> Tests completed with return value: 0
>
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
> ---
>  usr/sbc.c |   19 +++++++++++++++++++
>  1 files changed, 19 insertions(+), 0 deletions(-)
>
> diff --git a/usr/sbc.c b/usr/sbc.c
> index 12808fd..1f50191 100644
> --- a/usr/sbc.c
> +++ b/usr/sbc.c
> @@ -344,6 +344,25 @@ static int sbc_rw(int host_no, struct scsi_cmd *cmd)
>                 if (cmd->tl != scsi_get_in_length(cmd))
>                         scsi_set_in_resid_by_actual(cmd, cmd->tl);
>                 break;
> +       case WRITE_6:
> +       case WRITE_10:
> +       case WRITE_12:
> +       case WRITE_16:
> +       case WRITE_VERIFY:
> +       case WRITE_VERIFY_12:
> +       case WRITE_VERIFY_16:
> +               if (cmd->tl != scsi_get_out_length(cmd)) {
> +                       scsi_set_out_resid_by_actual(cmd, cmd->tl);
> +
> +                       /* We need to clamp the size of the in-buffer
> +                        * so that we dont try to write > cmd->tl in the
> +                        * backend store.
> +                        */
> +                       if (cmd->tl < scsi_get_out_length(cmd)) {
> +                               scsi_set_out_length(cmd, cmd->tl);
> +                       }
> +               }
> +               break;
>         }
>
>         ret = cmd->dev->bst->bs_cmd_submit(cmd);
> --
> 1.7.3.1
>
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list