int rc, dm_ver;
libxl__device device;
- const char * path;
+ const char *path, *libxl_path;
+ xs_transaction_t t = XBT_NULL;
char * tmp;
flexarray_t *insert = NULL;
}
path = libxl__device_backend_path(gc, &device);
+ libxl_path = libxl__device_libxl_path(gc, &device);
/* Sanity check: make sure the backend exists before writing here */
tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", path));
else
flexarray_append_pair(insert, "params", "");
- rc = libxl__xs_writev_atonce(gc, path,
- libxl__xs_kvs_of_flexarray(gc, insert, insert->count));
- if (rc) goto out;
+ char **kvs = libxl__xs_kvs_of_flexarray(gc, insert, insert->count);
+
+ for (;;) {
+ rc = libxl__xs_transaction_start(gc, &t);
+ if (rc) goto out;
+
+ rc = libxl__xs_writev(gc, t, path, kvs);
+ if (rc) goto out;
+
+ rc = libxl__xs_writev(gc, t, libxl_path, kvs);
+ if (rc) goto out;
+
+ rc = libxl__xs_transaction_commit(gc, &t);
+ if (!rc) break;
+ if (rc<0) goto out;
+ }
/* success, no actual async */
libxl__ao_complete(egc, ao, 0);
libxl_device_disk_dispose(&disks[i]);
free(disks);
+ libxl__xs_transaction_abort(gc, &t);
+
if (rc) return AO_ABORT(rc);
return AO_INPROGRESS;
}