[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-stable] [PATCH 39/43] virtio-scsi: Fix subtle (guest) endian bug
From: |
Michael Roth |
Subject: |
[Qemu-stable] [PATCH 39/43] virtio-scsi: Fix subtle (guest) endian bug |
Date: |
Mon, 3 Dec 2012 16:44:36 -0600 |
From: David Gibson <address@hidden>
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 <address@hidden>
Cc: Paul 'Rusty' Russell <address@hidden>
Signed-off-by: David Gibson <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
(cherry picked from commit 863d1050c96cff91dd478767c0da9cc288575919)
Signed-off-by: Michael Roth <address@hidden>
---
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 c6d5290..5fcbdd8 100644
--- a/hw/virtio-scsi.c
+++ b/hw/virtio-scsi.c
@@ -534,8 +534,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);
}
--
1.7.9.5
- [Qemu-stable] [PATCH 29/43] qom: dynamic_cast of NULL is always NULL, (continued)
- [Qemu-stable] [PATCH 34/43] qapi: fix qapi_dealloc_type_size parameter type, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 33/43] qapi: handle visitor->type_size() in QapiDeallocVisitor, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 35/43] iscsi: fix segfault in url parsing, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 36/43] iscsi: fix deadlock during login, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 37/43] iscsi: do not assume device is zero initialized, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 38/43] virtio-scsi: Fix some endian bugs with virtio-scsi, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 39/43] virtio-scsi: Fix subtle (guest) endian bug,
Michael Roth <=
- [Qemu-stable] [PATCH 40/43] qxl: reload memslots after migration, when qxl is in UNDEFINED mode, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 41/43] usb: fail usbdevice_create() when there is no USB bus, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 42/43] stream: fix ratelimit_set_speed, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 43/43] e1000: Discard packets that are too long if !SBP and !LPE, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 27/43] tci: Fix type of tci_read_label, Michael Roth, 2012/12/03
- [Qemu-stable] [PATCH 26/43] qcow2: Fix refcount table size calculation, Michael Roth, 2012/12/03