From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:38395) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Syk5W-0005IE-9L for qemu-devel@nongnu.org; Tue, 07 Aug 2012 09:44:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Syk5V-0007wA-2L for qemu-devel@nongnu.org; Tue, 07 Aug 2012 09:44:46 -0400 Received: from mail-we0-f173.google.com ([74.125.82.173]:40626) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Syk5U-0007v3-SJ for qemu-devel@nongnu.org; Tue, 07 Aug 2012 09:44:44 -0400 Received: by mail-we0-f173.google.com with SMTP id z53so2745686wey.4 for ; Tue, 07 Aug 2012 06:44:44 -0700 (PDT) From: "=?UTF-8?q?Beno=C3=AEt=20Canet?=" Date: Tue, 7 Aug 2012 15:44:26 +0200 Message-Id: <1344347073-7773-4-git-send-email-benoit@irqsave.net> In-Reply-To: <1344347073-7773-1-git-send-email-benoit@irqsave.net> References: <1344347073-7773-1-git-send-email-benoit@irqsave.net> Subject: [Qemu-devel] [RFC V2 03/10] quorum: Add quorum_open(). List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, stefanha@linux.vnet.ibm.com, blauwirbel@gmail.com, anthony@codemonkey.ws, pbonzini@redhat.com, eblake@redhat.com, afaerber@suse.de, =?UTF-8?q?Beno=C3=AEt=20Canet?= Signed-off-by: Benoit Canet --- block/quorum.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/block/quorum.c b/block/quorum.c index e0405b6..de58ab8 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -47,11 +47,73 @@ struct QuorumAIOCB { int vote_ret; }; +/* Valid quorum filenames look like + * quorum:path/to/a_image:path/to/b_image:path/to/c_image + */ +static int quorum_open(BlockDriverState *bs, const char *filename, int flags) +{ + BDRVQuorumState *s = bs->opaque; + int ret, i; + char *a, *b, *c, *filenames[3]; + + /* Parse the quorum: prefix */ + if (strncmp(filename, "quorum:", strlen("quorum:"))) { + return -EINVAL; + } + a = g_strdup(filename + strlen("quorum:")); + + /* Find separators */ + b = strchr(a, ':'); + if (b == NULL) { + return -EINVAL; + } + + c = strrchr(a, ':'); + if (c == NULL) { + return -EINVAL; + } + + /* Check that filename contains two separate ':' */ + if (b == c) { + return -EINVAL; + } + + /* Split string */ + *b = '\0'; + *c = '\0'; + + filenames[0] = a; + filenames[1] = b + 1; + filenames[2] = c + 1; + + /* Open files */ + for (i = 0; i <= 2; i++) { + s->bs[i] = bdrv_new(""); + ret = bdrv_open(s->bs[i], filenames[i], flags, NULL); + if (ret < 0) { + goto error_exit; + } + } + + goto clean_exit; + +error_exit: + for (; i >= 0; i--) { + bdrv_delete(s->bs[i]); + s->bs[i] = NULL; + } +clean_exit: + g_free(a); + return ret; +} + static BlockDriver bdrv_quorum = { .format_name = "quorum", .protocol_name = "quorum", .instance_size = sizeof(BDRVQuorumState), + + .bdrv_file_open = quorum_open, }; static void bdrv_quorum_init(void) -- 1.7.9.5