diff options
author | Peter Maydell | 2017-08-10 19:53:39 +0200 |
---|---|---|
committer | Peter Maydell | 2017-08-10 19:53:39 +0200 |
commit | 95766c2cd04395e5712b4d5967b3251f35d537df (patch) | |
tree | 3a57304ab5961497cfec4ac3c00d818e4053f3f4 /hw | |
parent | Merge remote-tracking branch 'remotes/gkurz/tags/for-upstream' into staging (diff) | |
parent | virtio-blk: handle blk_getlength() errors (diff) | |
download | qemu-95766c2cd04395e5712b4d5967b3251f35d537df.tar.gz qemu-95766c2cd04395e5712b4d5967b3251f35d537df.tar.xz qemu-95766c2cd04395e5712b4d5967b3251f35d537df.zip |
Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging
# gpg: Signature made Thu 10 Aug 2017 18:48:13 BST
# gpg: using RSA key 0x9CA4ABB381AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>"
# gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>"
# Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35 775A 9CA4 ABB3 81AB 73C8
* remotes/stefanha/tags/block-pull-request:
virtio-blk: handle blk_getlength() errors
IDE: test flush on empty CDROM
IDE: Do not flush empty CDROM drives
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/block/virtio-blk.c | 4 | ||||
-rw-r--r-- | hw/ide/core.c | 10 |
2 files changed, 12 insertions, 2 deletions
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index b750bd8b53..a16ac75090 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -730,6 +730,7 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config) BlockConf *conf = &s->conf.conf; struct virtio_blk_config blkcfg; uint64_t capacity; + int64_t length; int blk_size = conf->logical_block_size; blk_get_geometry(s->blk, &capacity); @@ -752,7 +753,8 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config) * divided by 512 - instead it is the amount of blk_size blocks * per track (cylinder). */ - if (blk_getlength(s->blk) / conf->heads / conf->secs % blk_size) { + length = blk_getlength(s->blk); + if (length > 0 && length / conf->heads / conf->secs % blk_size) { blkcfg.geometry.sectors = conf->secs & ~s->sector_mask; } else { blkcfg.geometry.sectors = conf->secs; diff --git a/hw/ide/core.c b/hw/ide/core.c index 0b48b64d3a..bea39536b0 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1063,7 +1063,15 @@ static void ide_flush_cache(IDEState *s) s->status |= BUSY_STAT; ide_set_retry(s); block_acct_start(blk_get_stats(s->blk), &s->acct, 0, BLOCK_ACCT_FLUSH); - s->pio_aiocb = blk_aio_flush(s->blk, ide_flush_cb, s); + + if (blk_bs(s->blk)) { + s->pio_aiocb = blk_aio_flush(s->blk, ide_flush_cb, s); + } else { + /* XXX blk_aio_flush() crashes when blk_bs(blk) is NULL, remove this + * temporary workaround when blk_aio_*() functions handle NULL blk_bs. + */ + ide_flush_cb(s, 0); + } } static void ide_cfata_metadata_inquiry(IDEState *s) |