From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:36470) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SwsSo-0006Gg-6a for qemu-devel@nongnu.org; Thu, 02 Aug 2012 06:17:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SwsSn-0003yd-2o for qemu-devel@nongnu.org; Thu, 02 Aug 2012 06:17:06 -0400 Received: from mail-we0-f173.google.com ([74.125.82.173]:57525) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SwsSm-0003xy-TX for qemu-devel@nongnu.org; Thu, 02 Aug 2012 06:17:05 -0400 Received: by mail-we0-f173.google.com with SMTP id z53so5687350wey.4 for ; Thu, 02 Aug 2012 03:17:04 -0700 (PDT) From: "=?UTF-8?q?Beno=C3=AEt=20Canet?=" Date: Thu, 2 Aug 2012 12:16:36 +0200 Message-Id: <1343902604-13981-5-git-send-email-benoit@irqsave.net> In-Reply-To: <1343902604-13981-1-git-send-email-benoit@irqsave.net> References: <1343902604-13981-1-git-send-email-benoit@irqsave.net> Subject: [Qemu-devel] [RFC 04/12] qorum: Add qorum_open(). List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, pbonzini@redhat.com, stefanha@linux.vnet.ibm.com, =?UTF-8?q?Beno=C3=AEt=20Canet?= Signed-off-by: Benoit Canet --- block/qorum.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/block/qorum.c b/block/qorum.c index ea2a720..bdf1530 100644 --- a/block/qorum.c +++ b/block/qorum.c @@ -48,11 +48,73 @@ struct QorumAIOCB { int vote_ret; }; +/* Valid qorum filenames look like + * qorum:path/to/a_image:path/to/b_image:path/to/c_image + */ +static int qorum_open(BlockDriverState *bs, const char *filename, int flags) +{ + BDRVQorumState *s = bs->opaque; + int ret, i; + char *a, *b, *c, *filenames[3]; + + /* Parse the qorum: prefix */ + if (strncmp(filename, "qorum:", strlen("qorum:"))) { + return -EINVAL; + } + a = g_strdup(filename + strlen("qorum:")); + + /* 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_qorum = { .format_name = "qorum", .protocol_name = "qorum", .instance_size = sizeof(BDRVQorumState), + + .bdrv_file_open = qorum_open, }; static void bdrv_qorum_init(void) -- 1.7.9.5