From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:55958) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RV3mE-0000Kc-7A for qemu-devel@nongnu.org; Mon, 28 Nov 2011 11:10:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RV3m4-0002hh-1H for qemu-devel@nongnu.org; Mon, 28 Nov 2011 11:09:54 -0500 Received: from e06smtp18.uk.ibm.com ([195.75.94.114]:50597) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RV3m3-0002Uc-MH for qemu-devel@nongnu.org; Mon, 28 Nov 2011 11:09:43 -0500 Received: from /spool/local by e06smtp18.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 28 Nov 2011 16:08:55 -0000 Received: from d06av01.portsmouth.uk.ibm.com (d06av01.portsmouth.uk.ibm.com [9.149.37.212]) by d06nrmr1507.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id pASG8qMu2629760 for ; Mon, 28 Nov 2011 16:08:52 GMT Received: from d06av01.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av01.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id pASG8pjI015626 for ; Mon, 28 Nov 2011 09:08:51 -0700 From: Stefan Hajnoczi Date: Mon, 28 Nov 2011 16:08:47 +0000 Message-Id: <1322496527-19019-2-git-send-email-stefanha@linux.vnet.ibm.com> In-Reply-To: <1322496527-19019-1-git-send-email-stefanha@linux.vnet.ibm.com> References: <1322496527-19019-1-git-send-email-stefanha@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH v5 4/8] block: add interface to toggle copy-on-read List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Stefan Hajnoczi The bdrv_enable_copy_on_read()/bdrv_disable_copy_on_read() functions can be used to programmatically enable or disable copy-on-read for a block device. Later patches add the actual copy-on-read logic. Signed-off-by: Stefan Hajnoczi --- block.c | 22 ++++++++++++++++++++++ block.h | 4 ++++ block_int.h | 2 ++ 3 files changed, 28 insertions(+), 0 deletions(-) diff --git a/block.c b/block.c index 27c4e84..f8dc082 100644 --- a/block.c +++ b/block.c @@ -538,6 +538,22 @@ int bdrv_parse_cache_flags(const char *mode, int *flags) return 0; } +/** + * The copy-on-read flag is actually a reference count so multiple users may + * use the feature without worrying about clobbering its previous state. + * Copy-on-read stays enabled until all users have called to disable it. + */ +void bdrv_enable_copy_on_read(BlockDriverState *bs) +{ + bs->copy_on_read++; +} + +void bdrv_disable_copy_on_read(BlockDriverState *bs) +{ + assert(bs->copy_on_read > 0); + bs->copy_on_read--; +} + /* * Common part for opening disk images and files */ @@ -559,6 +575,11 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename, bs->growable = 0; bs->buffer_alignment = 512; + assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */ + if ((flags & BDRV_O_RDWR) && (flags & BDRV_O_COPY_ON_READ)) { + bdrv_enable_copy_on_read(bs); + } + pstrcpy(bs->filename, sizeof(bs->filename), filename); bs->backing_file[0] = '\0'; @@ -801,6 +822,7 @@ void bdrv_close(BlockDriverState *bs) #endif bs->opaque = NULL; bs->drv = NULL; + bs->copy_on_read = 0; if (bs->file != NULL) { bdrv_close(bs->file); diff --git a/block.h b/block.h index ad8dd48..4bbad0b 100644 --- a/block.h +++ b/block.h @@ -70,6 +70,7 @@ typedef struct BlockDevOps { #define BDRV_O_NATIVE_AIO 0x0080 /* use native AIO instead of the thread pool */ #define BDRV_O_NO_BACKING 0x0100 /* don't open the backing file */ #define BDRV_O_NO_FLUSH 0x0200 /* disable flushing on this disk */ +#define BDRV_O_COPY_ON_READ 0x0400 /* copy read backing sectors into image */ #define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH) @@ -308,6 +309,9 @@ void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors); int64_t bdrv_get_dirty_count(BlockDriverState *bs); +void bdrv_enable_copy_on_read(BlockDriverState *bs); +void bdrv_disable_copy_on_read(BlockDriverState *bs); + void bdrv_set_in_use(BlockDriverState *bs, int in_use); int bdrv_in_use(BlockDriverState *bs); diff --git a/block_int.h b/block_int.h index 788fde9..3c5bacb 100644 --- a/block_int.h +++ b/block_int.h @@ -193,6 +193,8 @@ struct BlockDriverState { int encrypted; /* if true, the media is encrypted */ int valid_key; /* if true, a valid encryption key has been set */ int sg; /* if true, the device is a /dev/sg* */ + int copy_on_read; /* if true, copy read backing sectors into image + note this is a reference count */ BlockDriver *drv; /* NULL means no media */ void *opaque; -- 1.7.7.3