From patchwork Tue Mar 8 12:47:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 594133 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id A59E914090A for ; Tue, 8 Mar 2016 23:48:46 +1100 (AEDT) Received: from localhost ([::1]:34174 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1adH48-0006Is-Oy for incoming@patchwork.ozlabs.org; Tue, 08 Mar 2016 07:48:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40319) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1adH3V-0005D6-88 for qemu-devel@nongnu.org; Tue, 08 Mar 2016 07:48:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1adH3U-0005Qs-42 for qemu-devel@nongnu.org; Tue, 08 Mar 2016 07:48:05 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45999) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1adH3R-0005Ov-B2; Tue, 08 Mar 2016 07:48:01 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id E6EE8627C4; Tue, 8 Mar 2016 12:48:00 +0000 (UTC) Received: from noname.str.redhat.com. (dhcp-192-197.str.redhat.com [10.33.192.197]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u28CltVu024869; Tue, 8 Mar 2016 07:47:59 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Tue, 8 Mar 2016 13:47:48 +0100 Message-Id: <1457441273-29821-4-git-send-email-kwolf@redhat.com> In-Reply-To: <1457441273-29821-1-git-send-email-kwolf@redhat.com> References: <1457441273-29821-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 08 Mar 2016 12:48:00 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Cc: kwolf@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com, mreitz@redhat.com Subject: [Qemu-devel] [PATCH 3/8] block: Use blk_co_pwritev() for blk_write() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Kevin Wolf --- block/block-backend.c | 39 ++++++++++++++++++++++++++++++--------- block/io.c | 5 +---- include/block/block_int.h | 3 +++ 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index d97d1ac..e159647 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -711,6 +711,18 @@ static int coroutine_fn blk_co_preadv(BlockBackend *blk, int64_t offset, return bdrv_co_do_preadv(blk_bs(blk), offset, bytes, qiov, flags); } +static int coroutine_fn blk_co_pwritev(BlockBackend *blk, int64_t offset, + unsigned int bytes, QEMUIOVector *qiov, + BdrvRequestFlags flags) +{ + int ret = blk_check_byte_request(blk, offset, bytes); + if (ret < 0) { + return ret; + } + + return bdrv_co_do_pwritev(blk_bs(blk), offset, bytes, qiov, flags); +} + typedef struct BlkRwCo { BlockBackend *blk; int64_t offset; @@ -727,8 +739,16 @@ static void blk_read_entry(void *opaque) rwco->qiov, rwco->flags); } -int blk_read(BlockBackend *blk, int64_t sector_num, uint8_t *buf, - int nb_sectors) +static void blk_write_entry(void *opaque) +{ + BlkRwCo *rwco = opaque; + + rwco->ret = blk_co_pwritev(rwco->blk, rwco->offset, rwco->qiov->size, + rwco->qiov, rwco->flags); +} + +static int blk_rw(BlockBackend *blk, int64_t sector_num, uint8_t *buf, + int nb_sectors, CoroutineEntry co_entry) { AioContext *aio_context; QEMUIOVector qiov; @@ -753,7 +773,7 @@ int blk_read(BlockBackend *blk, int64_t sector_num, uint8_t *buf, .ret = NOT_DONE, }; - co = qemu_coroutine_create(blk_read_entry); + co = qemu_coroutine_create(co_entry); qemu_coroutine_enter(co, &rwco); aio_context = blk_get_aio_context(blk); @@ -764,6 +784,12 @@ int blk_read(BlockBackend *blk, int64_t sector_num, uint8_t *buf, return rwco.ret; } +int blk_read(BlockBackend *blk, int64_t sector_num, uint8_t *buf, + int nb_sectors) +{ + return blk_rw(blk, sector_num, buf, nb_sectors, blk_read_entry); +} + int blk_read_unthrottled(BlockBackend *blk, int64_t sector_num, uint8_t *buf, int nb_sectors) { @@ -778,12 +804,7 @@ int blk_read_unthrottled(BlockBackend *blk, int64_t sector_num, uint8_t *buf, int blk_write(BlockBackend *blk, int64_t sector_num, const uint8_t *buf, int nb_sectors) { - int ret = blk_check_request(blk, sector_num, nb_sectors); - if (ret < 0) { - return ret; - } - - return bdrv_write(blk_bs(blk), sector_num, buf, nb_sectors); + return blk_rw(blk, sector_num, (uint8_t*) buf, nb_sectors, blk_write_entry); } int blk_write_zeroes(BlockBackend *blk, int64_t sector_num, diff --git a/block/io.c b/block/io.c index c7084e4..aa8537c 100644 --- a/block/io.c +++ b/block/io.c @@ -44,9 +44,6 @@ static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs, static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs, int64_t sector_num, int nb_sectors, QEMUIOVector *iov); -static int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs, - int64_t offset, unsigned int bytes, QEMUIOVector *qiov, - BdrvRequestFlags flags); static BlockAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov, @@ -1281,7 +1278,7 @@ fail: /* * Handle a write request in coroutine context */ -static int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs, +int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs, int64_t offset, unsigned int bytes, QEMUIOVector *qiov, BdrvRequestFlags flags) { diff --git a/include/block/block_int.h b/include/block/block_int.h index db830f6..35ba42f 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -511,6 +511,9 @@ void bdrv_setup_io_funcs(BlockDriver *bdrv); int coroutine_fn bdrv_co_do_preadv(BlockDriverState *bs, int64_t offset, unsigned int bytes, QEMUIOVector *qiov, BdrvRequestFlags flags); +int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs, + int64_t offset, unsigned int bytes, QEMUIOVector *qiov, + BdrvRequestFlags flags); int get_tmp_filename(char *filename, int size); BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,