[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 10/15] scsi-disk: add migration support
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 10/15] scsi-disk: add migration support |
Date: |
Mon, 16 Jan 2012 17:30:52 +0100 |
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi-disk.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 55 insertions(+), 4 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 28b217c..4465d76 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -111,12 +111,12 @@ static void scsi_cancel_io(SCSIRequest *req)
r->req.aiocb = NULL;
}
-static uint32_t scsi_init_iovec(SCSIDiskReq *r)
+static uint32_t scsi_init_iovec(SCSIDiskReq *r, size_t size)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
if (!r->iov.iov_base) {
- r->buflen = SCSI_DMA_BUF_SIZE;
+ r->buflen = size;
r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
}
r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
@@ -124,6 +124,35 @@ static uint32_t scsi_init_iovec(SCSIDiskReq *r)
return r->qiov.size / 512;
}
+static void scsi_disk_save_request(QEMUFile *f, SCSIRequest *req)
+{
+ SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
+
+ qemu_put_be64s(f, &r->sector);
+ qemu_put_be32s(f, &r->sector_count);
+ qemu_put_be32s(f, &r->buflen);
+ if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
+ qemu_put_buffer(f, r->iov.iov_base, r->iov.iov_len);
+ }
+}
+
+static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req)
+{
+ SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
+
+ qemu_get_be64s(f, &r->sector);
+ qemu_get_be32s(f, &r->sector_count);
+ qemu_get_be32s(f, &r->buflen);
+ if (r->buflen) {
+ scsi_init_iovec(r, r->buflen);
+ if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
+ qemu_get_buffer(f, r->iov.iov_base, r->iov.iov_len);
+ }
+ }
+
+ qemu_iovec_init_external(&r->qiov, &r->iov, 1);
+}
+
static void scsi_dma_complete(void * opaque, int ret)
{
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
@@ -241,7 +270,7 @@ static void scsi_read_data(SCSIRequest *req)
r->req.aiocb = dma_bdrv_read(s->qdev.conf.bs, r->req.sg, r->sector,
scsi_dma_complete, r);
} else {
- n = scsi_init_iovec(r);
+ n = scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE,
BDRV_ACCT_READ);
r->req.aiocb = bdrv_aio_readv(s->qdev.conf.bs, r->sector, &r->qiov, n,
scsi_read_complete, r);
@@ -316,7 +345,7 @@ static void scsi_write_complete(void * opaque, int ret)
if (r->sector_count == 0) {
scsi_req_complete(&r->req, GOOD);
} else {
- scsi_init_iovec(r);
+ scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, r->qiov.size);
scsi_req_data(&r->req, r->qiov.size);
}
@@ -1629,6 +1658,8 @@ static const SCSIReqOps scsi_disk_reqops = {
.write_data = scsi_write_data,
.cancel_io = scsi_cancel_io,
.get_buf = scsi_get_buf,
+ .load_request = scsi_disk_load_request,
+ .save_request = scsi_disk_save_request,
};
static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
@@ -1757,6 +1788,22 @@ static SCSIRequest *scsi_block_new_request(SCSIDevice
*d, uint32_t tag,
DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
DEFINE_PROP_STRING("serial", SCSIDiskState, serial)
+static const VMStateDescription vmstate_scsi_disk_state = {
+ .name = "scsi-disk",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_SCSI_DEVICE(qdev, SCSIDiskState),
+ VMSTATE_BOOL(media_changed, SCSIDiskState),
+ VMSTATE_BOOL(media_event, SCSIDiskState),
+ VMSTATE_BOOL(eject_request, SCSIDiskState),
+ VMSTATE_BOOL(tray_open, SCSIDiskState),
+ VMSTATE_BOOL(tray_locked, SCSIDiskState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
static SCSIDeviceInfo scsi_disk_info[] = {
{
.qdev.name = "scsi-hd",
@@ -1764,6 +1811,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.qdev.desc = "virtual SCSI disk",
.qdev.size = sizeof(SCSIDiskState),
.qdev.reset = scsi_disk_reset,
+ .qdev.vmsd = &vmstate_scsi_disk_state,
.init = scsi_hd_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
@@ -1779,6 +1827,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.qdev.desc = "virtual SCSI CD-ROM",
.qdev.size = sizeof(SCSIDiskState),
.qdev.reset = scsi_disk_reset,
+ .qdev.vmsd = &vmstate_scsi_disk_state,
.init = scsi_cd_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
@@ -1794,6 +1843,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.qdev.desc = "SCSI block device passthrough",
.qdev.size = sizeof(SCSIDiskState),
.qdev.reset = scsi_disk_reset,
+ .qdev.vmsd = &vmstate_scsi_disk_state,
.init = scsi_block_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_block_new_request,
@@ -1808,6 +1858,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.qdev.desc = "virtual SCSI disk or CD-ROM (legacy)",
.qdev.size = sizeof(SCSIDiskState),
.qdev.reset = scsi_disk_reset,
+ .qdev.vmsd = &vmstate_scsi_disk_state,
.init = scsi_disk_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
--
1.7.7.1
- [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 02/15] dma-helpers: add dma_buf_read and dma_buf_write, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 03/15] dma-helpers: add accounting wrappers, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 04/15] ahci: use new DMA helpers, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 01/15] dma-helpers: make QEMUSGList target independent, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 05/15] scsi: pass residual amount to command_complete, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 08/15] scsi: add SCSIDevice vmstate definitions, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 06/15] scsi: add scatter/gather functionality, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 07/15] scsi-disk: enable scatter/gather functionality, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 10/15] scsi-disk: add migration support,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 13/15] virtio-scsi: add basic SCSI bus operation, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 09/15] scsi-generic: add migration support, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 14/15] virtio-scsi: process control queue requests, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 12/15] virtio-scsi: Add basic request processing infrastructure, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 11/15] virtio-scsi: Add virtio-scsi stub device, Paolo Bonzini, 2012/01/16
- [Qemu-devel] [PATCH 15/15] virtio-scsi: add migration support, Paolo Bonzini, 2012/01/16
- Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi, Hu Tao, 2012/01/18