#ifndef KVM__BLK_VIRTIO_H
#define KVM__BLK_VIRTIO_H
+#include "kvm/disk-image.h"
+
struct kvm;
-void virtio_blk__init(struct kvm *self);
+void virtio_blk__init(struct kvm *self, struct disk_image *disk);
#endif /* KVM__BLK_VIRTIO_H */
strlcat(real_cmdline, " root=/dev/vda rw ", sizeof(real_cmdline));
if (image_filename) {
- kvm->disk_image = disk_image__open(image_filename, readonly_image);
- if (!kvm->disk_image)
+ struct disk_image *disk = disk_image__open(image_filename, readonly_image);
+ if (!disk)
die("unable to load disk image %s", image_filename);
+
+ virtio_blk__init(kvm, disk);
}
free(hi);
pci__init();
- virtio_blk__init(kvm);
-
virtio_console__init(kvm);
if (virtio_rng)
exit_code = 1;
}
- disk_image__close(kvm->disk_image);
kvm__delete(kvm);
if (!exit_code)
pthread_mutex_t mutex;
struct virtio_blk_config blk_config;
+ struct disk_image *disk;
uint32_t host_features;
uint32_t guest_features;
uint16_t config_vector;
switch (req->type) {
case VIRTIO_BLK_T_IN:
- block_cnt = disk_image__read_sector_iov(self->disk_image, req->sector, iov + 1, in + out - 2);
+ block_cnt = disk_image__read_sector_iov(blk_device.disk, req->sector, iov + 1, in + out - 2);
break;
case VIRTIO_BLK_T_OUT:
- block_cnt = disk_image__write_sector_iov(self->disk_image, req->sector, iov + 1, in + out - 2);
+ block_cnt = disk_image__write_sector_iov(blk_device.disk, req->sector, iov + 1, in + out - 2);
break;
#define PCI_VIRTIO_BLK_DEVNUM 1
-void virtio_blk__init(struct kvm *self)
+void virtio_blk__init(struct kvm *self, struct disk_image *disk)
{
- if (!self->disk_image)
+ if (!disk)
return;
- blk_device.blk_config.capacity = self->disk_image->size / SECTOR_SIZE;
+ blk_device.disk = disk;
+
+ blk_device.blk_config.capacity = disk->size / SECTOR_SIZE;
pci__register(&virtio_blk_pci_device, PCI_VIRTIO_BLK_DEVNUM);