From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60385) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SQVR5-0001il-NT for qemu-devel@nongnu.org; Fri, 04 May 2012 23:13:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SQVR3-0006dG-Sh for qemu-devel@nongnu.org; Fri, 04 May 2012 23:13:31 -0400 Received: from e34.co.us.ibm.com ([32.97.110.152]:35400) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SQVR3-0006cn-MC for qemu-devel@nongnu.org; Fri, 04 May 2012 23:13:29 -0400 Received: from /spool/local by e34.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 4 May 2012 21:13:27 -0600 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id 691B21FF0023 for ; Fri, 4 May 2012 21:13:10 -0600 (MDT) Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q453DBGo130756 for ; Fri, 4 May 2012 21:13:12 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q453DBP0010084 for ; Fri, 4 May 2012 21:13:11 -0600 From: zwu.kernel@gmail.com Date: Sat, 5 May 2012 11:13:03 +0800 Message-Id: <1336187583-27323-1-git-send-email-zwu.kernel@gmail.com> Subject: [Qemu-devel] [PATCH 1/2] block: make bdrv_create adopt coroutine List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, Zhi Yong Wu , marcandre.lureau@gmail.com, stefanha@linux.vnet.ibm.com From: Zhi Yong Wu Signed-off-by: Zhi Yong Wu --- block.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 47 insertions(+), 1 deletions(-) diff --git a/block.c b/block.c index 43c794c..3ff78c5 100644 --- a/block.c +++ b/block.c @@ -341,13 +341,59 @@ BlockDriver *bdrv_find_whitelisted_format(const char *format_name) return drv && bdrv_is_whitelisted(drv) ? drv : NULL; } +typedef struct CreateCo { + BlockDriver *drv; + const char *filename; + QEMUOptionParameter *options; + int ret; +} CreateCo; + +static void coroutine_fn bdrv_create_co_entry(void *opaque) +{ + CreateCo *cco = opaque; + assert(cco->drv); + + cco->ret = cco->drv->bdrv_create(cco->filename, cco->options); +} + +static int bdrv_create_co(BlockDriver *drv, + const char *filename, + QEMUOptionParameter *options) +{ + int ret; + + Coroutine *co; + CreateCo cco = { + .drv = drv, + .filename = g_strdup(filename), + .options = options, + .ret = NOT_DONE, + }; + + if (qemu_in_coroutine()) { + /* Fast-path if already in coroutine context */ + bdrv_create_co_entry(&cco); + } else { + co = qemu_coroutine_create(bdrv_create_co_entry); + qemu_coroutine_enter(co, &cco); + while (cco.ret == NOT_DONE) { + qemu_aio_wait(); + } + } + + ret = cco.ret; + g_free(cco.filename); + + return ret; +} + int bdrv_create(BlockDriver *drv, const char* filename, QEMUOptionParameter *options) { if (!drv->bdrv_create) return -ENOTSUP; - return drv->bdrv_create(filename, options); + return bdrv_create_co(drv, filename, options); } int bdrv_create_file(const char* filename, QEMUOptionParameter *options) -- 1.7.6