From patchwork Tue Jan 29 00:11:04 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: MORITA Kazutaka X-Patchwork-Id: 216402 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 DB4D12C0089 for ; Tue, 29 Jan 2013 11:12:39 +1100 (EST) Received: from localhost ([::1]:57633 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TzyoX-00083P-SO for incoming@patchwork.ozlabs.org; Mon, 28 Jan 2013 19:12:37 -0500 Received: from eggs.gnu.org ([208.118.235.92]:37808) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TzyoB-00082T-90 for qemu-devel@nongnu.org; Mon, 28 Jan 2013 19:12:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tzyo9-0000mO-Qg for qemu-devel@nongnu.org; Mon, 28 Jan 2013 19:12:15 -0500 Received: from sh.osrg.net ([192.16.179.4]:43701) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tzyo9-0000lg-BG for qemu-devel@nongnu.org; Mon, 28 Jan 2013 19:12:13 -0500 Received: from fs.osrg.net (postfix@fs.osrg.net [10.0.0.12]) by sh.osrg.net (8.14.3/8.14.3/OSRG-NET) with ESMTP id r0T0C8sK011179; Tue, 29 Jan 2013 09:12:08 +0900 Received: from localhost (unknown [10.32.32.72]) by fs.osrg.net (Postfix) with ESMTP id 46C973B0006; Tue, 29 Jan 2013 09:12:07 +0900 (JST) From: MORITA Kazutaka To: stefanha@redhat.com, kwolf@redhat.com, pbonzini@redhat.com Date: Tue, 29 Jan 2013 09:11:04 +0900 Message-Id: <1359418264-29524-6-git-send-email-morita.kazutaka@lab.ntt.co.jp> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1359418264-29524-1-git-send-email-morita.kazutaka@lab.ntt.co.jp> References: <1359418264-29524-1-git-send-email-morita.kazutaka@lab.ntt.co.jp> X-Dispatcher: imput version 20100215(IM150) Lines: 183 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.3.7 (sh.osrg.net [192.16.179.4]); Tue, 29 Jan 2013 09:12:08 +0900 (JST) X-Virus-Scanned: clamav-milter 0.97.6 at sh X-Virus-Status: Clean X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 192.16.179.4 Cc: qemu-devel@nongnu.org Subject: [Qemu-devel] [PATCH v3 5/5] sheepdog: add support for connecting to unix domain socket 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 This patch adds support for a unix domain socket for a connection between qemu and local sheepdog server. You can use the unix domain socket with the following syntax: $ qemu sheepdog+unix:///?[#snapid] Signed-off-by: MORITA Kazutaka --- block/sheepdog.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++-------- qemu-doc.texi | 6 ++++ qemu-options.hx | 2 +- 3 files changed, 77 insertions(+), 13 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index f35de36..eb7713a 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -299,6 +299,7 @@ typedef struct BDRVSheepdogState { uint32_t cache_flags; char *host_spec; + bool is_unix; int fd; CoMutex lock; @@ -451,7 +452,18 @@ static int connect_to_sdog(BDRVSheepdogState *s) int fd; Error *err = NULL; - fd = inet_connect(s->host_spec, &err); + if (s->is_unix) { + fd = unix_connect(s->host_spec, &err); + } else { + fd = inet_connect(s->host_spec, &err); + + if (err == NULL) { + int ret = socket_set_nodelay(fd); + if (ret < 0) { + error_report("%s", strerror(errno)); + } + } + } if (err != NULL) { qerror_report_err(err); @@ -757,7 +769,7 @@ static int aio_flush_request(void *opaque) */ static int get_sheep_fd(BDRVSheepdogState *s) { - int ret, fd; + int fd; fd = connect_to_sdog(s); if (fd < 0) { @@ -766,13 +778,6 @@ static int get_sheep_fd(BDRVSheepdogState *s) socket_set_nonblock(fd); - ret = socket_set_nodelay(fd); - if (ret) { - error_report("%s", strerror(errno)); - closesocket(fd); - return -errno; - } - qemu_aio_set_fd_handler(fd, co_read_response, NULL, aio_flush_request, s); return fd; } @@ -789,15 +794,42 @@ static int sd_parse_uri(BDRVSheepdogState *s, const char *filename, return -EINVAL; } + /* transport */ + if (!strcmp(uri->scheme, "sheepdog")) { + s->is_unix = false; + } else if (!strcmp(uri->scheme, "sheepdog+tcp")) { + s->is_unix = false; + } else if (!strcmp(uri->scheme, "sheepdog+unix")) { + s->is_unix = true; + } else { + ret = -EINVAL; + goto out; + } + if (uri->path == NULL || !strcmp(uri->path, "/")) { ret = -EINVAL; goto out; } pstrcpy(vdi, SD_MAX_VDI_LEN, uri->path + 1); - /* sheepdog[+tcp]://[host:port]/vdiname */ - s->host_spec = g_strdup_printf("%s:%d", uri->server ?: SD_DEFAULT_ADDR, - uri->port ?: SD_DEFAULT_PORT); + qp = query_params_parse(uri->query); + if (qp->n > 1 || (s->is_unix && !qp->n) || (!s->is_unix && qp->n)) { + ret = -EINVAL; + goto out; + } + + if (s->is_unix) { + /* sheepdog+unix:///vdiname?socket=path */ + if (uri->server || uri->port || strcmp(qp->p[0].name, "socket")) { + ret = -EINVAL; + goto out; + } + s->host_spec = g_strdup(qp->p[0].value); + } else { + /* sheepdog[+tcp]://[host:port]/vdiname */ + s->host_spec = g_strdup_printf("%s:%d", uri->server ?: SD_DEFAULT_ADDR, + uri->port ?: SD_DEFAULT_PORT); + } /* snapshot tag */ if (uri->fragment) { @@ -2097,9 +2129,35 @@ static BlockDriver bdrv_sheepdog_tcp = { .create_options = sd_create_options, }; +static BlockDriver bdrv_sheepdog_unix = { + .format_name = "sheepdog", + .protocol_name = "sheepdog+unix", + .instance_size = sizeof(BDRVSheepdogState), + .bdrv_file_open = sd_open, + .bdrv_close = sd_close, + .bdrv_create = sd_create, + .bdrv_getlength = sd_getlength, + .bdrv_truncate = sd_truncate, + + .bdrv_co_readv = sd_co_readv, + .bdrv_co_writev = sd_co_writev, + .bdrv_co_flush_to_disk = sd_co_flush_to_disk, + + .bdrv_snapshot_create = sd_snapshot_create, + .bdrv_snapshot_goto = sd_snapshot_goto, + .bdrv_snapshot_delete = sd_snapshot_delete, + .bdrv_snapshot_list = sd_snapshot_list, + + .bdrv_save_vmstate = sd_save_vmstate, + .bdrv_load_vmstate = sd_load_vmstate, + + .create_options = sd_create_options, +}; + static void bdrv_sheepdog_init(void) { bdrv_register(&bdrv_sheepdog); bdrv_register(&bdrv_sheepdog_tcp); + bdrv_register(&bdrv_sheepdog_unix); } block_init(bdrv_sheepdog_init); diff --git a/qemu-doc.texi b/qemu-doc.texi index d4eb5eb..9f41589 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -865,6 +865,12 @@ qemu-img create -b sheepdog:///@var{base}#@var{tag} sheepdog:///@var{image} where @var{base} is a image name of the source snapshot and @var{tag} is its tag name. +You can use an unix socket instead of an inet socket: + +@example +qemu-system-i386 sheepdog+unix:///@var{image}?socket=@var{path} +@end example + If the Sheepdog daemon doesn't run on the local host, you need to specify one of the Sheepdog servers to connect to. @example diff --git a/qemu-options.hx b/qemu-options.hx index 09e3b9e..20b9f84 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -2069,7 +2069,7 @@ devices. Syntax for specifying a sheepdog device @example -sheepdog[+tcp]://[host:port]/vdiname[#snapid|#tag] +sheepdog[+tcp|+unix]://[host:port]/vdiname[?socket=path][#snapid|#tag] @end example Example