From: Ryan Harper <[EMAIL PROTECTED]> Rather than faking up some geometry, allow the backend to push the disk geometry via virtio pci config option. Keep the old geo code around for compatibility.
Signed-off-by: Ryan Harper <[EMAIL PROTECTED]> Reviewed-by: Anthony Liguori <[EMAIL PROTECTED]> diff --git a/qemu/hw/pc.c b/qemu/hw/pc.c index ae87ab9..e78647a 100644 --- a/qemu/hw/pc.c +++ b/qemu/hw/pc.c @@ -1130,7 +1130,7 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, DriveInfo *info = &drives_table[extboot_drive]; int cyls, heads, secs; - if (info->type != IF_IDE) { + if (info->type != IF_IDE && info->type != IF_VIRTIO) { bdrv_guess_geometry(info->bdrv, &cyls, &heads, &secs); bdrv_set_geometry_hint(info->bdrv, cyls, heads, secs); } diff --git a/qemu/hw/virtio-blk.c b/qemu/hw/virtio-blk.c index 492bd7f..d51501e 100644 --- a/qemu/hw/virtio-blk.c +++ b/qemu/hw/virtio-blk.c @@ -25,12 +25,16 @@ #define VIRTIO_BLK_F_BARRIER 0 /* Does host support barriers? */ #define VIRTIO_BLK_F_SIZE_MAX 1 /* Indicates maximum segment size */ #define VIRTIO_BLK_F_SEG_MAX 2 /* Indicates maximum # of segments */ +#define VIRTIO_BLK_F_GEOMETRY 4 /* Indicates support of legacy geometry */ struct virtio_blk_config { uint64_t capacity; uint32_t size_max; uint32_t seg_max; + uint16_t cylinders; + uint8_t heads; + uint8_t sectors; }; /* These two define direction. */ @@ -132,32 +136,40 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config) VirtIOBlock *s = to_virtio_blk(vdev); struct virtio_blk_config blkcfg; int64_t capacity; + int cylinders, heads, secs; bdrv_get_geometry(s->bs, &capacity); + bdrv_get_geometry_hint(s->bs, &cylinders, &heads, &secs); blkcfg.capacity = cpu_to_le64(capacity); blkcfg.seg_max = cpu_to_le32(128 - 2); + blkcfg.cylinders = cpu_to_le16(cylinders); + blkcfg.heads = heads; + blkcfg.sectors = secs; memcpy(config, &blkcfg, sizeof(blkcfg)); } static uint32_t virtio_blk_get_features(VirtIODevice *vdev) { - return (1 << VIRTIO_BLK_F_SEG_MAX); + return (1 << VIRTIO_BLK_F_SEG_MAX | 1 << VIRTIO_BLK_F_GEOMETRY); } void *virtio_blk_init(PCIBus *bus, uint16_t vendor, uint16_t device, BlockDriverState *bs) { VirtIOBlock *s; + int cylinders, heads, secs; s = (VirtIOBlock *)virtio_init_pci(bus, "virtio-blk", vendor, device, 0, VIRTIO_ID_BLOCK, 0x01, 0x80, 0x00, - 16, sizeof(VirtIOBlock)); + sizeof(struct virtio_blk_config), sizeof(VirtIOBlock)); s->vdev.update_config = virtio_blk_update_config; s->vdev.get_features = virtio_blk_get_features; s->bs = bs; bs->devfn = s->vdev.pci_dev.devfn; + bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs); + bdrv_set_geometry_hint(s->bs, cylinders, heads, secs); virtio_add_queue(&s->vdev, 128, virtio_blk_handle_output); ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel