[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

答复: [Xen-devel] [PATCH] libxl: make libxl communicate with xenstored by socket or xenbus driver


  • To: Ian Campbell <Ian.Campbell@xxxxxxxxxxxxx>
  • From: "Jun Zhu (Intern)" <Jun.Zhu@xxxxxxxxxx>
  • Date: Mon, 6 Sep 2010 12:28:02 +0100
  • Accept-language: zh-CN, en-US
  • Acceptlanguage: zh-CN, en-US
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Mon, 06 Sep 2010 04:31:10 -0700
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: ActKr2zzHH3I40N/SHKow51XMhnrlADByRuW
  • Thread-topic: [Xen-devel] [PATCH] libxl: make libxl communicate with xenstored by socket or xenbus driver

# HG changeset patch
# User Jun Zhu <Jun.Zhu@xxxxxxxxxx>
# Date 1283771532 -3600
# Node ID f26503f8f56ac0ebbcdbf3aa1dc3a9daeae7cacf
# Parent  5f53805b349ecf1ec4fb588e43e8536b5d18b8f5
libxl uses socket or xenbus dev to communicate with xenstored.

signed-off-by: Jun Zhu <Jun.Zhu@xxxxxxxxxx>

diff -r 5f53805b349e -r f26503f8f56a tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Fri Sep 03 18:44:49 2010 +0100
+++ b/tools/libxl/libxl.c       Mon Sep 06 12:12:12 2010 +0100
@@ -53,9 +53,7 @@
         return ERROR_FAIL;
     }
 
-    ctx->xsh = xs_daemon_open();
-    if (!ctx->xsh)
-        ctx->xsh = xs_domain_open();
+    ctx->xsh = libxl_xs_open();
     if (!ctx->xsh) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, errno, 
                         "cannot connect to xenstore");
@@ -69,7 +67,7 @@
 {
     xc_interface_close(ctx->xch);
     libxl_version_info_destroy(&ctx->version_info);
-    if (ctx->xsh) xs_daemon_close(ctx->xsh); 
+    if (ctx->xsh) libxl_xs_close(ctx->xsh); 
     return 0;
 }
 
@@ -1387,10 +1385,8 @@
 {
     libxl_device_model_starting *starting = for_spawn;
     char *kvs[3];
-    int rc;
     struct xs_handle *xsh;
 
-    xsh = xs_daemon_open();
     /* we mustn't use the parent's handle in the child */
 
     kvs[0] = "image/device-model-pid";
@@ -1398,10 +1394,11 @@
         return;
     kvs[2] = NULL;
 
-    rc = xs_writev(xsh, XBT_NULL, starting->dom_path, kvs);
-    if (rc)
-        return;
-    xs_daemon_close(xsh);
+    xsh = libxl_xs_open();
+    if (!xsh)
+       fprintf(stderr, "cannot connect to xenstore");
+    xs_writev(xsh, XBT_NULL, starting->dom_path, kvs);
+    libxl_xs_close(xsh);
 }
 
 static int libxl_vfb_and_vkb_from_device_model_info(libxl_ctx *ctx,
diff -r 5f53805b349e -r f26503f8f56a tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c        Fri Sep 03 18:44:49 2010 +0100
+++ b/tools/libxl/libxl_device.c        Mon Sep 06 12:12:12 2010 +0100
@@ -405,7 +405,10 @@
     unsigned int num;
     char **l = NULL;
 
-    xsh = xs_daemon_open();
+    xsh = libxl_xs_open();
+    if (!xsh)
+        XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, errno,
+               "cannot connect to xenstore");
     path = libxl_sprintf(&gc, "/local/domain/0/device-model/%d/state", domid);
     xs_watch(xsh, path, path);
     tv.tv_sec = LIBXL_DEVICE_MODEL_START_TIMEOUT;
@@ -427,7 +430,7 @@
 
         free(p);
         xs_unwatch(xsh, path, path);
-        xs_daemon_close(xsh);
+        libxl_xs_close(xsh);
         libxl_free_all(&gc);
         return rc;
 again:
