* [Qemu-devel] [PULL 00/14] Block patches @ 2011-12-15 14:09 Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 01/14] block: bdrv_aio_* do not return NULL Kevin Wolf ` (14 more replies) 0 siblings, 15 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit 222f23f508a8d778f56eddef14752dfd26d225b4: tcg/arm: remove fixed map code buffer restriction (2011-12-14 21:58:18 +0100) are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Avi Kivity (1): coroutine: switch per-thread free pool to a global pool Josh Durgin (1): rbd: always set out parameter in qemu_rbd_snap_list Kevin Wolf (3): qemu-img rebase: Fix for undersized backing files Documentation: Add qemu-img -t parameter in man page qcow2: Allow >4 GB VM state Li Zhi Hui (2): block/qcow2.c: call qcow2_free_snapshots in the function of qcow2_close block/cow: Return real error code Paolo Bonzini (7): block: bdrv_aio_* do not return NULL block: simplify failure handling for bdrv_aio_multiwrite block: qemu_aio_get does not return NULL dma: the passed io_func does not return NULL block: dma_bdrv_* does not return NULL block: avoid useless checks on acb->bh qiov: prevent double free or use-after-free block-migration.c | 13 --------- block.c | 56 +++------------------------------------- block.h | 2 +- block/blkverify.c | 24 ++++++----------- block/cow.c | 44 +++++++++++++++++++++----------- block/curl.c | 4 --- block/qcow2-snapshot.c | 34 +++++++++++++++++++++++- block/qcow2.c | 1 + block/qcow2.h | 2 +- block/qed-table.c | 22 +++++----------- block/qed.c | 60 +++++++++++-------------------------------- block/rbd.c | 6 +--- block/vdi.c | 66 +++++++++++++---------------------------------- coroutine-ucontext.c | 30 +++++++++++---------- cutils.c | 3 ++ dma-helpers.c | 4 +-- docs/specs/qcow2.txt | 8 +++++- hw/ide/atapi.c | 8 +----- hw/ide/core.c | 13 +-------- hw/ide/macio.c | 11 +------- hw/scsi-disk.c | 9 ------ hw/scsi-generic.c | 4 --- hw/virtio-blk.c | 19 +++----------- linux-aio.c | 2 - posix-aio-compat.c | 4 --- qemu-img-cmds.hx | 6 ++-- qemu-img.c | 42 ++++++++++++++++++++++++------ qemu-img.texi | 10 +++++-- qemu-io.c | 39 ++++++---------------------- savevm.c | 2 +- trace-events | 2 - 31 files changed, 205 insertions(+), 345 deletions(-) ^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 01/14] block: bdrv_aio_* do not return NULL 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 02/14] block: simplify failure handling for bdrv_aio_multiwrite Kevin Wolf ` (13 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Paolo Bonzini <pbonzini@redhat.com> Initially done with the following semantic patch: @ rule1 @ expression E; statement S; @@ E = ( bdrv_aio_readv | bdrv_aio_writev | bdrv_aio_flush | bdrv_aio_discard | bdrv_aio_ioctl ) (...); ( - if (E == NULL) { ... } | - if (E) { <... S ...> } ) which however missed the occurrence in block/blkverify.c (as it should have done), and left behind some unused variables. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block-migration.c | 13 ----------- block.c | 24 +-------------------- block/blkverify.c | 24 +++++++-------------- block/qed-table.c | 22 ++++++------------- block/qed.c | 60 ++++++++++++++-------------------------------------- block/vdi.c | 20 ----------------- hw/ide/atapi.c | 8 +------ hw/ide/core.c | 7 +----- hw/ide/macio.c | 7 ------ hw/scsi-disk.c | 9 -------- hw/scsi-generic.c | 4 --- hw/virtio-blk.c | 19 +++------------- qemu-io.c | 39 +++++++--------------------------- trace-events | 2 - 14 files changed, 46 insertions(+), 212 deletions(-) diff --git a/block-migration.c b/block-migration.c index 423c5a0..2b7edbc 100644 --- a/block-migration.c +++ b/block-migration.c @@ -251,22 +251,12 @@ static int mig_save_device_bulk(Monitor *mon, QEMUFile *f, blk->aiocb = bdrv_aio_readv(bs, cur_sector, &blk->qiov, nr_sectors, blk_mig_read_cb, blk); - if (!blk->aiocb) { - goto error; - } block_mig_state.submitted++; bdrv_reset_dirty(bs, cur_sector, nr_sectors); bmds->cur_sector = cur_sector + nr_sectors; return (bmds->cur_sector >= total_sectors); - -error: - monitor_printf(mon, "Error reading sector %" PRId64 "\n", cur_sector); - qemu_file_set_error(f, -EIO); - g_free(blk->buf); - g_free(blk); - return 0; } static void set_dirty_tracking(int enable) @@ -413,9 +403,6 @@ static int mig_save_device_dirty(Monitor *mon, QEMUFile *f, blk->aiocb = bdrv_aio_readv(bmds->bs, sector, &blk->qiov, nr_sectors, blk_mig_read_cb, blk); - if (!blk->aiocb) { - goto error; - } block_mig_state.submitted++; bmds_set_aio_inflight(bmds, sector, nr_sectors, 1); } else { diff --git a/block.c b/block.c index aa9d142..434c13d 100644 --- a/block.c +++ b/block.c @@ -2812,7 +2812,6 @@ static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs, */ int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs) { - BlockDriverAIOCB *acb; MultiwriteCB *mcb; int i; @@ -2867,35 +2866,14 @@ int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs) // Run the aio requests for (i = 0; i < num_reqs; i++) { mcb->num_requests++; - acb = bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov, + bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov, reqs[i].nb_sectors, multiwrite_cb, mcb); - - if (acb == NULL) { - // We can only fail the whole thing if no request has been - // submitted yet. Otherwise we'll wait for the submitted AIOs to - // complete and report the error in the callback. - if (i == 0) { - trace_bdrv_aio_multiwrite_earlyfail(mcb); - goto fail; - } else { - trace_bdrv_aio_multiwrite_latefail(mcb, i); - multiwrite_cb(mcb, -EIO); - break; - } - } } /* Complete the dummy request */ multiwrite_cb(mcb, 0); return 0; - -fail: - for (i = 0; i < mcb->num_callbacks; i++) { - reqs[i].error = -EIO; - } - g_free(mcb); - return -1; } void bdrv_aio_cancel(BlockDriverAIOCB *acb) diff --git a/block/blkverify.c b/block/blkverify.c index 483f3b3..4ca8584 100644 --- a/block/blkverify.c +++ b/block/blkverify.c @@ -310,14 +310,10 @@ static BlockDriverAIOCB *blkverify_aio_readv(BlockDriverState *bs, qemu_iovec_init(&acb->raw_qiov, acb->qiov->niov); blkverify_iovec_clone(&acb->raw_qiov, qiov, acb->buf); - if (!bdrv_aio_readv(s->test_file, sector_num, qiov, nb_sectors, - blkverify_aio_cb, acb)) { - blkverify_aio_cb(acb, -EIO); - } - if (!bdrv_aio_readv(bs->file, sector_num, &acb->raw_qiov, nb_sectors, - blkverify_aio_cb, acb)) { - blkverify_aio_cb(acb, -EIO); - } + bdrv_aio_readv(s->test_file, sector_num, qiov, nb_sectors, + blkverify_aio_cb, acb); + bdrv_aio_readv(bs->file, sector_num, &acb->raw_qiov, nb_sectors, + blkverify_aio_cb, acb); return &acb->common; } @@ -329,14 +325,10 @@ static BlockDriverAIOCB *blkverify_aio_writev(BlockDriverState *bs, BlkverifyAIOCB *acb = blkverify_aio_get(bs, true, sector_num, qiov, nb_sectors, cb, opaque); - if (!bdrv_aio_writev(s->test_file, sector_num, qiov, nb_sectors, - blkverify_aio_cb, acb)) { - blkverify_aio_cb(acb, -EIO); - } - if (!bdrv_aio_writev(bs->file, sector_num, qiov, nb_sectors, - blkverify_aio_cb, acb)) { - blkverify_aio_cb(acb, -EIO); - } + bdrv_aio_writev(s->test_file, sector_num, qiov, nb_sectors, + blkverify_aio_cb, acb); + bdrv_aio_writev(bs->file, sector_num, qiov, nb_sectors, + blkverify_aio_cb, acb); return &acb->common; } diff --git a/block/qed-table.c b/block/qed-table.c index 8ee8443..ce07b05 100644 --- a/block/qed-table.c +++ b/block/qed-table.c @@ -54,7 +54,6 @@ static void qed_read_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, QEDReadTableCB *read_table_cb = gencb_alloc(sizeof(*read_table_cb), cb, opaque); QEMUIOVector *qiov = &read_table_cb->qiov; - BlockDriverAIOCB *aiocb; trace_qed_read_table(s, offset, table); @@ -64,12 +63,9 @@ static void qed_read_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, read_table_cb->iov.iov_len = s->header.cluster_size * s->header.table_size, qemu_iovec_init_external(qiov, &read_table_cb->iov, 1); - aiocb = bdrv_aio_readv(s->bs->file, offset / BDRV_SECTOR_SIZE, qiov, - qiov->size / BDRV_SECTOR_SIZE, - qed_read_table_cb, read_table_cb); - if (!aiocb) { - qed_read_table_cb(read_table_cb, -EIO); - } + bdrv_aio_readv(s->bs->file, offset / BDRV_SECTOR_SIZE, qiov, + qiov->size / BDRV_SECTOR_SIZE, + qed_read_table_cb, read_table_cb); } typedef struct { @@ -127,7 +123,6 @@ static void qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, BlockDriverCompletionFunc *cb, void *opaque) { QEDWriteTableCB *write_table_cb; - BlockDriverAIOCB *aiocb; unsigned int sector_mask = BDRV_SECTOR_SIZE / sizeof(uint64_t) - 1; unsigned int start, end, i; size_t len_bytes; @@ -158,13 +153,10 @@ static void qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, /* Adjust for offset into table */ offset += start * sizeof(uint64_t); - aiocb = bdrv_aio_writev(s->bs->file, offset / BDRV_SECTOR_SIZE, - &write_table_cb->qiov, - write_table_cb->qiov.size / BDRV_SECTOR_SIZE, - qed_write_table_cb, write_table_cb); - if (!aiocb) { - qed_write_table_cb(write_table_cb, -EIO); - } + bdrv_aio_writev(s->bs->file, offset / BDRV_SECTOR_SIZE, + &write_table_cb->qiov, + write_table_cb->qiov.size / BDRV_SECTOR_SIZE, + qed_write_table_cb, write_table_cb); } /** diff --git a/block/qed.c b/block/qed.c index 22e4672..8da3ebe 100644 --- a/block/qed.c +++ b/block/qed.c @@ -123,7 +123,6 @@ static void qed_write_header_read_cb(void *opaque, int ret) { QEDWriteHeaderCB *write_header_cb = opaque; BDRVQEDState *s = write_header_cb->s; - BlockDriverAIOCB *acb; if (ret) { qed_write_header_cb(write_header_cb, ret); @@ -133,12 +132,9 @@ static void qed_write_header_read_cb(void *opaque, int ret) /* Update header */ qed_header_cpu_to_le(&s->header, (QEDHeader *)write_header_cb->buf); - acb = bdrv_aio_writev(s->bs->file, 0, &write_header_cb->qiov, - write_header_cb->nsectors, qed_write_header_cb, - write_header_cb); - if (!acb) { - qed_write_header_cb(write_header_cb, -EIO); - } + bdrv_aio_writev(s->bs->file, 0, &write_header_cb->qiov, + write_header_cb->nsectors, qed_write_header_cb, + write_header_cb); } /** @@ -156,7 +152,6 @@ static void qed_write_header(BDRVQEDState *s, BlockDriverCompletionFunc cb, * them, and write back. */ - BlockDriverAIOCB *acb; int nsectors = (sizeof(QEDHeader) + BDRV_SECTOR_SIZE - 1) / BDRV_SECTOR_SIZE; size_t len = nsectors * BDRV_SECTOR_SIZE; @@ -170,11 +165,8 @@ static void qed_write_header(BDRVQEDState *s, BlockDriverCompletionFunc cb, write_header_cb->iov.iov_len = len; qemu_iovec_init_external(&write_header_cb->qiov, &write_header_cb->iov, 1); - acb = bdrv_aio_readv(s->bs->file, 0, &write_header_cb->qiov, nsectors, - qed_write_header_read_cb, write_header_cb); - if (!acb) { - qed_write_header_cb(write_header_cb, -EIO); - } + bdrv_aio_readv(s->bs->file, 0, &write_header_cb->qiov, nsectors, + qed_write_header_read_cb, write_header_cb); } static uint64_t qed_max_image_size(uint32_t cluster_size, uint32_t table_size) @@ -728,7 +720,6 @@ static void qed_read_backing_file(BDRVQEDState *s, uint64_t pos, QEMUIOVector *qiov, BlockDriverCompletionFunc *cb, void *opaque) { - BlockDriverAIOCB *aiocb; uint64_t backing_length = 0; size_t size; @@ -760,11 +751,8 @@ static void qed_read_backing_file(BDRVQEDState *s, uint64_t pos, size = MIN((uint64_t)backing_length - pos, qiov->size); BLKDBG_EVENT(s->bs->file, BLKDBG_READ_BACKING); - aiocb = bdrv_aio_readv(s->bs->backing_hd, pos / BDRV_SECTOR_SIZE, - qiov, size / BDRV_SECTOR_SIZE, cb, opaque); - if (!aiocb) { - cb(opaque, -EIO); - } + bdrv_aio_readv(s->bs->backing_hd, pos / BDRV_SECTOR_SIZE, + qiov, size / BDRV_SECTOR_SIZE, cb, opaque); } typedef struct { @@ -786,7 +774,6 @@ static void qed_copy_from_backing_file_write(void *opaque, int ret) { CopyFromBackingFileCB *copy_cb = opaque; BDRVQEDState *s = copy_cb->s; - BlockDriverAIOCB *aiocb; if (ret) { qed_copy_from_backing_file_cb(copy_cb, ret); @@ -794,13 +781,9 @@ static void qed_copy_from_backing_file_write(void *opaque, int ret) } BLKDBG_EVENT(s->bs->file, BLKDBG_COW_WRITE); - aiocb = bdrv_aio_writev(s->bs->file, copy_cb->offset / BDRV_SECTOR_SIZE, - ©_cb->qiov, - copy_cb->qiov.size / BDRV_SECTOR_SIZE, - qed_copy_from_backing_file_cb, copy_cb); - if (!aiocb) { - qed_copy_from_backing_file_cb(copy_cb, -EIO); - } + bdrv_aio_writev(s->bs->file, copy_cb->offset / BDRV_SECTOR_SIZE, + ©_cb->qiov, copy_cb->qiov.size / BDRV_SECTOR_SIZE, + qed_copy_from_backing_file_cb, copy_cb); } /** @@ -1022,7 +1005,6 @@ static void qed_aio_write_main(void *opaque, int ret) uint64_t offset = acb->cur_cluster + qed_offset_into_cluster(s, acb->cur_pos); BlockDriverCompletionFunc *next_fn; - BlockDriverAIOCB *file_acb; trace_qed_aio_write_main(s, acb, ret, offset, acb->cur_qiov.size); @@ -1042,13 +1024,9 @@ static void qed_aio_write_main(void *opaque, int ret) } BLKDBG_EVENT(s->bs->file, BLKDBG_WRITE_AIO); - file_acb = bdrv_aio_writev(s->bs->file, offset / BDRV_SECTOR_SIZE, - &acb->cur_qiov, - acb->cur_qiov.size / BDRV_SECTOR_SIZE, - next_fn, acb); - if (!file_acb) { - qed_aio_complete(acb, -EIO); - } + bdrv_aio_writev(s->bs->file, offset / BDRV_SECTOR_SIZE, + &acb->cur_qiov, acb->cur_qiov.size / BDRV_SECTOR_SIZE, + next_fn, acb); } /** @@ -1215,7 +1193,6 @@ static void qed_aio_read_data(void *opaque, int ret, QEDAIOCB *acb = opaque; BDRVQEDState *s = acb_to_s(acb); BlockDriverState *bs = acb->common.bs; - BlockDriverAIOCB *file_acb; /* Adjust offset into cluster */ offset += qed_offset_into_cluster(s, acb->cur_pos); @@ -1240,14 +1217,9 @@ static void qed_aio_read_data(void *opaque, int ret, } BLKDBG_EVENT(bs->file, BLKDBG_READ_AIO); - file_acb = bdrv_aio_readv(bs->file, offset / BDRV_SECTOR_SIZE, - &acb->cur_qiov, - acb->cur_qiov.size / BDRV_SECTOR_SIZE, - qed_aio_next_io, acb); - if (!file_acb) { - ret = -EIO; - goto err; - } + bdrv_aio_readv(bs->file, offset / BDRV_SECTOR_SIZE, + &acb->cur_qiov, acb->cur_qiov.size / BDRV_SECTOR_SIZE, + qed_aio_next_io, acb); return; err: diff --git a/block/vdi.c b/block/vdi.c index e1d8cff..6bb43b8 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -633,10 +633,6 @@ static void vdi_aio_read_cb(void *opaque, int ret) qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); acb->hd_aiocb = bdrv_aio_readv(bs->file, offset, &acb->hd_qiov, n_sectors, vdi_aio_read_cb, acb); - if (acb->hd_aiocb == NULL) { - ret = -EIO; - goto done; - } } return; done: @@ -708,10 +704,6 @@ static void vdi_aio_write_cb(void *opaque, int ret) qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); acb->hd_aiocb = bdrv_aio_writev(bs->file, 0, &acb->hd_qiov, 1, vdi_aio_write_cb, acb); - if (acb->hd_aiocb == NULL) { - ret = -EIO; - goto done; - } return; } else if (VDI_IS_ALLOCATED(acb->bmap_first)) { /* One or more new blocks were allocated. */ @@ -738,10 +730,6 @@ static void vdi_aio_write_cb(void *opaque, int ret) n_sectors, bmap_first); acb->hd_aiocb = bdrv_aio_writev(bs->file, offset, &acb->hd_qiov, n_sectors, vdi_aio_write_cb, acb); - if (acb->hd_aiocb == NULL) { - ret = -EIO; - goto done; - } return; } ret = 0; @@ -789,10 +777,6 @@ static void vdi_aio_write_cb(void *opaque, int ret) acb->hd_aiocb = bdrv_aio_writev(bs->file, offset, &acb->hd_qiov, s->block_sectors, vdi_aio_write_cb, acb); - if (acb->hd_aiocb == NULL) { - ret = -EIO; - goto done; - } } else { uint64_t offset = s->header.offset_data / SECTOR_SIZE + (uint64_t)bmap_entry * s->block_sectors + @@ -802,10 +786,6 @@ static void vdi_aio_write_cb(void *opaque, int ret) qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); acb->hd_aiocb = bdrv_aio_writev(bs->file, offset, &acb->hd_qiov, n_sectors, vdi_aio_write_cb, acb); - if (acb->hd_aiocb == NULL) { - ret = -EIO; - goto done; - } } return; diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c index 8af1cfd..0adb27b 100644 --- a/hw/ide/atapi.c +++ b/hw/ide/atapi.c @@ -352,14 +352,8 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret) s->bus->dma->aiocb = bdrv_aio_readv(s->bs, (int64_t)s->lba << 2, &s->bus->dma->qiov, n * 4, ide_atapi_cmd_read_dma_cb, s); - if (!s->bus->dma->aiocb) { - /* Note: media not present is the most likely case */ - ide_atapi_cmd_error(s, NOT_READY, - ASC_MEDIUM_NOT_PRESENT); - goto eot; - } - return; + eot: bdrv_acct_done(s->bs, &s->acct); s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT); diff --git a/hw/ide/core.c b/hw/ide/core.c index 49847bd..7071326 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -718,18 +718,13 @@ static void ide_flush_cb(void *opaque, int ret) void ide_flush_cache(IDEState *s) { - BlockDriverAIOCB *acb; - if (s->bs == NULL) { ide_flush_cb(s, 0); return; } bdrv_acct_start(s->bs, &s->acct, 0, BDRV_ACCT_FLUSH); - acb = bdrv_aio_flush(s->bs, ide_flush_cb, s); - if (acb == NULL) { - ide_flush_cb(s, -EIO); - } + bdrv_aio_flush(s->bs, ide_flush_cb, s); } static void ide_cfata_metadata_inquiry(IDEState *s) diff --git a/hw/ide/macio.c b/hw/ide/macio.c index c09d2e0..40f60f0 100644 --- a/hw/ide/macio.c +++ b/hw/ide/macio.c @@ -84,13 +84,6 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, int ret) m->aiocb = dma_bdrv_read(s->bs, &s->sg, (int64_t)(s->lba << 2) + (s->io_buffer_index >> 9), pmac_ide_atapi_transfer_cb, io); - if (!m->aiocb) { - qemu_sglist_destroy(&s->sg); - /* Note: media not present is the most likely case */ - ide_atapi_cmd_error(s, NOT_READY, - ASC_MEDIUM_NOT_PRESENT); - goto done; - } return; done: diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 673948c..505accd 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -217,9 +217,6 @@ static void scsi_read_data(SCSIRequest *req) 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); - if (r->req.aiocb == NULL) { - scsi_read_complete(r, -EIO); - } } /* @@ -327,9 +324,6 @@ static void scsi_write_data(SCSIRequest *req) bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_WRITE); r->req.aiocb = bdrv_aio_writev(s->qdev.conf.bs, r->sector, &r->qiov, n, scsi_write_complete, r); - if (r->req.aiocb == NULL) { - scsi_write_complete(r, -ENOMEM); - } } else { /* Called for the first time. Ask the driver to send us more data. */ scsi_write_complete(r, 0); @@ -1332,9 +1326,6 @@ static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf) scsi_req_ref(&r->req); bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BDRV_ACCT_FLUSH); r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_flush_complete, r); - if (r->req.aiocb == NULL) { - scsi_flush_complete(r, -EIO); - } return 0; case READ_6: case READ_10: diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c index e62044f..6f7d3db 100644 --- a/hw/scsi-generic.c +++ b/hw/scsi-generic.c @@ -152,10 +152,6 @@ static int execute_command(BlockDriverState *bdrv, r->io_header.flags |= SG_FLAG_DIRECT_IO; r->req.aiocb = bdrv_aio_ioctl(bdrv, SG_IO, &r->io_header, complete, r); - if (r->req.aiocb == NULL) { - BADF("execute_command: read failed !\n"); - return -ENOMEM; - } return 0; } diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index 4b0d113..ef27421 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -288,19 +288,13 @@ static void virtio_submit_multiwrite(BlockDriverState *bs, MultiReqBuffer *mrb) static void virtio_blk_handle_flush(VirtIOBlockReq *req, MultiReqBuffer *mrb) { - BlockDriverAIOCB *acb; - bdrv_acct_start(req->dev->bs, &req->acct, 0, BDRV_ACCT_FLUSH); /* * Make sure all outstanding writes are posted to the backing device. */ virtio_submit_multiwrite(req->dev->bs, mrb); - - acb = bdrv_aio_flush(req->dev->bs, virtio_blk_flush_complete, req); - if (!acb) { - virtio_blk_flush_complete(req, -EIO); - } + bdrv_aio_flush(req->dev->bs, virtio_blk_flush_complete, req); } static void virtio_blk_handle_write(VirtIOBlockReq *req, MultiReqBuffer *mrb) @@ -340,7 +334,6 @@ static void virtio_blk_handle_write(VirtIOBlockReq *req, MultiReqBuffer *mrb) static void virtio_blk_handle_read(VirtIOBlockReq *req) { - BlockDriverAIOCB *acb; uint64_t sector; sector = ldq_p(&req->out->sector); @@ -355,13 +348,9 @@ static void virtio_blk_handle_read(VirtIOBlockReq *req) virtio_blk_rw_complete(req, -EIO); return; } - - acb = bdrv_aio_readv(req->dev->bs, sector, &req->qiov, - req->qiov.size / BDRV_SECTOR_SIZE, - virtio_blk_rw_complete, req); - if (!acb) { - virtio_blk_rw_complete(req, -EIO); - } + bdrv_aio_readv(req->dev->bs, sector, &req->qiov, + req->qiov.size / BDRV_SECTOR_SIZE, + virtio_blk_rw_complete, req); } static void virtio_blk_handle_request(VirtIOBlockReq *req, diff --git a/qemu-io.c b/qemu-io.c index 622debc..ffa62fb 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -244,14 +244,10 @@ static void aio_rw_done(void *opaque, int ret) static int do_aio_readv(QEMUIOVector *qiov, int64_t offset, int *total) { - BlockDriverAIOCB *acb; int async_ret = NOT_DONE; - acb = bdrv_aio_readv(bs, offset >> 9, qiov, qiov->size >> 9, - aio_rw_done, &async_ret); - if (!acb) { - return -EIO; - } + bdrv_aio_readv(bs, offset >> 9, qiov, qiov->size >> 9, + aio_rw_done, &async_ret); while (async_ret == NOT_DONE) { qemu_aio_wait(); } @@ -262,15 +258,10 @@ static int do_aio_readv(QEMUIOVector *qiov, int64_t offset, int *total) static int do_aio_writev(QEMUIOVector *qiov, int64_t offset, int *total) { - BlockDriverAIOCB *acb; int async_ret = NOT_DONE; - acb = bdrv_aio_writev(bs, offset >> 9, qiov, qiov->size >> 9, - aio_rw_done, &async_ret); - if (!acb) { - return -EIO; - } - + bdrv_aio_writev(bs, offset >> 9, qiov, qiov->size >> 9, + aio_rw_done, &async_ret); while (async_ret == NOT_DONE) { qemu_aio_wait(); } @@ -1151,7 +1142,6 @@ static int aio_read_f(int argc, char **argv) { int nr_iov, c; struct aio_ctx *ctx = calloc(1, sizeof(struct aio_ctx)); - BlockDriverAIOCB *acb; while ((c = getopt(argc, argv, "CP:qv")) != EOF) { switch (c) { @@ -1206,14 +1196,8 @@ static int aio_read_f(int argc, char **argv) } gettimeofday(&ctx->t1, NULL); - acb = bdrv_aio_readv(bs, ctx->offset >> 9, &ctx->qiov, - ctx->qiov.size >> 9, aio_read_done, ctx); - if (!acb) { - free(ctx->buf); - free(ctx); - return -EIO; - } - + bdrv_aio_readv(bs, ctx->offset >> 9, &ctx->qiov, + ctx->qiov.size >> 9, aio_read_done, ctx); return 0; } @@ -1254,7 +1238,6 @@ static int aio_write_f(int argc, char **argv) int nr_iov, c; int pattern = 0xcd; struct aio_ctx *ctx = calloc(1, sizeof(struct aio_ctx)); - BlockDriverAIOCB *acb; while ((c = getopt(argc, argv, "CqP:")) != EOF) { switch (c) { @@ -1305,14 +1288,8 @@ static int aio_write_f(int argc, char **argv) } gettimeofday(&ctx->t1, NULL); - acb = bdrv_aio_writev(bs, ctx->offset >> 9, &ctx->qiov, - ctx->qiov.size >> 9, aio_write_done, ctx); - if (!acb) { - free(ctx->buf); - free(ctx); - return -EIO; - } - + bdrv_aio_writev(bs, ctx->offset >> 9, &ctx->qiov, + ctx->qiov.size >> 9, aio_write_done, ctx); return 0; } diff --git a/trace-events b/trace-events index bf1cf57..514849a 100644 --- a/trace-events +++ b/trace-events @@ -59,8 +59,6 @@ virtio_console_chr_event(unsigned int port, int event) "port %u, event %d" bdrv_open_common(void *bs, const char *filename, int flags, const char *format_name) "bs %p filename \"%s\" flags %#x format_name \"%s\"" multiwrite_cb(void *mcb, int ret) "mcb %p ret %d" bdrv_aio_multiwrite(void *mcb, int num_callbacks, int num_reqs) "mcb %p num_callbacks %d num_reqs %d" -bdrv_aio_multiwrite_earlyfail(void *mcb) "mcb %p" -bdrv_aio_multiwrite_latefail(void *mcb, int i) "mcb %p i %d" bdrv_aio_discard(void *bs, int64_t sector_num, int nb_sectors, void *opaque) "bs %p sector_num %"PRId64" nb_sectors %d opaque %p" bdrv_aio_flush(void *bs, void *opaque) "bs %p opaque %p" bdrv_aio_readv(void *bs, int64_t sector_num, int nb_sectors, void *opaque) "bs %p sector_num %"PRId64" nb_sectors %d opaque %p" -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 02/14] block: simplify failure handling for bdrv_aio_multiwrite 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 01/14] block: bdrv_aio_* do not return NULL Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 03/14] block: qemu_aio_get does not return NULL Kevin Wolf ` (12 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Paolo Bonzini <pbonzini@redhat.com> Now that early failure of bdrv_aio_writev is not possible anymore, mcb->num_requests can be set before the loop starts. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block.c | 28 ++-------------------------- 1 files changed, 2 insertions(+), 26 deletions(-) diff --git a/block.c b/block.c index 434c13d..16a4c42 100644 --- a/block.c +++ b/block.c @@ -2842,37 +2842,13 @@ int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs) trace_bdrv_aio_multiwrite(mcb, mcb->num_callbacks, num_reqs); - /* - * Run the aio requests. As soon as one request can't be submitted - * successfully, fail all requests that are not yet submitted (we must - * return failure for all requests anyway) - * - * num_requests cannot be set to the right value immediately: If - * bdrv_aio_writev fails for some request, num_requests would be too high - * and therefore multiwrite_cb() would never recognize the multiwrite - * request as completed. We also cannot use the loop variable i to set it - * when the first request fails because the callback may already have been - * called for previously submitted requests. Thus, num_requests must be - * incremented for each request that is submitted. - * - * The problem that callbacks may be called early also means that we need - * to take care that num_requests doesn't become 0 before all requests are - * submitted - multiwrite_cb() would consider the multiwrite request - * completed. A dummy request that is "completed" by a manual call to - * multiwrite_cb() takes care of this. - */ - mcb->num_requests = 1; - - // Run the aio requests + /* Run the aio requests. */ + mcb->num_requests = num_reqs; for (i = 0; i < num_reqs; i++) { - mcb->num_requests++; bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov, reqs[i].nb_sectors, multiwrite_cb, mcb); } - /* Complete the dummy request */ - multiwrite_cb(mcb, 0); - return 0; } -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 03/14] block: qemu_aio_get does not return NULL 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 01/14] block: bdrv_aio_* do not return NULL Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 02/14] block: simplify failure handling for bdrv_aio_multiwrite Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 04/14] dma: the passed io_func " Kevin Wolf ` (11 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Paolo Bonzini <pbonzini@redhat.com> Initially done with the following semantic patch: @ rule1 @ expression E; statement S; @@ E = qemu_aio_get (...); ( - if (E == NULL) { ... } | - if (E) { <... S ...> } ) which however missed occurrences in linux-aio.c and posix-aio-compat.c. Those were done by hand. The change in vdi_aio_setup's caller was also done by hand. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/curl.c | 4 ---- block/rbd.c | 3 --- block/vdi.c | 46 ++++++++++++++++++---------------------------- linux-aio.c | 2 -- posix-aio-compat.c | 4 ---- 5 files changed, 18 insertions(+), 41 deletions(-) diff --git a/block/curl.c b/block/curl.c index 4209ac8..e9102e3 100644 --- a/block/curl.c +++ b/block/curl.c @@ -509,10 +509,6 @@ static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs, acb = qemu_aio_get(&curl_aio_pool, bs, cb, opaque); - if (!acb) { - return NULL; - } - acb->qiov = qiov; acb->sector_num = sector_num; acb->nb_sectors = nb_sectors; diff --git a/block/rbd.c b/block/rbd.c index 9088c52..312584a 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -632,9 +632,6 @@ static BlockDriverAIOCB *rbd_aio_rw_vector(BlockDriverState *bs, BDRVRBDState *s = bs->opaque; acb = qemu_aio_get(&rbd_aio_pool, bs, cb, opaque); - if (!acb) { - return NULL; - } acb->write = write; acb->qiov = qiov; acb->bounce = qemu_blockalign(bs, qiov->size); diff --git a/block/vdi.c b/block/vdi.c index 6bb43b8..31cdfab 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -515,28 +515,26 @@ static VdiAIOCB *vdi_aio_setup(BlockDriverState *bs, int64_t sector_num, bs, sector_num, qiov, nb_sectors, cb, opaque, is_write); acb = qemu_aio_get(&vdi_aio_pool, bs, cb, opaque); - if (acb) { - acb->hd_aiocb = NULL; - acb->sector_num = sector_num; - acb->qiov = qiov; - acb->is_write = is_write; - - if (qiov->niov > 1) { - acb->buf = qemu_blockalign(bs, qiov->size); - acb->orig_buf = acb->buf; - if (is_write) { - qemu_iovec_to_buffer(qiov, acb->buf); - } - } else { - acb->buf = (uint8_t *)qiov->iov->iov_base; + acb->hd_aiocb = NULL; + acb->sector_num = sector_num; + acb->qiov = qiov; + acb->is_write = is_write; + + if (qiov->niov > 1) { + acb->buf = qemu_blockalign(bs, qiov->size); + acb->orig_buf = acb->buf; + if (is_write) { + qemu_iovec_to_buffer(qiov, acb->buf); } - acb->nb_sectors = nb_sectors; - acb->n_sectors = 0; - acb->bmap_first = VDI_UNALLOCATED; - acb->bmap_last = VDI_UNALLOCATED; - acb->block_buffer = NULL; - acb->header_modified = 0; - } + } else { + acb->buf = (uint8_t *)qiov->iov->iov_base; + } + acb->nb_sectors = nb_sectors; + acb->n_sectors = 0; + acb->bmap_first = VDI_UNALLOCATED; + acb->bmap_last = VDI_UNALLOCATED; + acb->block_buffer = NULL; + acb->header_modified = 0; return acb; } @@ -653,10 +651,6 @@ static BlockDriverAIOCB *vdi_aio_readv(BlockDriverState *bs, logout("\n"); acb = vdi_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0); - if (!acb) { - return NULL; - } - ret = vdi_schedule_bh(vdi_aio_rw_bh, acb); if (ret < 0) { if (acb->qiov->niov > 1) { @@ -807,10 +801,6 @@ static BlockDriverAIOCB *vdi_aio_writev(BlockDriverState *bs, logout("\n"); acb = vdi_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 1); - if (!acb) { - return NULL; - } - ret = vdi_schedule_bh(vdi_aio_rw_bh, acb); if (ret < 0) { if (acb->qiov->niov > 1) { diff --git a/linux-aio.c b/linux-aio.c index 1c635ef..d2fc2e7 100644 --- a/linux-aio.c +++ b/linux-aio.c @@ -166,8 +166,6 @@ BlockDriverAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd, off_t offset = sector_num * 512; laiocb = qemu_aio_get(&laio_pool, bs, cb, opaque); - if (!laiocb) - return NULL; laiocb->nbytes = nb_sectors * 512; laiocb->ctx = s; laiocb->ret = -EINPROGRESS; diff --git a/posix-aio-compat.c b/posix-aio-compat.c index c380ec1..cccb673 100644 --- a/posix-aio-compat.c +++ b/posix-aio-compat.c @@ -611,8 +611,6 @@ BlockDriverAIOCB *paio_submit(BlockDriverState *bs, int fd, struct qemu_paiocb *acb; acb = qemu_aio_get(&raw_aio_pool, bs, cb, opaque); - if (!acb) - return NULL; acb->aio_type = type; acb->aio_fildes = fd; @@ -638,8 +636,6 @@ BlockDriverAIOCB *paio_ioctl(BlockDriverState *bs, int fd, struct qemu_paiocb *acb; acb = qemu_aio_get(&raw_aio_pool, bs, cb, opaque); - if (!acb) - return NULL; acb->aio_type = QEMU_AIO_IOCTL; acb->aio_fildes = fd; acb->aio_offset = 0; -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 04/14] dma: the passed io_func does not return NULL 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (2 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 03/14] block: qemu_aio_get does not return NULL Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 05/14] block: dma_bdrv_* " Kevin Wolf ` (10 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Paolo Bonzini <pbonzini@redhat.com> Initially found with the following semantic patch: @ type @ BlockDriverAIOCB *x; expression E; @@ x = E; - if (x == NULL) { ... } @ acb1 @ expression E, E1; @@ E1->acb = E; - if (E1->acb == NULL) { ... } @ aiocb1 @ expression E, E1; @@ E1->aiocb = E; - if (E1->aiocb == NULL) { ... } @ acb @ expression E, E1; @@ E1.acb = E; - if (E1.acb == NULL) { ... } @ aiocb @ expression E, E1; @@ E1.aiocb = E; - if (E1.aiocb == NULL) { ... } but changed manually to include an assert. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- dma-helpers.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/dma-helpers.c b/dma-helpers.c index 9d6b6fa..f08cdb5 100644 --- a/dma-helpers.c +++ b/dma-helpers.c @@ -142,9 +142,7 @@ static void dma_bdrv_cb(void *opaque, int ret) dbs->acb = dbs->io_func(dbs->bs, dbs->sector_num, &dbs->iov, dbs->iov.size / 512, dma_bdrv_cb, dbs); - if (!dbs->acb) { - dma_complete(dbs, -EIO); - } + assert(dbs->acb); } static void dma_aio_cancel(BlockDriverAIOCB *acb) -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 05/14] block: dma_bdrv_* does not return NULL 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (3 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 04/14] dma: the passed io_func " Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 06/14] block: avoid useless checks on acb->bh Kevin Wolf ` (9 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Paolo Bonzini <pbonzini@redhat.com> Initially attempted with the following semantic patch: @ rule1 @ expression E; statement S; @@ E = ( dma_bdrv_io | dma_bdrv_read | dma_bdrv_write ) (...); ( - if (E == NULL) { ... } | - if (E) { <... S ...> } ) which however did not match anything. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- hw/ide/core.c | 6 ------ hw/ide/macio.c | 4 +--- 2 files changed, 1 insertions(+), 9 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index 7071326..de9ed41 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -549,7 +549,6 @@ void ide_dma_cb(void *opaque, int ret) int n; int64_t sector_num; -handle_rw_error: if (ret < 0) { int op = BM_STATUS_DMA_RETRY; @@ -608,11 +607,6 @@ handle_rw_error: ide_issue_trim, ide_dma_cb, s, true); break; } - - if (!s->bus->dma->aiocb) { - ret = -1; - goto handle_rw_error; - } return; eot: diff --git a/hw/ide/macio.c b/hw/ide/macio.c index 40f60f0..abbc41b 100644 --- a/hw/ide/macio.c +++ b/hw/ide/macio.c @@ -152,10 +152,8 @@ static void pmac_ide_transfer_cb(void *opaque, int ret) ide_issue_trim, pmac_ide_transfer_cb, s, true); break; } - - if (!m->aiocb) - pmac_ide_transfer_cb(io, -1); return; + done: if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) { bdrv_acct_done(s->bs, &s->acct); -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 06/14] block: avoid useless checks on acb->bh 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (4 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 05/14] block: dma_bdrv_* " Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 07/14] block/qcow2.c: call qcow2_free_snapshots in the function of qcow2_close Kevin Wolf ` (8 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Paolo Bonzini <pbonzini@redhat.com> Coverity is confused by this "if" and reports leaks on acb->bh. The bottom half is always deleted before releasing the AIOCB, in either bdrv_aio_cancel_em or bdrv_aio_bh_cb. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/block.c b/block.c index 16a4c42..3f072f6 100644 --- a/block.c +++ b/block.c @@ -3077,9 +3077,7 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs, acb->is_write = is_write; acb->qiov = qiov; acb->bounce = qemu_blockalign(bs, qiov->size); - - if (!acb->bh) - acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb); + acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb); if (is_write) { qemu_iovec_to_buffer(acb->qiov, acb->bounce); -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 07/14] block/qcow2.c: call qcow2_free_snapshots in the function of qcow2_close 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (5 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 06/14] block: avoid useless checks on acb->bh Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 08/14] rbd: always set out parameter in qemu_rbd_snap_list Kevin Wolf ` (7 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Li Zhi Hui <zhihuili@linux.vnet.ibm.com> Signed-off-by: Li Zhi Hui <zhihuili@linux.vnet.ibm.com> Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/qcow2.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 37cd442..aa32e8d 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -635,6 +635,7 @@ static void qcow2_close(BlockDriverState *bs) g_free(s->cluster_cache); qemu_vfree(s->cluster_data); qcow2_refcount_close(bs); + qcow2_free_snapshots(bs); } static void qcow2_invalidate_cache(BlockDriverState *bs) -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 08/14] rbd: always set out parameter in qemu_rbd_snap_list 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (6 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 07/14] block/qcow2.c: call qcow2_free_snapshots in the function of qcow2_close Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 09/14] qemu-img rebase: Fix for undersized backing files Kevin Wolf ` (6 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Josh Durgin <josh.durgin@dreamhost.com> The caller expects psn_tab to be NULL when there are no snapshots or an error occurs. This results in calling g_free on an invalid address. Reported-by: Oliver Francke <Oliver@filoo.de> Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/rbd.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/block/rbd.c b/block/rbd.c index 312584a..7a2384c 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -805,7 +805,7 @@ static int qemu_rbd_snap_list(BlockDriverState *bs, } while (snap_count == -ERANGE); if (snap_count <= 0) { - return snap_count; + goto done; } sn_tab = g_malloc0(snap_count * sizeof(QEMUSnapshotInfo)); @@ -824,6 +824,7 @@ static int qemu_rbd_snap_list(BlockDriverState *bs, } rbd_snap_list_end(snaps); + done: *psn_tab = sn_tab; return snap_count; } -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 09/14] qemu-img rebase: Fix for undersized backing files 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (7 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 08/14] rbd: always set out parameter in qemu_rbd_snap_list Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 10/14] Documentation: Add qemu-img -t parameter in man page Kevin Wolf ` (5 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel Backing files may be smaller than the corresponding COW file. When reading directly from the backing file, qemu-img rebase must consider this and assume zero sectors after the end of backing files. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> --- qemu-img.c | 42 +++++++++++++++++++++++++++++++++--------- 1 files changed, 33 insertions(+), 9 deletions(-) diff --git a/qemu-img.c b/qemu-img.c index 8bdae66..01cc0d3 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -1420,6 +1420,8 @@ static int img_rebase(int argc, char **argv) */ if (!unsafe) { uint64_t num_sectors; + uint64_t old_backing_num_sectors; + uint64_t new_backing_num_sectors; uint64_t sector; int n; uint8_t * buf_old; @@ -1430,6 +1432,8 @@ static int img_rebase(int argc, char **argv) buf_new = qemu_blockalign(bs, IO_BUF_SIZE); bdrv_get_geometry(bs, &num_sectors); + bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors); + bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors); local_progress = (float)100 / (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512)); @@ -1448,16 +1452,36 @@ static int img_rebase(int argc, char **argv) continue; } - /* Read old and new backing file */ - ret = bdrv_read(bs_old_backing, sector, buf_old, n); - if (ret < 0) { - error_report("error while reading from old backing file"); - goto out; + /* + * Read old and new backing file and take into consideration that + * backing files may be smaller than the COW image. + */ + if (sector >= old_backing_num_sectors) { + memset(buf_old, 0, n * BDRV_SECTOR_SIZE); + } else { + if (sector + n > old_backing_num_sectors) { + n = old_backing_num_sectors - sector; + } + + ret = bdrv_read(bs_old_backing, sector, buf_old, n); + if (ret < 0) { + error_report("error while reading from old backing file"); + goto out; + } } - ret = bdrv_read(bs_new_backing, sector, buf_new, n); - if (ret < 0) { - error_report("error while reading from new backing file"); - goto out; + + if (sector >= new_backing_num_sectors) { + memset(buf_new, 0, n * BDRV_SECTOR_SIZE); + } else { + if (sector + n > new_backing_num_sectors) { + n = new_backing_num_sectors - sector; + } + + ret = bdrv_read(bs_new_backing, sector, buf_new, n); + if (ret < 0) { + error_report("error while reading from new backing file"); + goto out; + } } /* If they differ, we need to write to the COW file */ -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 10/14] Documentation: Add qemu-img -t parameter in man page 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (8 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 09/14] qemu-img rebase: Fix for undersized backing files Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 11/14] qcow2: Allow >4 GB VM state Kevin Wolf ` (4 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> --- qemu-img-cmds.hx | 6 +++--- qemu-img.texi | 10 +++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx index 4be00a5..49dce7c 100644 --- a/qemu-img-cmds.hx +++ b/qemu-img-cmds.hx @@ -24,13 +24,13 @@ ETEXI DEF("commit", img_commit, "commit [-f fmt] [-t cache] filename") STEXI -@item commit [-f @var{fmt}] @var{filename} +@item commit [-f @var{fmt}] [-t @var{cache}] @var{filename} ETEXI DEF("convert", img_convert, "convert [-c] [-p] [-f fmt] [-t cache] [-O output_fmt] [-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]] output_filename") STEXI -@item convert [-c] [-p] [-f @var{fmt}] [-O @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S @var{sparse_size}] @var{filename} [@var{filename2} [...]] @var{output_filename} +@item convert [-c] [-p] [-f @var{fmt}] [-t @var{cache}] [-O @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S @var{sparse_size}] @var{filename} [@var{filename2} [...]] @var{output_filename} ETEXI DEF("info", img_info, @@ -48,7 +48,7 @@ ETEXI DEF("rebase", img_rebase, "rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename") STEXI -@item rebase [-f @var{fmt}] [-p] [-u] -b @var{backing_file} [-F @var{backing_fmt}] @var{filename} +@item rebase [-f @var{fmt}] [-t @var{cache}] [-p] [-u] -b @var{backing_file} [-F @var{backing_fmt}] @var{filename} ETEXI DEF("resize", img_resize, diff --git a/qemu-img.texi b/qemu-img.texi index 70fa321..b2ca3a5 100644 --- a/qemu-img.texi +++ b/qemu-img.texi @@ -45,6 +45,10 @@ indicates the consecutive number of bytes that must contain only zeros for qemu-img to create a sparse image during conversion. This value is rounded down to the nearest 512 bytes. You may use the common size suffixes like @code{k} for kilobytes. +@item -t @var{cache} +specifies the cache mode that should be used with the (destination) file. See +the documentation of the emulator's @code{-drive cache=...} option for allowed +values. @end table Parameters to snapshot subcommand: @@ -87,11 +91,11 @@ this case. @var{backing_file} will never be modified unless you use the The size can also be specified using the @var{size} option with @code{-o}, it doesn't need to be specified separately in this case. -@item commit [-f @var{fmt}] @var{filename} +@item commit [-f @var{fmt}] [-t @var{cache}] @var{filename} Commit the changes recorded in @var{filename} in its base image. -@item convert [-c] [-p] [-f @var{fmt}] [-O @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S @var{sparse_size}] @var{filename} [@var{filename2} [...]] @var{output_filename} +@item convert [-c] [-p] [-f @var{fmt}] [-t @var{cache}] [-O @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S @var{sparse_size}] @var{filename} [@var{filename2} [...]] @var{output_filename} Convert the disk image @var{filename} or a snapshot @var{snapshot_name} to disk image @var{output_filename} using format @var{output_fmt}. It can be optionally compressed (@code{-c} @@ -121,7 +125,7 @@ they are displayed too. List, apply, create or delete snapshots in image @var{filename}. -@item rebase [-f @var{fmt}] [-p] [-u] -b @var{backing_file} [-F @var{backing_fmt}] @var{filename} +@item rebase [-f @var{fmt}] [-t @var{cache}] [-p] [-u] -b @var{backing_file} [-F @var{backing_fmt}] @var{filename} Changes the backing file of an image. Only the formats @code{qcow2} and @code{qed} support changing the backing file. -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 11/14] qcow2: Allow >4 GB VM state 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (9 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 10/14] Documentation: Add qemu-img -t parameter in man page Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 12/14] coroutine: switch per-thread free pool to a global pool Kevin Wolf ` (3 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel This is a compatible extension to the snapshot header format that allows saving a 64 bit VM state size. Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block.h | 2 +- block/qcow2-snapshot.c | 34 ++++++++++++++++++++++++++++++++-- block/qcow2.h | 2 +- docs/specs/qcow2.txt | 8 +++++++- savevm.c | 2 +- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/block.h b/block.h index 0e3ff9f..3bd4398 100644 --- a/block.h +++ b/block.h @@ -22,7 +22,7 @@ typedef struct QEMUSnapshotInfo { /* the following fields are informative. They are not needed for the consistency of the snapshot */ char name[256]; /* user chosen name */ - uint32_t vm_state_size; /* VM state info size */ + uint64_t vm_state_size; /* VM state info size */ uint32_t date_sec; /* UTC date of the snapshot */ uint32_t date_nsec; uint64_t vm_clock_nsec; /* VM clock relative to boot */ diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c index c3112bf..7d3fde5 100644 --- a/block/qcow2-snapshot.c +++ b/block/qcow2-snapshot.c @@ -46,6 +46,10 @@ typedef struct QEMU_PACKED QCowSnapshotHeader { /* name follows */ } QCowSnapshotHeader; +typedef struct QEMU_PACKED QCowSnapshotExtraData { + uint64_t vm_state_size_large; +} QCowSnapshotExtraData; + void qcow2_free_snapshots(BlockDriverState *bs) { BDRVQcowState *s = bs->opaque; @@ -64,6 +68,7 @@ int qcow2_read_snapshots(BlockDriverState *bs) { BDRVQcowState *s = bs->opaque; QCowSnapshotHeader h; + QCowSnapshotExtraData extra; QCowSnapshot *sn; int i, id_str_size, name_size; int64_t offset; @@ -100,9 +105,18 @@ int qcow2_read_snapshots(BlockDriverState *bs) id_str_size = be16_to_cpu(h.id_str_size); name_size = be16_to_cpu(h.name_size); - /* Skip extra data */ + /* Read extra data */ + ret = bdrv_pread(bs->file, offset, &extra, + MIN(sizeof(extra), extra_data_size)); + if (ret < 0) { + goto fail; + } offset += extra_data_size; + if (extra_data_size >= 8) { + sn->vm_state_size = be64_to_cpu(extra.vm_state_size_large); + } + /* Read snapshot ID */ sn->id_str = g_malloc(id_str_size + 1); ret = bdrv_pread(bs->file, offset, sn->id_str, id_str_size); @@ -136,6 +150,7 @@ static int qcow2_write_snapshots(BlockDriverState *bs) BDRVQcowState *s = bs->opaque; QCowSnapshot *sn; QCowSnapshotHeader h; + QCowSnapshotExtraData extra; int i, name_size, id_str_size, snapshots_size; struct { uint32_t nb_snapshots; @@ -150,6 +165,7 @@ static int qcow2_write_snapshots(BlockDriverState *bs) sn = s->snapshots + i; offset = align_offset(offset, 8); offset += sizeof(h); + offset += sizeof(extra); offset += strlen(sn->id_str); offset += strlen(sn->name); } @@ -169,10 +185,18 @@ static int qcow2_write_snapshots(BlockDriverState *bs) memset(&h, 0, sizeof(h)); h.l1_table_offset = cpu_to_be64(sn->l1_table_offset); h.l1_size = cpu_to_be32(sn->l1_size); - h.vm_state_size = cpu_to_be32(sn->vm_state_size); + /* If it doesn't fit in 32 bit, older implementations should treat it + * as a disk-only snapshot rather than truncate the VM state */ + if (sn->vm_state_size <= 0xffffffff) { + h.vm_state_size = cpu_to_be32(sn->vm_state_size); + } h.date_sec = cpu_to_be32(sn->date_sec); h.date_nsec = cpu_to_be32(sn->date_nsec); h.vm_clock_nsec = cpu_to_be64(sn->vm_clock_nsec); + h.extra_data_size = cpu_to_be32(sizeof(extra)); + + memset(&extra, 0, sizeof(extra)); + extra.vm_state_size_large = cpu_to_be64(sn->vm_state_size); id_str_size = strlen(sn->id_str); name_size = strlen(sn->name); @@ -186,6 +210,12 @@ static int qcow2_write_snapshots(BlockDriverState *bs) } offset += sizeof(h); + ret = bdrv_pwrite(bs->file, offset, &extra, sizeof(extra)); + if (ret < 0) { + goto fail; + } + offset += sizeof(extra); + ret = bdrv_pwrite(bs->file, offset, sn->id_str, id_str_size); if (ret < 0) { goto fail; diff --git a/block/qcow2.h b/block/qcow2.h index 4e44eea..99e4536 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -78,7 +78,7 @@ typedef struct QCowSnapshot { uint32_t l1_size; char *id_str; char *name; - uint32_t vm_state_size; + uint64_t vm_state_size; uint32_t date_sec; uint32_t date_nsec; uint64_t vm_clock_nsec; diff --git a/docs/specs/qcow2.txt b/docs/specs/qcow2.txt index e792953..b6adcad 100644 --- a/docs/specs/qcow2.txt +++ b/docs/specs/qcow2.txt @@ -253,7 +253,13 @@ Snapshot table entry: 36 - 39: Size of extra data in the table entry (used for future extensions of the format) - variable: Extra data for future extensions. Must be ignored. + variable: Extra data for future extensions. Unknown fields must be + ignored. Currently defined are (offset relative to snapshot + table entry): + + Byte 40 - 47: Size of the VM state in bytes. 0 if no VM + state is saved. If this field is present, + the 32-bit value in bytes 32-35 is ignored. variable: Unique ID string for the snapshot (not null terminated) diff --git a/savevm.c b/savevm.c index b72f6c0..f153c25 100644 --- a/savevm.c +++ b/savevm.c @@ -2002,7 +2002,7 @@ void do_savevm(Monitor *mon, const QDict *qdict) int ret; QEMUFile *f; int saved_vm_running; - uint32_t vm_state_size; + uint64_t vm_state_size; #ifdef _WIN32 struct _timeb tb; struct tm *ptm; -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 12/14] coroutine: switch per-thread free pool to a global pool 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (10 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 11/14] qcow2: Allow >4 GB VM state Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 13/14] block/cow: Return real error code Kevin Wolf ` (2 subsequent siblings) 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Avi Kivity <avi@redhat.com> ucontext-based coroutines use a free pool to reduce allocations and deallocations of coroutine objects. The pool is per-thread, presumably to improve locality. However, as coroutines are usually allocated in a vcpu thread and freed in the I/O thread, the pool accounting gets screwed up and we end allocating and freeing a coroutine for every I/O request. This is expensive since large objects are allocated via the kernel, and are not cached by the C runtime. Fix by switching to a global pool. This is safe since we're protected by the global mutex. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- coroutine-ucontext.c | 30 ++++++++++++++++-------------- 1 files changed, 16 insertions(+), 14 deletions(-) diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c index 2b8d3e9..3d01075 100644 --- a/coroutine-ucontext.c +++ b/coroutine-ucontext.c @@ -35,6 +35,10 @@ enum { POOL_MAX_SIZE = 64, }; +/** Free list to speed up creation */ +static QLIST_HEAD(, Coroutine) pool = QLIST_HEAD_INITIALIZER(pool); +static unsigned int pool_size; + typedef struct { Coroutine base; void *stack; @@ -48,10 +52,6 @@ typedef struct { /** Currently executing coroutine */ Coroutine *current; - /** Free list to speed up creation */ - QLIST_HEAD(, Coroutine) pool; - unsigned int pool_size; - /** The default coroutine */ CoroutineUContext leader; } CoroutineThreadState; @@ -75,7 +75,6 @@ static CoroutineThreadState *coroutine_get_thread_state(void) if (!s) { s = g_malloc0(sizeof(*s)); s->current = &s->leader.base; - QLIST_INIT(&s->pool); pthread_setspecific(thread_state_key, s); } return s; @@ -84,14 +83,19 @@ static CoroutineThreadState *coroutine_get_thread_state(void) static void qemu_coroutine_thread_cleanup(void *opaque) { CoroutineThreadState *s = opaque; + + g_free(s); +} + +static void __attribute__((destructor)) coroutine_cleanup(void) +{ Coroutine *co; Coroutine *tmp; - QLIST_FOREACH_SAFE(co, &s->pool, pool_next, tmp) { + QLIST_FOREACH_SAFE(co, &pool, pool_next, tmp) { g_free(DO_UPCAST(CoroutineUContext, base, co)->stack); g_free(co); } - g_free(s); } static void __attribute__((constructor)) coroutine_init(void) @@ -169,13 +173,12 @@ static Coroutine *coroutine_new(void) Coroutine *qemu_coroutine_new(void) { - CoroutineThreadState *s = coroutine_get_thread_state(); Coroutine *co; - co = QLIST_FIRST(&s->pool); + co = QLIST_FIRST(&pool); if (co) { QLIST_REMOVE(co, pool_next); - s->pool_size--; + pool_size--; } else { co = coroutine_new(); } @@ -184,13 +187,12 @@ Coroutine *qemu_coroutine_new(void) void qemu_coroutine_delete(Coroutine *co_) { - CoroutineThreadState *s = coroutine_get_thread_state(); CoroutineUContext *co = DO_UPCAST(CoroutineUContext, base, co_); - if (s->pool_size < POOL_MAX_SIZE) { - QLIST_INSERT_HEAD(&s->pool, &co->base, pool_next); + if (pool_size < POOL_MAX_SIZE) { + QLIST_INSERT_HEAD(&pool, &co->base, pool_next); co->base.caller = NULL; - s->pool_size++; + pool_size++; return; } -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 13/14] block/cow: Return real error code 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (11 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 12/14] coroutine: switch per-thread free pool to a global pool Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 14/14] qiov: prevent double free or use-after-free Kevin Wolf 2011-12-19 15:44 ` [Qemu-devel] [PULL 00/14] Block patches Anthony Liguori 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Li Zhi Hui <zhihuili@linux.vnet.ibm.com> Signed-off-by: Li Zhi Hui <zhihuili@linux.vnet.ibm.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/cow.c | 44 +++++++++++++++++++++++++++++--------------- 1 files changed, 29 insertions(+), 15 deletions(-) diff --git a/block/cow.c b/block/cow.c index 3c52735..bb5927c 100644 --- a/block/cow.c +++ b/block/cow.c @@ -64,15 +64,26 @@ static int cow_open(BlockDriverState *bs, int flags) struct cow_header_v2 cow_header; int bitmap_size; int64_t size; + int ret; /* see if it is a cow image */ - if (bdrv_pread(bs->file, 0, &cow_header, sizeof(cow_header)) != - sizeof(cow_header)) { + ret = bdrv_pread(bs->file, 0, &cow_header, sizeof(cow_header)); + if (ret < 0) { + goto fail; + } + + if (be32_to_cpu(cow_header.magic) != COW_MAGIC) { + ret = -EINVAL; goto fail; } - if (be32_to_cpu(cow_header.magic) != COW_MAGIC || - be32_to_cpu(cow_header.version) != COW_VERSION) { + if (be32_to_cpu(cow_header.version) != COW_VERSION) { + char version[64]; + snprintf(version, sizeof(version), + "COW version %d", cow_header.version); + qerror_report(QERR_UNKNOWN_BLOCK_FORMAT_FEATURE, + bs->device_name, "cow", version); + ret = -ENOTSUP; goto fail; } @@ -88,7 +99,7 @@ static int cow_open(BlockDriverState *bs, int flags) qemu_co_mutex_init(&s->lock); return 0; fail: - return -1; + return ret; } /* @@ -182,17 +193,19 @@ static int coroutine_fn cow_read(BlockDriverState *bs, int64_t sector_num, ret = bdrv_pread(bs->file, s->cow_sectors_offset + sector_num * 512, buf, n * 512); - if (ret != n * 512) - return -1; + if (ret < 0) { + return ret; + } } else { if (bs->backing_hd) { /* read from the base image */ ret = bdrv_read(bs->backing_hd, sector_num, buf, n); - if (ret < 0) - return -1; + if (ret < 0) { + return ret; + } } else { - memset(buf, 0, n * 512); - } + memset(buf, 0, n * 512); + } } nb_sectors -= n; sector_num += n; @@ -220,8 +233,9 @@ static int cow_write(BlockDriverState *bs, int64_t sector_num, ret = bdrv_pwrite(bs->file, s->cow_sectors_offset + sector_num * 512, buf, nb_sectors * 512); - if (ret != nb_sectors * 512) - return -1; + if (ret < 0) { + return ret; + } return cow_update_bitmap(bs, sector_num, nb_sectors); } @@ -288,14 +302,14 @@ static int cow_create(const char *filename, QEMUOptionParameter *options) cow_header.sectorsize = cpu_to_be32(512); cow_header.size = cpu_to_be64(image_sectors * 512); ret = bdrv_pwrite(cow_bs, 0, &cow_header, sizeof(cow_header)); - if (ret != sizeof(cow_header)) { + if (ret < 0) { goto exit; } /* resize to include at least all the bitmap */ ret = bdrv_truncate(cow_bs, sizeof(cow_header) + ((image_sectors + 7) >> 3)); - if (ret) { + if (ret < 0) { goto exit; } -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH 14/14] qiov: prevent double free or use-after-free 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (12 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 13/14] block/cow: Return real error code Kevin Wolf @ 2011-12-15 14:09 ` Kevin Wolf 2011-12-19 15:44 ` [Qemu-devel] [PULL 00/14] Block patches Anthony Liguori 14 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2011-12-15 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel From: Paolo Bonzini <pbonzini@redhat.com> qemu_iovec_destroy does not clear the QEMUIOVector fully, and the data could thus be used after free or freed again. While I do not know any example in the tree, I observed this using virtio-scsi (and SCSI scatter/gather) when canceling DMA requests. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- cutils.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/cutils.c b/cutils.c index 6db6304..24b3fe3 100644 --- a/cutils.c +++ b/cutils.c @@ -217,7 +217,10 @@ void qemu_iovec_destroy(QEMUIOVector *qiov) { assert(qiov->nalloc != -1); + qemu_iovec_reset(qiov); g_free(qiov->iov); + qiov->nalloc = 0; + qiov->iov = NULL; } void qemu_iovec_reset(QEMUIOVector *qiov) -- 1.7.6.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PULL 00/14] Block patches 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf ` (13 preceding siblings ...) 2011-12-15 14:09 ` [Qemu-devel] [PATCH 14/14] qiov: prevent double free or use-after-free Kevin Wolf @ 2011-12-19 15:44 ` Anthony Liguori 14 siblings, 0 replies; 27+ messages in thread From: Anthony Liguori @ 2011-12-19 15:44 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel On 12/15/2011 08:09 AM, Kevin Wolf wrote: > The following changes since commit 222f23f508a8d778f56eddef14752dfd26d225b4: > > tcg/arm: remove fixed map code buffer restriction (2011-12-14 21:58:18 +0100) > > are available in the git repository at: > git://repo.or.cz/qemu/kevin.git for-anthony Pulled. Thanks. Regards, Anthony Liguori > > Avi Kivity (1): > coroutine: switch per-thread free pool to a global pool > > Josh Durgin (1): > rbd: always set out parameter in qemu_rbd_snap_list > > Kevin Wolf (3): > qemu-img rebase: Fix for undersized backing files > Documentation: Add qemu-img -t parameter in man page > qcow2: Allow>4 GB VM state > > Li Zhi Hui (2): > block/qcow2.c: call qcow2_free_snapshots in the function of qcow2_close > block/cow: Return real error code > > Paolo Bonzini (7): > block: bdrv_aio_* do not return NULL > block: simplify failure handling for bdrv_aio_multiwrite > block: qemu_aio_get does not return NULL > dma: the passed io_func does not return NULL > block: dma_bdrv_* does not return NULL > block: avoid useless checks on acb->bh > qiov: prevent double free or use-after-free > > block-migration.c | 13 --------- > block.c | 56 +++------------------------------------- > block.h | 2 +- > block/blkverify.c | 24 ++++++----------- > block/cow.c | 44 +++++++++++++++++++++----------- > block/curl.c | 4 --- > block/qcow2-snapshot.c | 34 +++++++++++++++++++++++- > block/qcow2.c | 1 + > block/qcow2.h | 2 +- > block/qed-table.c | 22 +++++----------- > block/qed.c | 60 +++++++++++-------------------------------- > block/rbd.c | 6 +--- > block/vdi.c | 66 +++++++++++++---------------------------------- > coroutine-ucontext.c | 30 +++++++++++---------- > cutils.c | 3 ++ > dma-helpers.c | 4 +-- > docs/specs/qcow2.txt | 8 +++++- > hw/ide/atapi.c | 8 +----- > hw/ide/core.c | 13 +-------- > hw/ide/macio.c | 11 +------- > hw/scsi-disk.c | 9 ------ > hw/scsi-generic.c | 4 --- > hw/virtio-blk.c | 19 +++----------- > linux-aio.c | 2 - > posix-aio-compat.c | 4 --- > qemu-img-cmds.hx | 6 ++-- > qemu-img.c | 42 ++++++++++++++++++++++++------ > qemu-img.texi | 10 +++++-- > qemu-io.c | 39 ++++++---------------------- > savevm.c | 2 +- > trace-events | 2 - > 31 files changed, 205 insertions(+), 345 deletions(-) > > ^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PULL 00/14] Block patches @ 2017-01-04 13:34 Stefan Hajnoczi 2017-01-05 13:57 ` Peter Maydell 0 siblings, 1 reply; 27+ messages in thread From: Stefan Hajnoczi @ 2017-01-04 13:34 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi The following changes since commit dbe2b65566e76d3c3a0c3358285c0336ac61e757: Merge remote-tracking branch 'remotes/vivier/tags/m68k-for-2.9-pull-request' into staging (2016-12-28 17:11:11 +0000) are available in the git repository at: git://github.com/stefanha/qemu.git tags/block-pull-request for you to fetch changes up to 5e5db49953e31689c1c70060870f0a7a6de26fcb: iothread: add poll-grow and poll-shrink parameters (2017-01-03 16:38:50 +0000) ---------------------------------------------------------------- ---------------------------------------------------------------- Stefan Hajnoczi (14): HACKING: document #include order aio: add flag to skip fds to aio_dispatch() aio: add AioPollFn and io_poll() interface aio: add polling mode to AioContext virtio: poll virtqueues for new buffers linux-aio: poll ring for completions iothread: add polling parameters virtio-blk: suppress virtqueue kick during processing virtio-scsi: suppress virtqueue kick during processing virtio: turn vq->notification into a nested counter aio: add .io_poll_begin/end() callbacks virtio: disable virtqueue notifications during polling aio: self-tune polling time iothread: add poll-grow and poll-shrink parameters include/block/aio.h | 53 +++++++- include/sysemu/iothread.h | 5 + aio-posix.c | 308 +++++++++++++++++++++++++++++++++++++++----- aio-win32.c | 32 ++++- async.c | 21 ++- block/curl.c | 8 +- block/iscsi.c | 3 +- block/linux-aio.c | 19 ++- block/nbd-client.c | 8 +- block/nfs.c | 7 +- block/sheepdog.c | 26 ++-- block/ssh.c | 4 +- block/win32-aio.c | 4 +- hw/block/virtio-blk.c | 18 ++- hw/scsi/virtio-scsi.c | 36 +++--- hw/virtio/virtio.c | 54 ++++++-- iohandler.c | 2 +- iothread.c | 84 ++++++++++++ nbd/server.c | 9 +- stubs/set-fd-handler.c | 1 + tests/test-aio.c | 4 +- util/event_notifier-posix.c | 2 +- HACKING | 18 +++ trace-events | 6 + 24 files changed, 622 insertions(+), 110 deletions(-) -- 2.9.3 ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PULL 00/14] Block patches 2017-01-04 13:34 Stefan Hajnoczi @ 2017-01-05 13:57 ` Peter Maydell 0 siblings, 0 replies; 27+ messages in thread From: Peter Maydell @ 2017-01-05 13:57 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers On 4 January 2017 at 13:34, Stefan Hajnoczi <stefanha@redhat.com> wrote: > The following changes since commit dbe2b65566e76d3c3a0c3358285c0336ac61e757: > > Merge remote-tracking branch 'remotes/vivier/tags/m68k-for-2.9-pull-request' into staging (2016-12-28 17:11:11 +0000) > > are available in the git repository at: > > git://github.com/stefanha/qemu.git tags/block-pull-request > > for you to fetch changes up to 5e5db49953e31689c1c70060870f0a7a6de26fcb: > > iothread: add poll-grow and poll-shrink parameters (2017-01-03 16:38:50 +0000) > > ---------------------------------------------------------------- > > ---------------------------------------------------------------- Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PULL 00/14] Block patches @ 2016-07-20 0:20 Jeff Cody 2016-07-20 17:51 ` Peter Maydell 0 siblings, 1 reply; 27+ messages in thread From: Jeff Cody @ 2016-07-20 0:20 UTC (permalink / raw) To: qemu-block; +Cc: peter.maydell, jcody, qemu-devel The following changes since commit 5d3217340adcb6c4f0e4af5d2b865331eb2ff63d: disas: Fix ATTRIBUTE_UNUSED define clash with ALSA headers (2016-07-19 16:40:39 +0100) are available in the git repository at: git@github.com:codyprime/qemu-kvm-jtc.git tags/block-pull-request for you to fetch changes up to 6c7189bb29de9fa2202f613f3c6caf028f96f261: block/gluster: add support for multiple gluster servers (2016-07-19 17:38:50 -0400) ---------------------------------------------------------------- Block pull for 2.7 ---------------------------------------------------------------- Denis V. Lunev (9): dirty-bitmap: operate with int64_t amount mirror: make sectors_in_flight int64_t mirror: create mirror_throttle helper mirror: create mirror_dirty_init helper for mirror_run block: remove extra condition in bdrv_can_write_zeroes_with_unmap mirror: optimize dirty bitmap filling in mirror_run a bit mirror: efficiently zero out target mirror: improve performance of mirroring of empty disk mirror: fix request throttling in drive-mirror Prasanna Kumar Kalever (5): block/gluster: rename [server, volname, image] -> [host, volume, path] block/gluster: code cleanup block/gluster: deprecate rdma support block/gluster: using new qapi schema block/gluster: add support for multiple gluster servers block.c | 2 +- block/dirty-bitmap.c | 6 +- block/gluster.c | 631 +++++++++++++++++++++++++++++++++---------- block/mirror.c | 152 +++++++---- include/block/block_int.h | 2 +- include/block/dirty-bitmap.h | 4 +- qapi/block-core.json | 68 ++++- 7 files changed, 659 insertions(+), 206 deletions(-) -- 1.9.3 ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PULL 00/14] Block patches 2016-07-20 0:20 Jeff Cody @ 2016-07-20 17:51 ` Peter Maydell 0 siblings, 0 replies; 27+ messages in thread From: Peter Maydell @ 2016-07-20 17:51 UTC (permalink / raw) To: Jeff Cody; +Cc: Qemu-block, QEMU Developers On 20 July 2016 at 01:20, Jeff Cody <jcody@redhat.com> wrote: > The following changes since commit 5d3217340adcb6c4f0e4af5d2b865331eb2ff63d: > > disas: Fix ATTRIBUTE_UNUSED define clash with ALSA headers (2016-07-19 16:40:39 +0100) > > are available in the git repository at: > > git@github.com:codyprime/qemu-kvm-jtc.git tags/block-pull-request > > for you to fetch changes up to 6c7189bb29de9fa2202f613f3c6caf028f96f261: > > block/gluster: add support for multiple gluster servers (2016-07-19 17:38:50 -0400) > > ---------------------------------------------------------------- > Block pull for 2.7 > ---------------------------------------------------------------- Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PULL 00/14] Block patches @ 2013-03-22 17:41 Kevin Wolf 0 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2013-03-22 17:41 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit afed26082219b49443193b4ac32d113bbcf967fd: microblaze: Ignore non-cpu accesses to unmapped areas (2013-03-19 17:34:47 +0100) are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony for you to fetch changes up to 681e7ad024d80123a1ae8e35f86fb1a7f03b1bc9: nbd: Check against invalid option combinations (2013-03-22 17:51:32 +0100) ---------------------------------------------------------------- Kevin Wolf (12): block: Add options QDict to bdrv_file_open() prototypes block: Pass bdrv_file_open() options to block drivers qemu-socket: Make socket_optslist public nbd: Keep hostname and port separate nbd: Remove unused functions nbd: Accept -drive options for the network connection block: Introduce .bdrv_parse_filename callback block: Rename variable to avoid shadowing block: Make find_image_format safe with NULL filename block: Allow omitting the file name when using driver-specific options nbd: Use default port if only host is specified nbd: Check against invalid option combinations Peter Lieven (2): Revert "block: complete all IOs before .bdrv_truncate" block: complete all IOs before resizing a device block.c | 143 +++++++++++++++++++++++++++++++++++++++------- block/blkdebug.c | 5 +- block/blkverify.c | 5 +- block/cow.c | 2 +- block/curl.c | 3 +- block/dmg.c | 13 ++++- block/gluster.c | 2 +- block/iscsi.c | 5 +- block/nbd.c | 135 ++++++++++++++++++++++++++++++++----------- block/qcow.c | 2 +- block/qcow2.c | 2 +- block/qed.c | 2 +- block/raw-posix.c | 15 +++-- block/sheepdog.c | 7 ++- block/vmdk.c | 2 +- block/vvfat.c | 3 +- blockdev.c | 13 ++++- include/block/block.h | 3 +- include/block/block_int.h | 7 ++- include/block/nbd.h | 4 +- include/qemu/sockets.h | 3 + nbd.c | 13 +---- qemu-io.c | 2 +- util/qemu-sockets.c | 30 +++++----- 24 files changed, 308 insertions(+), 113 deletions(-) ^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PULL 00/14] Block patches @ 2011-06-15 14:02 Kevin Wolf 2011-06-15 14:18 ` Anthony Liguori 0 siblings, 1 reply; 27+ messages in thread From: Kevin Wolf @ 2011-06-15 14:02 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit 0b862cedf36d927818c50584ddd611b0370673df: configure: Detect and don't try to use older libcurl (2011-06-13 21:16:27 +0200) are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Christoph Hellwig (3): make dma_bdrv_io available to drivers ide: allow other dma comands than read and write ide: add TRIM support Devin Nakamura (1): Replaced tabs with spaces in block.h and block_int.h Kevin Wolf (9): qcow2: Avoid direct AIO callback qcow: Avoid direct AIO callback vdi: Avoid direct AIO callback qcow2: Fix in-flight list after qcow2_cache_put failure ide: Split error status from status register ide: Fix ide_drive_pio_state_needed() ide: Add forgotten VMSTATE_END_OF_LIST in subsection ide: Clear error_status after restarting flush Allow nested qemu_bh_poll() after BH deletion Stefan Weil (1): block/rbd: Remove unused local variable async.c | 5 +- block.h | 6 +- block/qcow.c | 58 ++++++++++++++++++- block/qcow2-cluster.c | 12 +++- block/qcow2.c | 39 ++++++++++--- block/rbd.c | 4 - block/vdi.c | 41 +++++++++++-- block_int.h | 4 +- dma-helpers.c | 23 +++---- dma.h | 8 +++ hw/ide/core.c | 154 ++++++++++++++++++++++++++++++++++++++++++++----- hw/ide/internal.h | 32 ++++++++++- hw/ide/macio.c | 13 ++++- hw/ide/pci.c | 88 +++++++++++++++++++++++++--- hw/ide/pci.h | 4 + hw/ide/qdev.c | 5 ++ 16 files changed, 423 insertions(+), 73 deletions(-) ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PULL 00/14] Block patches 2011-06-15 14:02 Kevin Wolf @ 2011-06-15 14:18 ` Anthony Liguori 0 siblings, 0 replies; 27+ messages in thread From: Anthony Liguori @ 2011-06-15 14:18 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel On 06/15/2011 09:02 AM, Kevin Wolf wrote: > The following changes since commit 0b862cedf36d927818c50584ddd611b0370673df: > > configure: Detect and don't try to use older libcurl (2011-06-13 21:16:27 +0200) > > are available in the git repository at: > git://repo.or.cz/qemu/kevin.git for-anthony Pulled. Thanks. Regards, Anthony Liguori > Christoph Hellwig (3): > make dma_bdrv_io available to drivers > ide: allow other dma comands than read and write > ide: add TRIM support > > Devin Nakamura (1): > Replaced tabs with spaces in block.h and block_int.h > > Kevin Wolf (9): > qcow2: Avoid direct AIO callback > qcow: Avoid direct AIO callback > vdi: Avoid direct AIO callback > qcow2: Fix in-flight list after qcow2_cache_put failure > ide: Split error status from status register > ide: Fix ide_drive_pio_state_needed() > ide: Add forgotten VMSTATE_END_OF_LIST in subsection > ide: Clear error_status after restarting flush > Allow nested qemu_bh_poll() after BH deletion > > Stefan Weil (1): > block/rbd: Remove unused local variable > > async.c | 5 +- > block.h | 6 +- > block/qcow.c | 58 ++++++++++++++++++- > block/qcow2-cluster.c | 12 +++- > block/qcow2.c | 39 ++++++++++--- > block/rbd.c | 4 - > block/vdi.c | 41 +++++++++++-- > block_int.h | 4 +- > dma-helpers.c | 23 +++---- > dma.h | 8 +++ > hw/ide/core.c | 154 ++++++++++++++++++++++++++++++++++++++++++++----- > hw/ide/internal.h | 32 ++++++++++- > hw/ide/macio.c | 13 ++++- > hw/ide/pci.c | 88 +++++++++++++++++++++++++--- > hw/ide/pci.h | 4 + > hw/ide/qdev.c | 5 ++ > 16 files changed, 423 insertions(+), 73 deletions(-) ^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PULL 00/14] Block patches @ 2010-12-09 11:09 Kevin Wolf 2010-12-17 14:48 ` Anthony Liguori 0 siblings, 1 reply; 27+ messages in thread From: Kevin Wolf @ 2010-12-09 11:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit 138b38b61bf92d4e9588acf934e532499c94e185: ppc: kvm: fix signedness warning (2010-12-08 21:30:19 +0100) are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Christian Brunner (1): ceph/rbd block driver for qemu-kvm Jes Sorensen (8): Add missing tracing to qemu_mallocz() Use qemu_mallocz() instead of calloc() in img_convert() img_convert(): Only try to free bs[] entries if bs is valid. Consolidate printing of block driver options Fix formatting and missing braces in qemu-img.c Fail if detecting an unknown option Make error handling more consistent in img_create() and img_resize() qemu-img: Deprecate obsolete -6 and -e options Stefan Hajnoczi (5): block: Make bdrv_create_file() ':' handling consistent qemu-option: Don't reinvent append_option_parameters() qemu-option: Fix parse_option_parameters() documentation typo qemu-img: Free option parameter lists in img_create() qemu-img: Fail creation if backing format is invalid Makefile.objs | 1 + block.c | 2 +- block/rbd.c | 1059 +++++++++++++++++++++++++++++++++++++++++++++++++++++ block/rbd_types.h | 71 ++++ block_int.h | 1 - configure | 52 +++ qemu-img.c | 247 ++++++++----- qemu-malloc.c | 5 +- qemu-option.c | 13 +- 9 files changed, 1344 insertions(+), 107 deletions(-) create mode 100644 block/rbd.c create mode 100644 block/rbd_types.h ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PULL 00/14] Block patches 2010-12-09 11:09 Kevin Wolf @ 2010-12-17 14:48 ` Anthony Liguori 0 siblings, 0 replies; 27+ messages in thread From: Anthony Liguori @ 2010-12-17 14:48 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel On 12/09/2010 05:09 AM, Kevin Wolf wrote: > The following changes since commit 138b38b61bf92d4e9588acf934e532499c94e185: > > ppc: kvm: fix signedness warning (2010-12-08 21:30:19 +0100) > > are available in the git repository at: > git://repo.or.cz/qemu/kevin.git for-anthony > > Christian Brunner (1): > ceph/rbd block driver for qemu-kvm > Pulled. Thanks. Regards, Anthony Liguori > Jes Sorensen (8): > Add missing tracing to qemu_mallocz() > Use qemu_mallocz() instead of calloc() in img_convert() > img_convert(): Only try to free bs[] entries if bs is valid. > Consolidate printing of block driver options > Fix formatting and missing braces in qemu-img.c > Fail if detecting an unknown option > Make error handling more consistent in img_create() and img_resize() > qemu-img: Deprecate obsolete -6 and -e options > > Stefan Hajnoczi (5): > block: Make bdrv_create_file() ':' handling consistent > qemu-option: Don't reinvent append_option_parameters() > qemu-option: Fix parse_option_parameters() documentation typo > qemu-img: Free option parameter lists in img_create() > qemu-img: Fail creation if backing format is invalid > > Makefile.objs | 1 + > block.c | 2 +- > block/rbd.c | 1059 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > block/rbd_types.h | 71 ++++ > block_int.h | 1 - > configure | 52 +++ > qemu-img.c | 247 ++++++++----- > qemu-malloc.c | 5 +- > qemu-option.c | 13 +- > 9 files changed, 1344 insertions(+), 107 deletions(-) > create mode 100644 block/rbd.c > create mode 100644 block/rbd_types.h > > > ^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PULL 00/14] Block patches @ 2010-06-22 14:09 Kevin Wolf 0 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2010-06-22 14:09 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel The following changes since commit cada87c432e3b9cd55869a24055baf2b7bc0b70c: Blue Swirl (1): Update OpenBIOS images are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Christoph Hellwig (1): block: fix physical_block_size calculation Eduardo Habkost (1): monitor: allow device to be ejected if no disk is inserted Kevin Wolf (8): block: Add bdrv_(p)write_sync cow: Use bdrv_(p)write_sync for metadata writes qcow: Use bdrv_(p)write_sync for metadata writes qcow2: Use bdrv_(p)write_sync for metadata writes vmdk: Use bdrv_(p)write_sync for metadata writes vpc: Use bdrv_(p)write_sync for metadata writes qcow2: Fix qemu-img check segfault on corrupted images qcow2: Don't try to check tables that couldn't be loaded MORITA Kazutaka (1): qemu-io: check registered fds in command_loop() Nicholas Bellinger (2): scsi-bus: Add PERSISTENT_RESERVE_OUT SCSIRequest->cmd.mode setup scsi-bus: Add MAINTENANCE_IN and MAINTENANCE_OUT SCSIRequest xfer and mode assignments Yoshiaki Tamura (1): virtio-blk: fix the list operation in virtio_blk_load(). block.c | 37 +++++++++++++++++++++++++++++++++++++ block.h | 4 ++++ block/cow.c | 20 +++++++++++--------- block/qcow.c | 18 ++++++++++-------- block/qcow2-cluster.c | 24 ++++++++++++------------ block/qcow2-refcount.c | 39 ++++++++++++++++++++++++--------------- block/qcow2-snapshot.c | 23 +++++++++++------------ block/qcow2.c | 10 +++++----- block/vmdk.c | 10 +++++----- block/vpc.c | 9 +++++---- block_int.h | 4 +++- blockdev.c | 22 ++++++++++------------ cmd.c | 33 ++++++++++++++++++++++++++++++--- hw/scsi-bus.c | 11 +++++++++++ hw/scsi-defs.h | 2 ++ hw/virtio-blk.c | 2 +- 16 files changed, 181 insertions(+), 87 deletions(-) ^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PULL 00/14] Block patches @ 2010-05-28 16:45 Kevin Wolf 0 siblings, 0 replies; 27+ messages in thread From: Kevin Wolf @ 2010-05-28 16:45 UTC (permalink / raw) To: anthony; +Cc: kwolf, qemu-devel Hi Anthony, this includes again some patches that should be applied to stable-0.12, too: 86fa8da qcow2: Fix corruption after error in update_refcount 25408c0 qcow2: Fix corruption after refblock allocation cbf1dff block: Fix multiwrite with overlapping requests 175e115 qcow2: Fix error handling in l2_allocate 1b7c801 qcow2: Clear L2 table cache after write error Kevin The following changes since commit 29f91781bd300b228d9c38b9f6c1e0b6a38f25fb: Jes Sorensen (1): vhost_net.c: v2 Fix build failure introduced by 0bfcd599e3f5c5679cc7d0165a0a1822e2f60de2 are available in the git repository at: git://repo.or.cz/qemu/kevin.git for-anthony Gerd Hoffmann (1): drive: allow rerror, werror and readonly for if=none Jes Sorensen (1): block.h: Make BDRV_SECTOR_SIZE 64 bit safe Kevin Wolf (9): qcow2: Clear L2 table cache after write error qcow2: Fix error handling in l2_allocate block: Fix multiwrite with overlapping requests qemu-io: Add multiwrite command qcow2: Allow qcow2_get_cluster_offset to return errors qcow2: Change l2_load to return 0/-errno qcow2: Return right error code in write_refcount_block_entries qcow2: Fix corruption after refblock allocation qcow2: Fix corruption after error in update_refcount MORITA Kazutaka (1): add support for protocol driver create_options Nicholas A. Bellinger (1): block: Add missing bdrv_delete() for SG_IO BlockDriver in find_image_format() Stefan Hajnoczi (1): posix-aio-compat: Expand tabs that have crept in block.c | 13 ++-- block.h | 3 +- block/qcow2-cluster.c | 94 ++++++++++++++---------- block/qcow2-refcount.c | 42 +++++++---- block/qcow2.c | 16 +++- block/qcow2.h | 4 +- posix-aio-compat.c | 58 +++++++------- qemu-img.c | 49 +++++++++---- qemu-io.c | 192 ++++++++++++++++++++++++++++++++++++++++++++++++ qemu-option.c | 53 ++++++++++++-- qemu-option.h | 2 + vl.c | 6 +- 12 files changed, 414 insertions(+), 118 deletions(-) ^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2017-01-05 13:57 UTC | newest] Thread overview: 27+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-12-15 14:09 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 01/14] block: bdrv_aio_* do not return NULL Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 02/14] block: simplify failure handling for bdrv_aio_multiwrite Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 03/14] block: qemu_aio_get does not return NULL Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 04/14] dma: the passed io_func " Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 05/14] block: dma_bdrv_* " Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 06/14] block: avoid useless checks on acb->bh Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 07/14] block/qcow2.c: call qcow2_free_snapshots in the function of qcow2_close Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 08/14] rbd: always set out parameter in qemu_rbd_snap_list Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 09/14] qemu-img rebase: Fix for undersized backing files Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 10/14] Documentation: Add qemu-img -t parameter in man page Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 11/14] qcow2: Allow >4 GB VM state Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 12/14] coroutine: switch per-thread free pool to a global pool Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 13/14] block/cow: Return real error code Kevin Wolf 2011-12-15 14:09 ` [Qemu-devel] [PATCH 14/14] qiov: prevent double free or use-after-free Kevin Wolf 2011-12-19 15:44 ` [Qemu-devel] [PULL 00/14] Block patches Anthony Liguori -- strict thread matches above, loose matches on Subject: below -- 2017-01-04 13:34 Stefan Hajnoczi 2017-01-05 13:57 ` Peter Maydell 2016-07-20 0:20 Jeff Cody 2016-07-20 17:51 ` Peter Maydell 2013-03-22 17:41 Kevin Wolf 2011-06-15 14:02 Kevin Wolf 2011-06-15 14:18 ` Anthony Liguori 2010-12-09 11:09 Kevin Wolf 2010-12-17 14:48 ` Anthony Liguori 2010-06-22 14:09 Kevin Wolf 2010-05-28 16:45 Kevin Wolf
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).