[Stgt-devel] Stability problem

ronnie sahlberg ronniesahlberg
Tue May 27 10:26:50 CEST 2008


Hi,

Im not Konrad but I tried your
> http://stgt.berlios.de/releases/tgt-20080526-debug.tar.bz2
and tgtd does not crash on my system any more when I send a manually
"probe how big the page actually is"
mode sense 10 to tgtd any more.


I have positively verified with a specially constructed tool that tgtd
no longer crashes for these mode sense commands.


please apply your patch.


ronnie sahlberg


On Mon, May 26, 2008 at 10:36 PM, FUJITA Tomonori
<fujita.tomonori at lab.ntt.co.jp> wrote:
> On Thu, 15 May 2008 15:37:02 +0200
> Konrad Bechler <kbechler at bakertillypoland.eu> wrote:
>
>> Hello,
>>
>> I've got small, testing environment. I use Fedora 7 with
>> 2.6.23.15-80.fc7 as a iSCSI target and Windows XP box with "Microsoft
>> iSCSI Initiator" as a initiator.
>> I configured stgt with only one target and one LUN:
>> Target 1: iqn.2008.05.eu.tgc.net:storage.disk1
>>      System information:
>>          Driver: iscsi
>>          State: ready
>>      I_T nexus information:
>>      LUN information:
>>          LUN: 0
>>              Type: controller
>>              SCSI ID: deadbeaf1:0
>>              SCSI SN: beaf10
>>              Size: 0 MB
>>              Online: Yes
>>              Removable media: No
>>              Backing store: No backing store
>>          LUN: 1
>>              Type: disk
>>              SCSI ID: deadbeaf1:1
>>              SCSI SN: beaf11
>>              Size: 10486 MB
>>              Online: Yes
>>              Removable media: No
>>              Backing store: /data/disk1
>>      Account information:
>>      ACL information:
>>          ALL
>>
>>
>> I can connect to this target. But when trying to format such drive, I've
>> got message, that formatting exited with error. When "quick format" box
>> is checked, tgtd aborts.
>
> Last week, Konrad helped me to figure out what's the problem. Seems
> that the MODE_SENSE data corruption leads to this, which Ronnie
> reported in another thread.
>
> Konrad, can you try the following version?
>
> http://stgt.berlios.de/releases/tgt-20080526-debug.tar.bz2
>
>
> I've also attached a patch against the lasest git head.
>
> Thanks,
>
> diff --git a/usr/spc.c b/usr/spc.c
> index 65a8e62..b3d7162 100644
> --- a/usr/spc.c
> +++ b/usr/spc.c
> @@ -335,21 +335,25 @@ int spc_test_unit(int host_no, struct scsi_cmd *cmd)
>  *
>  * Returns number of bytes copied.
>  */
> -static int build_mode_page(uint8_t *data, struct mode_pg *pg, int update)
> +static int build_mode_page(uint8_t *data, struct mode_pg *pg, uint16_t *alloc_len)
>  {
>        uint8_t *p;
>        int len;
>
>        len = pg->pcode_size;
> -       if (update) {
> +       if (*alloc_len >= 2) {
>                data[0] = pg->pcode;
>                data[1] = len;
>        }
> +       *alloc_len -= min_t(uint16_t, *alloc_len, 2);
> +
>        p = &data[2];
>        len += 2;
> -       if (update)
> +       if (*alloc_len >= pg->pcode_size)
>                memcpy(p, pg->mode_data, pg->pcode_size);
>
> +       *alloc_len -= min_t(uint16_t, *alloc_len, pg->pcode_size);
> +
>        return len;
>  }
>
> @@ -362,9 +366,8 @@ static int build_mode_page(uint8_t *data, struct mode_pg *pg, int update)
>  */
>  int spc_mode_sense(int host_no, struct scsi_cmd *cmd)
>  {
> -       int len = 0;
>        uint8_t *data = NULL, *scb, mode6, dbd, pcode, subpcode;
> -       uint16_t alloc_len;
> +       uint16_t alloc_len, len = 0;
>        unsigned char key = ILLEGAL_REQUEST;
>        uint16_t asc = ASC_INVALID_FIELD_IN_CDB;
>        struct mode_pg *pg;
> @@ -393,11 +396,14 @@ int spc_mode_sense(int host_no, struct scsi_cmd *cmd)
>                goto sense;
>        memset(data, 0, alloc_len);
>
> +       alloc_len -= min(alloc_len, len);
> +
>        if (!dbd) {
> -               if (alloc_len >= len)
> +               if (alloc_len >= BLOCK_DESCRIPTOR_LEN)
>                        memcpy(data + len, cmd->dev->mode_block_descriptor,
>                               BLOCK_DESCRIPTOR_LEN);
>                len += BLOCK_DESCRIPTOR_LEN;
> +               alloc_len -= min_t(uint16_t, alloc_len, BLOCK_DESCRIPTOR_LEN);
>        }
>
>        if (pcode == 0x3f) {
> @@ -405,14 +411,13 @@ int spc_mode_sense(int host_no, struct scsi_cmd *cmd)
>                for (i = 0; i < ARRAY_SIZE(cmd->dev->mode_pgs); i++) {
>                        pg = cmd->dev->mode_pgs[i];
>                        if (pg)
> -                               len += build_mode_page(data + len, pg,
> -                                                      alloc_len >= len);
> +                               len += build_mode_page(data + len, pg, &alloc_len);
>                }
>        } else {
>                pg = cmd->dev->mode_pgs[pcode];
>                if (!pg)
>                        goto sense;
> -               len += build_mode_page(data + len, pg, alloc_len >= len);
> +               len += build_mode_page(data + len, pg, &alloc_len);
>        }
>
>        if (mode6) {
> _______________________________________________
> Stgt-devel mailing list
> Stgt-devel at lists.berlios.de
> https://lists.berlios.de/mailman/listinfo/stgt-devel
>



More information about the stgt mailing list