@@ -444,7 +447,7 @@
         }
     }
     xs_unwatch(xsh, path, path);
-    xs_daemon_close(xsh);
+    libxl_xs_close(xsh);
     XL_LOG(ctx, XL_LOG_ERROR, "Device Model not ready");
     libxl_free_all(&gc);
     return -1;
diff -r 5f53805b349e -r f26503f8f56a tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c   Fri Sep 03 18:44:49 2010 +0100
+++ b/tools/libxl/libxl_dom.c   Mon Sep 06 12:12:12 2010 +0100
@@ -283,14 +283,16 @@
 
     snprintf(path, sizeof(path), 
"/local/domain/0/device-model/%u/logdirty/cmd", domid);
 
-    xsh = xs_daemon_open();
+    xsh = libxl_xs_open();
+    if (!xsh)
+        fprintf(stderr, "cannot connect to xenstore");
 
     if (enable)
         xs_write(xsh, XBT_NULL, path, "enable", strlen("enable"));
     else
         xs_write(xsh, XBT_NULL, path, "disable", strlen("disable"));
 
-    xs_daemon_close(xsh);
+    libxl_xs_close(xsh);
 }
 
 static int core_suspend_callback(void *data)
diff -r 5f53805b349e -r f26503f8f56a tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Fri Sep 03 18:44:49 2010 +0100
+++ b/tools/libxl/libxl_internal.h      Mon Sep 06 12:12:12 2010 +0100
@@ -138,6 +138,8 @@
 _hidden char *libxl_xs_get_dompath(libxl_gc *gc, uint32_t domid); // logs errs
 _hidden char *libxl_xs_read(libxl_gc *gc, xs_transaction_t t, char *path);
 _hidden char **libxl_xs_directory(libxl_gc *gc, xs_transaction_t t, char 
*path, unsigned int *nb);
+_hidden struct xs_handle *libxl_xs_open(void);
+_hidden void libxl_xs_close(struct xs_handle *xsh);
 
 /* from xl_dom */
 _hidden int is_hvm(libxl_ctx *ctx, uint32_t domid);
diff -r 5f53805b349e -r f26503f8f56a tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c Fri Sep 03 18:44:49 2010 +0100
+++ b/tools/libxl/libxl_utils.c Mon Sep 06 12:12:12 2010 +0100
@@ -367,7 +367,10 @@
 
 int libxl_ctx_postfork(libxl_ctx *ctx) {
     if (ctx->xsh) xs_daemon_destroy_postfork(ctx->xsh);
-    ctx->xsh = xs_daemon_open();
+    ctx->xsh = libxl_xs_open();
+    if (!ctx->xsh)
+        XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, errno,
+                "cannot connect to xenstore");
     if (!ctx->xsh) return ERROR_FAIL;
     return 0;
 }
diff -r 5f53805b349e -r f26503f8f56a tools/libxl/libxl_xshelp.c
--- a/tools/libxl/libxl_xshelp.c        Fri Sep 03 18:44:49 2010 +0100
+++ b/tools/libxl/libxl_xshelp.c        Mon Sep 06 12:12:12 2010 +0100
@@ -141,3 +141,20 @@
     libxl_ptr_add(gc, ret);
     return ret;
 }
+
+struct xs_handle *libxl_xs_open()
+{
+    struct xs_handle *xsh = NULL;
+
+    xsh = xs_daemon_open();
+    if (!xsh)
+        xsh = xs_domain_open();
+
+    return xsh;
+}
+
+void libxl_xs_close(struct xs_handle *xsh)
+{
+    xs_daemon_close(xsh);
+}



Jun Zhu
Citrix Systems UK
________________________________________
发件人: Ian Campbell
发送时间: 2010年9月2日 上午 10:59
收件人: Jun Zhu (Intern)
抄送: xen-devel@xxxxxxxxxxxxxxxxxxx
主题: Re: [Xen-devel] [PATCH] libxl: make libxl communicate with xenstored by 
socket or xenbus driver

On Thu, 2010-09-02 at 14:56 +0100, Jun Zhu (Intern) wrote:
> Hi,
>
> George sent a patch on this problem before, but it was not completed.
> This patch makes libxl use xenbus to communicate with xenstored if
> libxl cannot open a socket.

