qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 4/4] scsi-disk: fix the block descriptor returne


From: Kevin Wolf
Subject: Re: [Qemu-devel] [PATCH 4/4] scsi-disk: fix the block descriptor returned by the MODE SENSE command
Date: Mon, 16 Aug 2010 19:34:32 +0200
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100720 Fedora/3.0.6-1.fc12 Thunderbird/3.0.6

Am 02.08.2010 17:31, schrieb Bernhard Kohl:
> The block descriptor contains the number of blocks, not the highest LBA.
> Real hard disks return 0 if the number of blocks exceed the maximum 0xFFFFFF.
> 
> SCSI-Spec:
> http://ldkelley.com/SCSI2/SCSI2/SCSI2-08.html#8.3.3
> The number of blocks field specifies the number of logical blocks on the 
> medium
> to which the density code and block length fields apply. A value of zero
> indicates that all of the remaining logical blocks of the logical unit shall
> have the medium characteristics specified.
> 
> Signed-off-by: Bernhard Kohl <address@hidden>
> ---
>  hw/scsi-disk.c |    3 +--
>  1 files changed, 1 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
> index 26f7345..519513c 100644
> --- a/hw/scsi-disk.c
> +++ b/hw/scsi-disk.c
> @@ -642,9 +642,8 @@ static int scsi_disk_emulate_mode_sense(SCSIRequest *req, 
> uint8_t *outbuf)
>          else /* MODE_SENSE_10 */
>              outbuf[7] = 8; /* Block descriptor length  */
>          nb_sectors /= s->cluster_size;
> -        nb_sectors--;
>          if (nb_sectors > 0xffffff)
> -            nb_sectors = 0xffffff;
> +            nb_sectors = 0;
>          p[0] = 0; /* media density code */
>          p[1] = (nb_sectors >> 16) & 0xff;
>          p[2] = (nb_sectors >> 8) & 0xff;

The patch itself looks okay. However, it made me wonder what this line
wants to tell us:

    if ((~dbd) & nb_sectors) {

Is it just me or doesn't this make any sense at all? dbd is a single
bit, 0x8 if set or 0x0 otherwise. nb_sectors is the number of sectors.
Can this operation have any meaningful result? I suppose it was meant to
be something like:

    if (!dbd && nb_sectors) {

Can you please check this and add a patch 5/4 if necessary?

Kevin



reply via email to

[Prev in Thread] Current Thread [Next in Thread]