aboutsummaryrefslogtreecommitdiff
path: root/hw/virtio-blk.c
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2012-07-16 10:52:03 +0300
committerAvi Kivity <avi@redhat.com>2012-07-16 10:52:03 +0300
commit7fa12eb15f95c269f488fce4096093c96dbaffab (patch)
tree8ca766bebdead1ae21819bdc691b1097008ae834 /hw/virtio-blk.c
parent6f82a5ea52302bab33287b0191538be6f9138637 (diff)
parent785adb09b9fd0d4df6707f00247ec519c42fcfc6 (diff)
Merge tag 'v1.1.1' into stable-1.1qemu-kvm-1.1.1
* tag 'v1.1.1': (34 commits) update VERSION for v1.1.1 s390x: fix s390 virtio aliases rtl8139: validate rx ring before receiving packets ahci: SATA FIS is 20 bytes, not 0x20 qemu-img: document qed format on qemu-img man page virtio: Fix compiler warning for non Linux hosts sheepdog: fix return value of do_load_save_vm_state qemu/xendisk: set maximum number of grants to be used build: install qmp-commands.txt fdc: fix implied seek while there is no media in drive qcow2: fix autoclear image header update Prevent disk data loss when closing qemu qcow2: fix endianness conversion pci_bridge_dev: fix error path in pci_bridge_dev_initfn() qdev: release parent properties on dc->init failure intel-hda: Fix reset of MSI function ahci: Fix reset of MSI function rtl8139: honor RxOverflow flag in can_receive method configure: Fix build for some versions of glibc (9pfs) monitor: Fix memory leak with readline completion ... Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'hw/virtio-blk.c')
-rw-r--r--hw/virtio-blk.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index f9e1896ea..fe0774617 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -147,9 +147,11 @@ static VirtIOBlockReq *virtio_blk_get_request(VirtIOBlock *s)
static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
{
+#ifdef __linux__
int ret;
- int status = VIRTIO_BLK_S_OK;
int i;
+#endif
+ int status = VIRTIO_BLK_S_OK;
/*
* We require at least one output segment each for the virtio_blk_outhdr
@@ -489,7 +491,22 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
stw_raw(&blkcfg.min_io_size, s->conf->min_io_size / blk_size);
stw_raw(&blkcfg.opt_io_size, s->conf->opt_io_size / blk_size);
blkcfg.heads = heads;
- blkcfg.sectors = secs & ~s->sector_mask;
+ /*
+ * We must ensure that the block device capacity is a multiple of
+ * the logical block size. If that is not the case, lets use
+ * sector_mask to adopt the geometry to have a correct picture.
+ * For those devices where the capacity is ok for the given geometry
+ * we dont touch the sector value of the geometry, since some devices
+ * (like s390 dasd) need a specific value. Here the capacity is already
+ * cyls*heads*secs*blk_size and the sector value is not block size
+ * divided by 512 - instead it is the amount of blk_size blocks
+ * per track (cylinder).
+ */
+ if (bdrv_getlength(s->bs) / heads / secs % blk_size) {
+ blkcfg.sectors = secs & ~s->sector_mask;
+ } else {
+ blkcfg.sectors = secs;
+ }
blkcfg.size_max = 0;
blkcfg.physical_block_exp = get_physical_block_exp(s->conf);
blkcfg.alignment_offset = 0;