I think rather than repeating the pattern:
    xsh = xs_daemon_open();
    if (!xsh)
        xsh = xs_domain_open();
everywhere we should add libxl__xenstore_open() instead.

> There's a place that does not close fd in the case of failure, which
> is also fixed in this patch.

It's a small patch in this case but generally it is best to put separate
fixes in separate patches.

Also you need to add a Signed-off-by to your patches. I suspect the
maintainers would also appreciate it if you would format the email as
        DESCRIPTION

        Signed-off-by:

        PATCH

without additional punctuation or delineation (such as ---Patch----)
which they need to edit out when applying.

Ian.

>
> -----------------------------------------Patch------------------------------------------------------
> diff -r eff592364826 tools/libxl/libxl.c
> --- a/tools/libxl/libxl.c     Wed Sep 01 11:23:49 2010 +0100
> +++ b/tools/libxl/libxl.c     Thu Sep 02 14:51:46 2010 +0100
> @@ -1387,10 +1387,8 @@
>  {
>      libxl_device_model_starting *starting = for_spawn;
>      char *kvs[3];
> -    int rc;
>      struct xs_handle *xsh;
>
> -    xsh = xs_daemon_open();
>      /* we mustn't use the parent's handle in the child */
>
>      kvs[0] = "image/device-model-pid";
> @@ -1398,9 +1396,10 @@
>          return;
>      kvs[2] = NULL;
>
> -    rc = xs_writev(xsh, XBT_NULL, starting->dom_path, kvs);
> -    if (rc)
> -        return;
> +    xsh = xs_daemon_open();
> +    if (!xsh)
> +        xsh = xs_domain_open();
> +    xs_writev(xsh, XBT_NULL, starting->dom_path, kvs);
>      xs_daemon_close(xsh);
>  }
>
> diff -r eff592364826 tools/libxl/libxl_device.c
> --- a/tools/libxl/libxl_device.c      Wed Sep 01 11:23:49 2010 +0100
> +++ b/tools/libxl/libxl_device.c      Thu Sep 02 14:51:46 2010 +0100
> @@ -406,6 +406,8 @@
>      char **l = NULL;
>
>      xsh = xs_daemon_open();
> +    if (!xsh)
> +        xsh = xs_domain_open();
>      path = libxl_sprintf(&gc, "/local/domain/0/device-model/%d/state", 
> domid);
>      xs_watch(xsh, path, path);
>      tv.tv_sec = LIBXL_DEVICE_MODEL_START_TIMEOUT;
> diff -r eff592364826 tools/libxl/libxl_dom.c
> --- a/tools/libxl/libxl_dom.c Wed Sep 01 11:23:49 2010 +0100
> +++ b/tools/libxl/libxl_dom.c Thu Sep 02 14:51:46 2010 +0100
> @@ -284,6 +284,8 @@
>      snprintf(path, sizeof(path), 
> "/local/domain/0/device-model/%u/logdirty/cmd", domid);
>
>      xsh = xs_daemon_open();
> +    if (!xsh)
> +        xsh = xs_domain_open();
>
>      if (enable)
>          xs_write(xsh, XBT_NULL, path, "enable", strlen("enable"));
> diff -r eff592364826 tools/libxl/libxl_utils.c
> --- a/tools/libxl/libxl_utils.c       Wed Sep 01 11:23:49 2010 +0100
> +++ b/tools/libxl/libxl_utils.c       Thu Sep 02 14:51:46 2010 +0100
> @@ -368,6 +368,8 @@
>  int libxl_ctx_postfork(libxl_ctx *ctx) {
>      if (ctx->xsh) xs_daemon_destroy_postfork(ctx->xsh);
>      ctx->xsh = xs_daemon_open();
> +    if (!ctx->xsh)
> +        ctx->xsh = xs_domain_open();
>      if (!ctx->xsh) return ERROR_FAIL;
>      return 0;
>  }
> --------------------------------------END----------------------------------------------
>
>
> Jun Zhu
> Citrix Systems UK
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.