From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:58599) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QF4mP-00062g-8z for qemu-devel@nongnu.org; Wed, 27 Apr 2011 09:27:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QF4mN-0005aj-Pn for qemu-devel@nongnu.org; Wed, 27 Apr 2011 09:27:45 -0400 Received: from mtagate7.uk.ibm.com ([194.196.100.167]:52403) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QF4mN-0005Qq-IO for qemu-devel@nongnu.org; Wed, 27 Apr 2011 09:27:43 -0400 Received: from d06nrmr1806.portsmouth.uk.ibm.com (d06nrmr1806.portsmouth.uk.ibm.com [9.149.39.193]) by mtagate7.uk.ibm.com (8.13.1/8.13.1) with ESMTP id p3RDRe3e012424 for ; Wed, 27 Apr 2011 13:27:40 GMT Received: from d06av04.portsmouth.uk.ibm.com (d06av04.portsmouth.uk.ibm.com [9.149.37.216]) by d06nrmr1806.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p3RDSiG91937408 for ; Wed, 27 Apr 2011 14:28:44 +0100 Received: from d06av04.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av04.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p3RDReMY031222 for ; Wed, 27 Apr 2011 07:27:40 -0600 From: Stefan Hajnoczi Date: Wed, 27 Apr 2011 14:27:28 +0100 Message-Id: <1303910855-28999-2-git-send-email-stefanha@linux.vnet.ibm.com> In-Reply-To: <1303910855-28999-1-git-send-email-stefanha@linux.vnet.ibm.com> References: <1303910855-28999-1-git-send-email-stefanha@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 1/8] block: add bdrv_aio_stream List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori From: Anthony Liguori Signed-off-by: Anthony Liguori --- block.c | 32 ++++++++++++++++++++++++++++++++ block.h | 2 ++ block_int.h | 3 +++ 3 files changed, 37 insertions(+), 0 deletions(-) diff --git a/block.c b/block.c index f731c7a..5e3476c 100644 --- a/block.c +++ b/block.c @@ -2248,6 +2248,38 @@ BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num, return ret; } +/** + * Attempt to stream an image starting from sector_num. + * + * @sector_num - the first sector to start streaming from + * @cb - block completion callback + * @opaque - data to pass completion callback + * + * Returns NULL if the image format not support streaming, the image is + * read-only, or no image is open. + * + * The intention of this function is for a user to execute it once with a + * sector_num of 0 and then upon receiving a completion callback, to remember + * the number of sectors "streamed", and then to call this function again with + * an offset adjusted by the number of sectors previously streamed. + * + * This allows a user to progressive stream in an image at a pace that makes + * sense. In general, this function tries to do the smallest amount of I/O + * possible to do some useful work. + * + * This function only really makes sense in combination with a block format + * that supports copy on read and has it enabled. If copy on read is not + * enabled, a block format driver may return NULL. + */ +BlockDriverAIOCB *bdrv_aio_stream(BlockDriverState *bs, int64_t sector_num, + BlockDriverCompletionFunc *cb, void *opaque) +{ + if (!bs->drv || bs->read_only || !bs->drv->bdrv_aio_stream) { + return NULL; + } + + return bs->drv->bdrv_aio_stream(bs, sector_num, cb, opaque); +} typedef struct MultiwriteCB { int error; diff --git a/block.h b/block.h index 52e9cad..fad828a 100644 --- a/block.h +++ b/block.h @@ -119,6 +119,8 @@ BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num, BlockDriverCompletionFunc *cb, void *opaque); BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs, BlockDriverCompletionFunc *cb, void *opaque); +BlockDriverAIOCB *bdrv_aio_stream(BlockDriverState *bs, int64_t sector_num, + BlockDriverCompletionFunc *cb, void *opaque); void bdrv_aio_cancel(BlockDriverAIOCB *acb); typedef struct BlockRequest { diff --git a/block_int.h b/block_int.h index 545ad11..0c125d0 100644 --- a/block_int.h +++ b/block_int.h @@ -73,6 +73,9 @@ struct BlockDriver { BlockDriverCompletionFunc *cb, void *opaque); BlockDriverAIOCB *(*bdrv_aio_flush)(BlockDriverState *bs, BlockDriverCompletionFunc *cb, void *opaque); + BlockDriverAIOCB *(*bdrv_aio_stream)(BlockDriverState *bs, + int64_t sector_num, + BlockDriverCompletionFunc *cb, void *opaque); int (*bdrv_discard)(BlockDriverState *bs, int64_t sector_num, int nb_sectors); -- 1.7.4.4