From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:38169) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S4btr-0002Sy-68 for qemu-devel@nongnu.org; Mon, 05 Mar 2012 12:40:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S4btk-0003hi-V2 for qemu-devel@nongnu.org; Mon, 05 Mar 2012 12:40:42 -0500 Received: from mail-ee0-f45.google.com ([74.125.83.45]:47652) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S4btk-0003ez-Ls for qemu-devel@nongnu.org; Mon, 05 Mar 2012 12:40:36 -0500 Received: by mail-ee0-f45.google.com with SMTP id t10so1869053eei.4 for ; Mon, 05 Mar 2012 09:40:35 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 5 Mar 2012 18:40:24 +0100 Message-Id: <1330969225-25287-7-git-send-email-pbonzini@redhat.com> In-Reply-To: <1330969225-25287-1-git-send-email-pbonzini@redhat.com> References: <1330969225-25287-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 6/7] vdi: do not create useless iovecs List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, sw@weilnetz.de Reads and writes to the underlying file can also occur with the simple non-vectored I/O interfaces. Signed-off-by: Paolo Bonzini --- block/vdi.c | 79 ++++++++++++++++++++++++---------------------------------- 1 files changed, 33 insertions(+), 46 deletions(-) diff --git a/block/vdi.c b/block/vdi.c index 5070f91..c192c7e 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; uint32_t bmap_last; - 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; -- 1.7.7.6