diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2012-03-19 18:07:50 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2012-04-05 14:54:40 +0200 |
commit | 4eea78e6345518bfe87493d8b163e1e268e64f74 (patch) | |
tree | b27c3aae21a77af2ba60cf15edf045123305349b /block | |
parent | a7a43aa199571a336b76a9a9310c95476c6dc5c4 (diff) | |
download | hqemu-4eea78e6345518bfe87493d8b163e1e268e64f74.zip hqemu-4eea78e6345518bfe87493d8b163e1e268e64f74.tar.gz |
vdi: do not create useless iovecs
Reads and writes to the underlying file can also occur with the simple
non-vectored I/O interfaces.
Acked-by: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/vdi.c | 79 |
1 files changed, 33 insertions, 46 deletions
diff --git a/block/vdi.c b/block/vdi.c index 790b61e..bfeafea 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -474,8 +474,6 @@ static int vdi_co_read(BlockDriverState *bs, uint32_t block_index; uint32_t sector_in_block; uint32_t n_sectors; - struct iovec hd_iov; - QEMUIOVector hd_qiov; int ret; logout("\n"); @@ -501,10 +499,7 @@ restart: uint64_t offset = s->header.offset_data / SECTOR_SIZE + (uint64_t)bmap_entry * s->block_sectors + sector_in_block; - hd_iov.iov_base = (void *)buf; - hd_iov.iov_len = n_sectors * SECTOR_SIZE; - qemu_iovec_init_external(&hd_qiov, &hd_iov, 1); - ret = bdrv_co_readv(bs->file, offset, n_sectors, &hd_qiov); + ret = bdrv_read(bs->file, offset, buf, n_sectors); } logout("%u sectors read\n", n_sectors); @@ -529,8 +524,6 @@ static int vdi_co_write(BlockDriverState *bs, uint32_t n_sectors; uint32_t bmap_first = VDI_UNALLOCATED; uint32_t bmap_last = VDI_UNALLOCATED; - struct iovec hd_iov; - QEMUIOVector hd_qiov; uint8_t *block = NULL; int ret; @@ -568,18 +561,12 @@ restart: buf, n_sectors * SECTOR_SIZE); memset(block + (sector_in_block + n_sectors) * SECTOR_SIZE, 0, (s->block_sectors - n_sectors - sector_in_block) * SECTOR_SIZE); - hd_iov.iov_base = (void *)block; - hd_iov.iov_len = s->block_size; - qemu_iovec_init_external(&hd_qiov, &hd_iov, 1); - ret = bdrv_co_writev(bs->file, offset, s->block_sectors, &hd_qiov); + ret = bdrv_write(bs->file, offset, block, s->block_sectors); } else { uint64_t offset = s->header.offset_data / SECTOR_SIZE + (uint64_t)bmap_entry * s->block_sectors + sector_in_block; - hd_iov.iov_base = (void *)buf; - hd_iov.iov_len = n_sectors * SECTOR_SIZE; - qemu_iovec_init_external(&hd_qiov, &hd_iov, 1); - ret = bdrv_co_writev(bs->file, offset, n_sectors, &hd_qiov); + ret = bdrv_write(bs->file, offset, buf, n_sectors); } nb_sectors -= n_sectors; @@ -592,39 +579,39 @@ restart: } logout("finished data write\n"); - if (ret >= 0) { - ret = 0; - if (block) { - VdiHeader *header = (VdiHeader *) block; - logout("now writing modified header\n"); - assert(VDI_IS_ALLOCATED(bmap_first)); - *header = s->header; - vdi_header_to_le(header); - hd_iov.iov_base = block; - hd_iov.iov_len = SECTOR_SIZE; - qemu_iovec_init_external(&hd_qiov, &hd_iov, 1); - ret = bdrv_co_writev(bs->file, 0, 1, &hd_qiov); - } + if (ret < 0) { + return ret; + } + + if (block) { + /* One or more new blocks were allocated. */ + VdiHeader *header = (VdiHeader *) block; + uint8_t *base; + uint64_t offset; + + logout("now writing modified header\n"); + assert(VDI_IS_ALLOCATED(bmap_first)); + *header = s->header; + vdi_header_to_le(header); + ret = bdrv_write(bs->file, 0, block, 1); g_free(block); block = NULL; - if (ret >= 0 && VDI_IS_ALLOCATED(bmap_first)) { - /* One or more new blocks were allocated. */ - uint64_t offset; - logout("now writing modified block map entry %u...%u\n", - bmap_first, bmap_last); - /* Write modified sectors from block map. */ - bmap_first /= (SECTOR_SIZE / sizeof(uint32_t)); - bmap_last /= (SECTOR_SIZE / sizeof(uint32_t)); - n_sectors = bmap_last - bmap_first + 1; - offset = s->bmap_sector + bmap_first; - hd_iov.iov_base = (void *)((uint8_t *)&s->bmap[0] + - bmap_first * SECTOR_SIZE); - hd_iov.iov_len = n_sectors * SECTOR_SIZE; - qemu_iovec_init_external(&hd_qiov, &hd_iov, 1); - logout("will write %u block map sectors starting from entry %u\n", - n_sectors, bmap_first); - ret = bdrv_co_writev(bs->file, offset, n_sectors, &hd_qiov); + + if (ret < 0) { + return ret; } + + logout("now writing modified block map entry %u...%u\n", + bmap_first, bmap_last); + /* Write modified sectors from block map. */ + bmap_first /= (SECTOR_SIZE / sizeof(uint32_t)); + bmap_last /= (SECTOR_SIZE / sizeof(uint32_t)); + n_sectors = bmap_last - bmap_first + 1; + offset = s->bmap_sector + bmap_first; + base = ((uint8_t *)&s->bmap[0]) + bmap_first * SECTOR_SIZE; + logout("will write %u block map sectors starting from entry %u\n", + n_sectors, bmap_first); + ret = bdrv_write(bs->file, offset, base, n_sectors); } return ret; |