mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
libxl: cdrom eject and insert: write to /libxl
Copy the new type and params values to /libxl, so that the information in /libxl is kept up to date. This is needed so that we can return this trustworthy information, rather than trusting the backend-writeable parts of xenstore. This is part of XSA-178. Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com> Reviewed-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
17d70465f9
commit
64282177f4
1 file changed
+21
-4
+21
-4
@@ -2496,7 +2496,8 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk,
|
||||
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;
|
||||
@@ -2557,6 +2558,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk,
|
||||
}
|
||||
|
||||
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));
|
||||
@@ -2581,9 +2583,22 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk,
|
||||
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);
|
||||
@@ -2595,6 +2610,8 @@ out:
|
||||
libxl_device_disk_dispose(&disks[i]);
|
||||
free(disks);
|
||||
|
||||
libxl__xs_transaction_abort(gc, &t);
|
||||
|
||||
if (rc) return AO_ABORT(rc);
|
||||
return AO_INPROGRESS;
|
||||
}
|
||||
|
||||