From: Ian Campbell Date: Fri, 29 Jun 2012 10:19:02 +0000 (+0100) Subject: libxl: libxl__xs_transaction_commit should always clear the transaction. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~8247 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=a79655807bdc466f43a7f0c2f0d683ee50a311f5;p=xen.git libxl: libxl__xs_transaction_commit should always clear the transaction. 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 Acked-by: Ian Jackson Committed-by: Ian Jackson --- diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c index 7fdf164c42..7ca17328f9 100644 --- a/tools/libxl/libxl_xshelp.c +++ b/tools/libxl/libxl_xshelp.c @@ -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; }