Il 26/11/2012 02:33, David Gibson ha scritto:
> The virtio-scsi config space is, by specification, in guest endian (which
> is ill-defined, but there you go).  In virtio_scsi_get_config() we set up
> all the fields in there, using stl_raw().  Which is a problem for the
> max_channel and max_target fields, which are 16-bit, not 32-bit.  For
> little-endian targets we get away with it by accident, since the first
> two bytes will still be correct, and the extra two bytes written (with
> zeroes) will be overwritten correctly by the next store.
> 
> But for big-endian guests, this means the max_target field ends up as zero,
> which means the guest will only recognize a single disk on the virtio-scsi
> bus.  This patch fixes the problem.
> 
> Cc: Paolo Bonzini <pbonz...@redhat.com>
> Cc: Paul 'Rusty' Russell <ru...@rustcorp.com.au>
> Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>
> ---
>  hw/virtio-scsi.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
> index 9d27d1d..6eb2e03 100644
> --- a/hw/virtio-scsi.c
> +++ b/hw/virtio-scsi.c
> @@ -533,8 +533,8 @@ static void virtio_scsi_get_config(VirtIODevice *vdev,
>      stl_raw(&scsiconf->event_info_size, sizeof(VirtIOSCSIEvent));
>      stl_raw(&scsiconf->sense_size, s->sense_size);
>      stl_raw(&scsiconf->cdb_size, s->cdb_size);
> -    stl_raw(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL);
> -    stl_raw(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET);
> +    stw_raw(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL);
> +    stw_raw(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET);
>      stl_raw(&scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN);
>  }
>  
> 

Thanks, applied to scsi-next branch.

Paolo

Reply via email to