libxl: libxl__xs_transaction_commit should always clear the transaction.
authorIan Campbell <ian.campbell@citrix.com>
Fri, 29 Jun 2012 10:19:02 +0000 (11:19 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Fri, 29 Jun 2012 10:19:02 +0000 (11:19 +0100)
This includes the EAGAIN case.

Users are of the form:

   xs_transaction_t t = 0;

   for (;;) {
        rc = libxl__xs_transaction_start(gc, &t);

rc = stuff
if (rc) goto out;
...more...

        rc = libxl__xs_transaction_commit(gc, &t);
        if (!rc) break;
        if (rc<0) goto out;
    }
  ...
 out:

So in EAGAIN (commit -> +1) we will go round the loop again and call start
which leads to:
    xl: libxl_xshelp.c:174: libxl__xs_transaction_start: Assertion `!*t' failed.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/libxl_xshelp.c

index 7fdf164c42216e87e8ff2bbefe2027d1d52da760..7ca17328f97e73d9c34bf07e48c25d08601b79b6 100644 (file)
@@ -185,10 +185,10 @@ int libxl__xs_transaction_commit(libxl__gc *gc, xs_transaction_t *t)
     assert(*t);
 
     if (!xs_transaction_end(CTX->xsh, *t, 0)) {
+        *t = 0;
         if (errno == EAGAIN)
             return +1;
 
-        *t = 0;
         LOGE(ERROR, "could not commit xenstore transaction");
         return ERROR_FAIL;
     }