From patchwork Tue Mar 29 12:49:07 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Prasanna Kumar Kalever X-Patchwork-Id: 8686541 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4F3C19F36E for ; Tue, 29 Mar 2016 12:49:54 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4225420328 for ; Tue, 29 Mar 2016 12:49:53 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 081B0202F2 for ; Tue, 29 Mar 2016 12:49:52 +0000 (UTC) Received: from localhost ([::1]:46573 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1akt5j-0001VI-Gb for patchwork-qemu-devel@patchwork.kernel.org; Tue, 29 Mar 2016 08:49:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44718) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1akt5S-0001OL-GJ for qemu-devel@nongnu.org; Tue, 29 Mar 2016 08:49:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1akt5P-0003cI-8P for qemu-devel@nongnu.org; Tue, 29 Mar 2016 08:49:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58579) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1akt5O-0003cD-VK for qemu-devel@nongnu.org; Tue, 29 Mar 2016 08:49:31 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 8F65646201; Tue, 29 Mar 2016 12:49:30 +0000 (UTC) Received: from dhcp1-86.lab.eng.blr.redhat.com (pkalever.blr.redhat.com [10.70.1.86]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2TCnE9c025690; Tue, 29 Mar 2016 08:49:25 -0400 From: Prasanna Kumar Kalever To: qemu-devel@nongnu.org Date: Tue, 29 Mar 2016 18:19:07 +0530 Message-Id: <1459255748-22770-4-git-send-email-prasanna.kalever@redhat.com> In-Reply-To: <1459255748-22770-1-git-send-email-prasanna.kalever@redhat.com> References: <1459255748-22770-1-git-send-email-prasanna.kalever@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: kwolf@redhat.com, pkrempa@redhat.com, jcody@redhat.com, deepakcs@redhat.com, bharata@linux.vnet.ibm.com, rtalur@redhat.com, Prasanna Kumar Kalever Subject: [Qemu-devel] [PATCH v16 3/4] block/gluster: using new qapi schema 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP this patch adds 'GlusterServer' related schema in qapi/block-core.json Signed-off-by: Prasanna Kumar Kalever --- block/gluster.c | 101 ++++++++++++++++++++++++++------------------------- qapi/block-core.json | 60 ++++++++++++++++++++++++++++-- 2 files changed, 108 insertions(+), 53 deletions(-) diff --git a/block/gluster.c b/block/gluster.c index 6c73e62..9b360e3 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -12,6 +12,10 @@ #include "block/block_int.h" #include "qemu/uri.h" +#define GLUSTER_OPT_FILENAME "filename" +#define GLUSTER_DEFAULT_PORT 24007 + + typedef struct GlusterAIOCB { int64_t size; int ret; @@ -30,15 +34,6 @@ typedef struct BDRVGlusterReopenState { struct glfs_fd *fd; } BDRVGlusterReopenState; -typedef struct GlusterConf { - char *host; - int port; - char *volume; - char *path; - char *transport; -} GlusterConf; - - static QemuOptsList qemu_gluster_create_opts = { .name = "qemu-gluster-create-opts", .head = QTAILQ_HEAD_INITIALIZER(qemu_gluster_create_opts.head), @@ -62,7 +57,7 @@ static QemuOptsList runtime_opts = { .head = QTAILQ_HEAD_INITIALIZER(runtime_opts.head), .desc = { { - .name = "filename", + .name = GLUSTER_OPT_FILENAME, .type = QEMU_OPT_STRING, .help = "URL to the gluster image", }, @@ -71,18 +66,7 @@ static QemuOptsList runtime_opts = { }; -static void qemu_gluster_gconf_free(GlusterConf *gconf) -{ - if (gconf) { - g_free(gconf->host); - g_free(gconf->volume); - g_free(gconf->path); - g_free(gconf->transport); - g_free(gconf); - } -} - -static int parse_volume_options(GlusterConf *gconf, char *path) +static int parse_volume_options(BlockdevOptionsGluster *gconf, char *path) { char *p, *q; @@ -144,8 +128,10 @@ static int parse_volume_options(GlusterConf *gconf, char *path) * file=gluster+unix:///testvol/dir/a.img?socket=/tmp/glusterd.socket * file=gluster+rdma://1.2.3.4:24007/testvol/a.img */ -static int qemu_gluster_parseuri(GlusterConf *gconf, const char *filename) +static int qemu_gluster_parseuri(BlockdevOptionsGluster **pgconf, + const char *filename) { + BlockdevOptionsGluster *gconf; URI *uri; QueryParams *qp = NULL; bool is_unix = false; @@ -156,20 +142,24 @@ static int qemu_gluster_parseuri(GlusterConf *gconf, const char *filename) return -EINVAL; } + gconf = g_new0(BlockdevOptionsGluster, 1); + gconf->server = g_new0(GlusterServer, 1); + /* transport */ if (!uri->scheme || !strcmp(uri->scheme, "gluster")) { - gconf->transport = g_strdup("tcp"); + gconf->server->transport = GLUSTER_TRANSPORT_TCP; } else if (!strcmp(uri->scheme, "gluster+tcp")) { - gconf->transport = g_strdup("tcp"); + gconf->server->transport = GLUSTER_TRANSPORT_TCP; } else if (!strcmp(uri->scheme, "gluster+unix")) { - gconf->transport = g_strdup("unix"); + gconf->server->transport = GLUSTER_TRANSPORT_UNIX; is_unix = true; } else if (!strcmp(uri->scheme, "gluster+rdma")) { - gconf->transport = g_strdup("rdma"); + gconf->server->transport = GLUSTER_TRANSPORT_RDMA; } else { ret = -EINVAL; goto out; } + gconf->server->has_transport = true; ret = parse_volume_options(gconf, uri->path); if (ret < 0) { @@ -191,13 +181,23 @@ static int qemu_gluster_parseuri(GlusterConf *gconf, const char *filename) ret = -EINVAL; goto out; } - gconf->host = g_strdup(qp->p[0].value); + gconf->server->host = g_strdup(qp->p[0].value); } else { - gconf->host = g_strdup(uri->server ? uri->server : "localhost"); - gconf->port = uri->port; + gconf->server->host = g_strdup(uri->server ? uri->server : "localhost"); + if (uri->port) { + gconf->server->port = uri->port; + } else { + gconf->server->port = GLUSTER_DEFAULT_PORT; + } + gconf->server->has_port = true; } + *pgconf = gconf; + out: + if (ret < 0) { + qapi_free_BlockdevOptionsGluster(gconf); + } if (qp) { query_params_free(qp); } @@ -205,14 +205,15 @@ out: return ret; } -static struct glfs *qemu_gluster_init(GlusterConf *gconf, const char *filename, - Error **errp) +static struct glfs *qemu_gluster_init(BlockdevOptionsGluster **pgconf, + const char *filename, Error **errp) { struct glfs *glfs = NULL; int ret; int old_errno; + BlockdevOptionsGluster *gconf = NULL; - ret = qemu_gluster_parseuri(gconf, filename); + ret = qemu_gluster_parseuri(&gconf, filename); if (ret < 0) { error_setg(errp, "Usage: file=gluster[+transport]://[host[:port]]/" "volume/path[?socket=...]"); @@ -225,8 +226,9 @@ static struct glfs *qemu_gluster_init(GlusterConf *gconf, const char *filename, goto out; } - ret = glfs_set_volfile_server(glfs, gconf->transport, gconf->host, - gconf->port); + ret = glfs_set_volfile_server(glfs, + GlusterTransport_lookup[gconf->server->transport], + gconf->server->host, gconf->server->port); if (ret < 0) { goto out; } @@ -244,9 +246,9 @@ static struct glfs *qemu_gluster_init(GlusterConf *gconf, const char *filename, if (ret) { error_setg_errno(errp, errno, "Gluster connection failed for host=%s port=%d " - "volume=%s path=%s transport=%s", gconf->host, - gconf->port, gconf->volume, gconf->path, - gconf->transport); + "volume=%s path=%s transport=%s", gconf->server->host, + gconf->server->port, gconf->volume, gconf->path, + GlusterTransport_lookup[gconf->server->transport]); /* glfs_init sometimes doesn't set errno although docs suggest that */ if (errno == 0) @@ -254,9 +256,11 @@ static struct glfs *qemu_gluster_init(GlusterConf *gconf, const char *filename, goto out; } + *pgconf = gconf; return glfs; out: + qapi_free_BlockdevOptionsGluster(gconf); if (glfs) { old_errno = errno; glfs_fini(glfs); @@ -316,7 +320,7 @@ static int qemu_gluster_open(BlockDriverState *bs, QDict *options, BDRVGlusterState *s = bs->opaque; int open_flags = 0; int ret = 0; - GlusterConf *gconf = g_new0(GlusterConf, 1); + BlockdevOptionsGluster *gconf = NULL; QemuOpts *opts; Error *local_err = NULL; const char *filename; @@ -330,8 +334,7 @@ static int qemu_gluster_open(BlockDriverState *bs, QDict *options, } filename = qemu_opt_get(opts, "filename"); - - s->glfs = qemu_gluster_init(gconf, filename, errp); + s->glfs = qemu_gluster_init(&gconf, filename, errp); if (!s->glfs) { ret = -errno; goto out; @@ -346,7 +349,7 @@ static int qemu_gluster_open(BlockDriverState *bs, QDict *options, out: qemu_opts_del(opts); - qemu_gluster_gconf_free(gconf); + qapi_free_BlockdevOptionsGluster(gconf); if (!ret) { return ret; } @@ -364,7 +367,7 @@ static int qemu_gluster_reopen_prepare(BDRVReopenState *state, { int ret = 0; BDRVGlusterReopenState *reop_s; - GlusterConf *gconf = NULL; + BlockdevOptionsGluster *gconf = NULL; int open_flags = 0; assert(state != NULL); @@ -375,9 +378,7 @@ static int qemu_gluster_reopen_prepare(BDRVReopenState *state, qemu_gluster_parse_flags(state->flags, &open_flags); - gconf = g_new0(GlusterConf, 1); - - reop_s->glfs = qemu_gluster_init(gconf, state->bs->filename, errp); + reop_s->glfs = qemu_gluster_init(&gconf, state->bs->filename, errp); if (reop_s->glfs == NULL) { ret = -errno; goto exit; @@ -392,7 +393,7 @@ static int qemu_gluster_reopen_prepare(BDRVReopenState *state, exit: /* state->opaque will be freed in either the _abort or _commit */ - qemu_gluster_gconf_free(gconf); + qapi_free_BlockdevOptionsGluster(gconf); return ret; } @@ -496,15 +497,15 @@ static inline int qemu_gluster_zerofill(struct glfs_fd *fd, int64_t offset, static int qemu_gluster_create(const char *filename, QemuOpts *opts, Error **errp) { + BlockdevOptionsGluster *gconf = NULL; struct glfs *glfs; struct glfs_fd *fd; int ret = 0; int prealloc = 0; int64_t total_size = 0; char *tmp = NULL; - GlusterConf *gconf = g_new0(GlusterConf, 1); - glfs = qemu_gluster_init(gconf, filename, errp); + glfs = qemu_gluster_init(&gconf, filename, errp); if (!glfs) { ret = -errno; goto out; @@ -544,7 +545,7 @@ static int qemu_gluster_create(const char *filename, } out: g_free(tmp); - qemu_gluster_gconf_free(gconf); + qapi_free_BlockdevOptionsGluster(gconf); if (glfs) { glfs_fini(glfs); } diff --git a/qapi/block-core.json b/qapi/block-core.json index b1cf77d..7687a9c 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -1633,13 +1633,14 @@ # Drivers that are supported in block device operations. # # @host_device, @host_cdrom: Since 2.1 +# @gluster: Since 2.6 # # Since: 2.0 ## { 'enum': 'BlockdevDriver', 'data': [ 'archipelago', 'blkdebug', 'blkverify', 'bochs', 'cloop', - 'dmg', 'file', 'ftp', 'ftps', 'host_cdrom', 'host_device', - 'http', 'https', 'null-aio', 'null-co', 'parallels', + 'dmg', 'file', 'ftp', 'ftps', 'gluster', 'host_cdrom', + 'host_device', 'http', 'https', 'null-aio', 'null-co', 'parallels', 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'tftp', 'vdi', 'vhdx', 'vmdk', 'vpc', 'vvfat' ] } @@ -2017,6 +2018,59 @@ '*read-pattern': 'QuorumReadPattern' } } ## +# @GlusterTransport +# +# An enumeration of Gluster transport type +# +# @tcp: TCP - Transmission Control Protocol +# +# @unix: UNIX - Unix domain socket +# +# @rdma: RDMA - Remote direct memory access +# +# Since: 2.6 +## +{ 'enum': 'GlusterTransport', 'data': [ 'tcp', 'unix', 'rdma'] } + +## +# @GlusterServer +# +# Details for connecting to a gluster server +# +# @host: host address (hostname/ipv4/ipv6 addresses) +# +# @port: #optional port number on which glusterd is listening +# (default 24007) +# +# @transport: #optional transport type used to connect to gluster management +# daemon (default 'tcp') +# +# Since: 2.6 +## +{ 'struct': 'GlusterServer', + 'data': { 'host': 'str', + '*port': 'uint16', + '*transport': 'GlusterTransport' } } + +## +# @BlockdevOptionsGluster +# +# Driver specific block device options for Gluster +# +# @volume: name of gluster volume where VM image resides +# +# @path: absolute path to image file in gluster volume +# +# @servers: gluster server description +# +# Since: 2.6 +## +{ 'struct': 'BlockdevOptionsGluster', + 'data': { 'volume': 'str', + 'path': 'str', + 'server': 'GlusterServer' } } + +## # @BlockdevOptions # # Options for creating a block device. Many options are available for all @@ -2079,7 +2133,7 @@ 'file': 'BlockdevOptionsFile', 'ftp': 'BlockdevOptionsFile', 'ftps': 'BlockdevOptionsFile', -# TODO gluster: Wait for structured options + 'gluster': 'BlockdevOptionsGluster', 'host_cdrom': 'BlockdevOptionsFile', 'host_device':'BlockdevOptionsFile', 'http': 'BlockdevOptionsFile',