WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] libxl: handle the return value of wait_for_dev_destr

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] libxl: handle the return value of wait_for_dev_destroy select and pass it to caller function
From: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
Date: Wed, 19 Oct 2011 13:43:07 +0200
Cc: ian.campbell@xxxxxxxxxx
Delivery-date: Wed, 19 Oct 2011 04:44:35 -0700
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=sender:content-type:mime-version:content-transfer-encoding:subject :x-mercurial-node:message-id:user-agent:date:from:to:cc; bh=Pm5UIMuCoOIf6OqeDSSHCxVapvzdYXVMQsCJYsdTqMY=; b=pwHNPxAbp8799+ZuD31qhrhlX689pRfJGztK/vpH+T2DSBVyH9nnOOk52wS4WxlJvq +ewmwgaXH9rmo6t+Sl04bkwaccJXIkcyCNs1evygCAxYx9QgOms1lmlQl544+/jvYrLi FflhezoEc4WI1E4hncRRr30yNLfXusgVBigoQ=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.9.2
# HG changeset patch
# User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
# Date 1319024152 -7200
# Node ID 5941638b04693f7d8bfa2d6b5563132f54942a28
# Parent  a2a3c4d7333ec15b818b3403f148ad61c254ea82
libxl: handle the return value of wait_for_dev_destroy select and pass it to 
caller function.

Handle the return value of the select call inside wait_for_dev_destroy 
properly, and return 0 if the device is removed, or 1 if a timeout or error 
happened. Use the return value of wait_for_dev_destroy inside 
libxl__device_remove to properly return from that function.

This patch should be applied after Ian Campbell's v3 "libxl: rationalise 
libxl_device_* APIs".

Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>

diff -r a2a3c4d7333e -r 5941638b0469 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c        Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl_device.c        Wed Oct 19 13:35:52 2011 +0200
@@ -367,6 +367,7 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
+/* Returns 0 if a device is removed, 1 if an error or timeout occurred */
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -375,22 +376,34 @@ static int wait_for_dev_destroy(libxl__g
     fd_set rfds;
     char **l1 = NULL;
 
+start:
     rc = 1;
     nfds = xs_fileno(ctx->xsh) + 1;
     FD_ZERO(&rfds);
     FD_SET(xs_fileno(ctx->xsh), &rfds);
-    if (select(nfds, &rfds, NULL, NULL, tv) > 0) {
-        l1 = xs_read_watch(ctx->xsh, &n);
-        if (l1 != NULL) {
-            char *state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
-            if (!state || atoi(state) == 6) {
-                xs_unwatch(ctx->xsh, l1[0], l1[1]);
-                xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
-                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Destroyed device backend at 
%s", l1[XS_WATCH_TOKEN]);
-                rc = 0;
+    switch (select(nfds, &rfds, NULL, NULL, tv)) {
+        case -1:
+            if (errno == EINTR)
+                goto start;
+            break;
+        case 0:
+            break;
+        default:
+            l1 = xs_read_watch(ctx->xsh, &n);
+            if (l1 != NULL) {
+                char *state = libxl__xs_read(gc, XBT_NULL,
+                                             l1[XS_WATCH_PATH]);
+                if (!state || atoi(state) == 6) {
+                    xs_unwatch(ctx->xsh, l1[0], l1[1]);
+                    xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
+                    LIBXL__LOG(ctx, LIBXL__LOG_DEBUG,
+                               "Destroyed device backend at %s",
+                               l1[XS_WATCH_TOKEN]);
+                    rc = 0;
+                }
+                free(l1);
             }
-            free(l1);
-        }
+            break;
     }
     return rc;
 }
@@ -436,7 +449,7 @@ retry_transaction:
         struct timeval tv;
         tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
         tv.tv_usec = 0;
-        (void)wait_for_dev_destroy(gc, &tv);
+        rc = wait_for_dev_destroy(gc, &tv);
         xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
     } else {
         rc = 1; /* Caller must wait_for_dev_destroy */

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

<Prev in Thread] Current Thread [Next in Thread>