diff options
author | Aurelien Jarno <aurelien@aurel32.net> | 2010-07-30 21:12:24 +0200 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2010-07-30 21:12:24 +0200 |
commit | cdc6f542007a6aee0b18a5d616d031c750691e7a (patch) | |
tree | c14a02f6cdb227350b9f173fb36b78358cca5421 /hw | |
parent | 18e9ea8a3f36b0a3845e1ac6d8acd180063bed8f (diff) | |
parent | 199630b62ec7cc5efd6f860ff545b449c7b5cdb8 (diff) |
Merge branch 'for-anthony' of git://repo.or.cz/qemu/kevin
* 'for-anthony' of git://repo.or.cz/qemu/kevin:
Fix -snapshot deleting images on disk change
block: Use error codes from lower levels for error message
block: default to 0 minimal / optiomal I/O size
move 'unsafe' to end of caching modes in help
virtio-blk: Create exit function to unregister savevm
block migration: propagate return value when bdrv_write() returns < 0
ide/atapi: add support for GET EVENT STATUS NOTIFICATION
Diffstat (limited to 'hw')
-rw-r--r-- | hw/ide/core.c | 15 | ||||
-rw-r--r-- | hw/virtio-blk.c | 8 | ||||
-rw-r--r-- | hw/virtio-pci.c | 1 | ||||
-rw-r--r-- | hw/virtio.h | 1 |
4 files changed, 25 insertions, 0 deletions
diff --git a/hw/ide/core.c b/hw/ide/core.c index 56aed935c9..631673fc0f 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1643,6 +1643,21 @@ static void ide_atapi_cmd(IDEState *s) ide_atapi_cmd_reply(s, len, max_len); break; } + case GPCMD_GET_EVENT_STATUS_NOTIFICATION: + max_len = ube16_to_cpu(packet + 7); + + if (packet[1] & 0x01) { /* polling */ + /* We don't support any event class (yet). */ + cpu_to_ube16(buf, 0x00); /* No event descriptor returned */ + buf[2] = 0x80; /* No Event Available (NEA) */ + buf[3] = 0x00; /* Empty supported event classes */ + ide_atapi_cmd_reply(s, 4, max_len); + } else { /* asynchronous mode */ + /* Only polling is supported, asynchronous mode is not. */ + ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, + ASC_INV_FIELD_IN_CMD_PACKET); + } + break; default: ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, ASC_ILLEGAL_OPCODE); diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index f50069d20b..490cd41050 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -28,6 +28,7 @@ typedef struct VirtIOBlock BlockConf *conf; unsigned short sector_mask; char sn[BLOCK_SERIAL_STRLEN]; + DeviceState *qdev; } VirtIOBlock; static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev) @@ -522,9 +523,16 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf) s->vq = virtio_add_queue(&s->vdev, 128, virtio_blk_handle_output); qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s); + s->qdev = dev; register_savevm(dev, "virtio-blk", virtio_blk_id++, 2, virtio_blk_save, virtio_blk_load, s); bdrv_set_removable(s->bs, 0); return &s->vdev; } + +void virtio_blk_exit(VirtIODevice *vdev) +{ + VirtIOBlock *s = to_virtio_blk(vdev); + unregister_savevm(s->qdev, "virtio-blk", s); +} diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 31a711ef41..17c3d1539b 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -569,6 +569,7 @@ static int virtio_blk_exit_pci(PCIDevice *pci_dev) { VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev); + virtio_blk_exit(proxy->vdev); blockdev_mark_auto_del(proxy->block.bs); return virtio_exit_pci(pci_dev); } diff --git a/hw/virtio.h b/hw/virtio.h index e4306cd750..30e472aba7 100644 --- a/hw/virtio.h +++ b/hw/virtio.h @@ -194,6 +194,7 @@ VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf); void virtio_net_exit(VirtIODevice *vdev); +void virtio_blk_exit(VirtIODevice *vdev); #define DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) \ DEFINE_PROP_BIT("indirect_desc", _state, _field, \ |