From patchwork Mon Jan 28 17:04:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Beno=C3=AEt_Canet?= X-Patchwork-Id: 216253 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id C12BE2C0091 for ; Tue, 29 Jan 2013 04:04:52 +1100 (EST) Received: from localhost ([::1]:37357 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tzs8Y-00044p-Ls for incoming@patchwork.ozlabs.org; Mon, 28 Jan 2013 12:04:50 -0500 Received: from eggs.gnu.org ([208.118.235.92]:44873) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tzs8D-0003rS-5B for qemu-devel@nongnu.org; Mon, 28 Jan 2013 12:04:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tzs85-0007jo-L9 for qemu-devel@nongnu.org; Mon, 28 Jan 2013 12:04:29 -0500 Received: from nodalink.pck.nerim.net ([62.212.105.220]:48461 helo=paradis.irqsave.net) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tzs85-0007jd-0E for qemu-devel@nongnu.org; Mon, 28 Jan 2013 12:04:21 -0500 Received: by paradis.irqsave.net (Postfix, from userid 1002) id 5C881874043; Mon, 28 Jan 2013 18:04:20 +0100 (CET) Received: from localhost.localdomain (unknown [192.168.77.1]) by paradis.irqsave.net (Postfix) with ESMTP id 2BF1F874321; Mon, 28 Jan 2013 18:04:01 +0100 (CET) From: =?UTF-8?q?Beno=C3=AEt=20Canet?= To: qemu-devel@nongnu.org Date: Mon, 28 Jan 2013 18:04:40 +0100 Message-Id: <1359392680-15838-5-git-send-email-benoit@irqsave.net> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1359392680-15838-1-git-send-email-benoit@irqsave.net> References: <1359392680-15838-1-git-send-email-benoit@irqsave.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 62.212.105.220 Cc: kwolf@redhat.com, =?UTF-8?q?Beno=C3=AEt=20Canet?= , stefanha@redhat.com Subject: [Qemu-devel] [PATCH V2 4/4] block: Optionally block drivers to optionally reopen images after snapshot creation. 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 Protocols like quorum will be able to queue multiple reopens. Signed-off-by: Benoit Canet --- block.c | 25 +++++++++++++++++++++++++ blockdev.c | 5 +++-- include/block/block.h | 2 ++ include/block/block_int.h | 3 +++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/block.c b/block.c index 843583f..e46a106 100644 --- a/block.c +++ b/block.c @@ -4652,3 +4652,28 @@ void bdrv_ext_snapshot_img_create(BlockDriverState *old_bs, options, img_size, flags, errp); } + +int bdrv_ext_snapshot_reopen(BlockDriverState *bs, int bdrv_flags, + Error **errp) +{ + Error *local_err = NULL; + int ret = -ENOTSUP; + + if (!bs->file || !bs->file->drv) { + error_setg(errp, "Block driver not reachable."); + return ret; + } + + if (!bs->file->drv->bdrv_ext_snapshot_reopen) { + ret = bdrv_reopen(bs, bdrv_flags, &local_err); + } else { + ret = bs->file->drv->bdrv_ext_snapshot_reopen(bs, bdrv_flags, + &local_err); + } + + if (error_is_set(&local_err)) { + error_propagate(errp, local_err); + } + + return ret; +} diff --git a/blockdev.c b/blockdev.c index b1f388b..e9d235b 100644 --- a/blockdev.c +++ b/blockdev.c @@ -817,8 +817,9 @@ void qmp_transaction(BlockdevActionList *dev_list, Error **errp) /* We don't need (or want) to use the transactional * bdrv_reopen_multiple() across all the entries at once, because we * don't want to abort all of them if one of them fails the reopen */ - bdrv_reopen(states->new_bs, states->new_bs->open_flags & ~BDRV_O_RDWR, - NULL); + bdrv_ext_snapshot_reopen(states->new_bs, + states->new_bs->open_flags & ~BDRV_O_RDWR, + NULL); } /* success */ diff --git a/include/block/block.h b/include/block/block.h index b7be2d2..d7e7334 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -141,6 +141,8 @@ BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue, BlockDriverState *bs, int flags); int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp); int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp); +int bdrv_ext_snapshot_reopen(BlockDriverState *bs, int bdrv_flags, + Error **errp); int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue, Error **errp); void bdrv_reopen_commit(BDRVReopenState *reopen_state); diff --git a/include/block/block_int.h b/include/block/block_int.h index 5bab830..996fd9b 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -209,6 +209,9 @@ struct BlockDriver { const char *base_fmt, char *options, uint64_t img_size, int flags, Error **errp); + /* optional field */ + int (*bdrv_ext_snapshot_reopen)(BlockDriverState *bs, int bdrv_flags, + Error **errp); QLIST_ENTRY(BlockDriver) list; };