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>
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;
}