From patchwork Mon Jan 28 13:22:59 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: 216212 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 112482C0089 for ; Tue, 29 Jan 2013 01:10:43 +1100 (EST) Received: from localhost ([::1]:36857 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tzogq-0006BQ-EK for incoming@patchwork.ozlabs.org; Mon, 28 Jan 2013 08:24:00 -0500 Received: from eggs.gnu.org ([208.118.235.92]:41199) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TzogS-0005Ts-6P for qemu-devel@nongnu.org; Mon, 28 Jan 2013 08:23:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TzogP-0006yB-JR for qemu-devel@nongnu.org; Mon, 28 Jan 2013 08:23:36 -0500 Received: from nodalink.pck.nerim.net ([62.212.105.220]:48308 helo=paradis.irqsave.net) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TzogP-0006y3-Ar for qemu-devel@nongnu.org; Mon, 28 Jan 2013 08:23:33 -0500 Received: by paradis.irqsave.net (Postfix, from userid 1002) id C1D5E874320; Mon, 28 Jan 2013 14:23:32 +0100 (CET) Received: from localhost.localdomain (unknown [192.168.77.1]) by paradis.irqsave.net (Postfix) with ESMTP id C0E9287432B; Mon, 28 Jan 2013 14:22:18 +0100 (CET) From: =?UTF-8?q?Beno=C3=AEt=20Canet?= To: qemu-devel@nongnu.org Date: Mon, 28 Jan 2013 14:22:59 +0100 Message-Id: <1359379379-6017-14-git-send-email-benoit@irqsave.net> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1359379379-6017-1-git-send-email-benoit@irqsave.net> References: <1359379379-6017-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] [RFC V7 13/13] quorum: Add quorum_open() and quorum_close(). 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 Valid quorum resources look like quorum:threshold/total:path/to/image_1: ... :path/to/image_total ':' is used as a separator '\' is the escaping character for filename containing ':' '\' escape itself ',' must be escaped with ',' On the command line for quorum files "img:test.raw", "img2,raw" and "img3.raw" invocation look like: -drive file=quorum:2/3:img\\:test.raw:img2,,raw:img3.raw (note the double \\ and the double ,,) Signed-off-by: Benoit Canet --- block/quorum.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/block/quorum.c b/block/quorum.c index d6fef58..550fdae 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -816,12 +816,77 @@ static int quorum_snapshot_reopen(BlockDriverState *bs, int bdrv_flags, return ret; } +/* Valid quorum resources look like + * quorum:threshold/total:path/to/image_1: ... :path/to/image_total + * + * ':' is used as a separator + * '\' is the escaping character for filename containing ':' + */ +static int quorum_open(BlockDriverState *bs, const char *filename, int flags) +{ + BDRVQuorumState *s = bs->opaque; + Error *local_err = NULL; + int ret = 0; + int i; + + ret = quorum_parse_url(s, filename, &local_err); + if (ret < 0) { + goto exit; + } + + ret = quorum_validate_url(s, ret, &local_err); + if (ret < 0) { + goto free_exit; + } + + /* Open files */ + for (i = 0; i < s->total; i++) { + s->bs[i] = bdrv_new(""); + ret = bdrv_open(s->bs[i], s->filenames[i], flags, NULL); + if (ret < 0) { + goto error_exit; + } + } + + goto exit; + +error_exit: + for (; i >= 0; i--) { + bdrv_delete(s->bs[i]); + s->bs[i] = NULL; + } +free_exit: + quorum_free(s); +exit: + if (error_is_set(&local_err)) { + qerror_report_err(local_err); + } + return ret; +} + +static void quorum_close(BlockDriverState *bs) +{ + BDRVQuorumState *s = bs->opaque; + int i; + + for (i = 0; i < s->total; i++) { + /* Ensure writes reach stable storage */ + bdrv_flush(s->bs[i]); + bdrv_delete(s->bs[i]); + } + + quorum_free(s); +} + static BlockDriver bdrv_quorum = { .format_name = "quorum", .protocol_name = "quorum", .instance_size = sizeof(BDRVQuorumState), + .bdrv_file_open = quorum_open, + .bdrv_close = quorum_close, + .bdrv_co_flush_to_disk = quorum_co_flush, .bdrv_getlength = quorum_getlength,