mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
libxl: don't try to manipulate json config for stubdomain
Stubdomain do not have it's own config file - its configuration is derived from target domains. Do not try to manipulate it when attaching PCI device. This bug prevented starting HVM with stubdomain and PCI passthrough device attached. Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Acked-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Release-acked-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
1 parent
ac2726ecc1
commit
15e9e36ddd
1 file changed
+29
-17
+29
-17
@@ -126,8 +126,11 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc,
|
||||
int rc;
|
||||
libxl_domain_config d_config;
|
||||
libxl__domain_userdata_lock *lock = NULL;
|
||||
bool is_stubdomain = libxl_is_stubdom(CTX, domid, NULL);
|
||||
|
||||
libxl_domain_config_init(&d_config);
|
||||
/* Stubdomain doesn't have own config. */
|
||||
if (!is_stubdomain)
|
||||
libxl_domain_config_init(&d_config);
|
||||
|
||||
be_path = libxl__domain_device_backend_path(gc, 0, domid, 0,
|
||||
LIBXL__DEVICE_KIND_PCI);
|
||||
@@ -153,27 +156,35 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc,
|
||||
if (!starting)
|
||||
flexarray_append_pair(back, "state", GCSPRINTF("%d", XenbusStateReconfiguring));
|
||||
|
||||
lock = libxl__lock_domain_userdata(gc, domid);
|
||||
if (!lock) {
|
||||
rc = ERROR_LOCK_FAIL;
|
||||
goto out;
|
||||
/*
|
||||
* Stubdomin config is derived from its target domain, it doesn't have
|
||||
* its own file.
|
||||
*/
|
||||
if (!is_stubdomain) {
|
||||
lock = libxl__lock_domain_userdata(gc, domid);
|
||||
if (!lock) {
|
||||
rc = ERROR_LOCK_FAIL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = libxl__get_domain_configuration(gc, domid, &d_config);
|
||||
if (rc) goto out;
|
||||
|
||||
device_add_domain_config(gc, &d_config, &libxl__pcidev_devtype,
|
||||
pcidev);
|
||||
|
||||
rc = libxl__dm_check_start(gc, &d_config, domid);
|
||||
if (rc) goto out;
|
||||
}
|
||||
|
||||
rc = libxl__get_domain_configuration(gc, domid, &d_config);
|
||||
if (rc) goto out;
|
||||
|
||||
device_add_domain_config(gc, &d_config, &libxl__pcidev_devtype,
|
||||
pcidev);
|
||||
|
||||
rc = libxl__dm_check_start(gc, &d_config, domid);
|
||||
if (rc) goto out;
|
||||
|
||||
for (;;) {
|
||||
rc = libxl__xs_transaction_start(gc, &t);
|
||||
if (rc) goto out;
|
||||
|
||||
rc = libxl__set_domain_configuration(gc, domid, &d_config);
|
||||
if (rc) goto out;
|
||||
if (lock) {
|
||||
rc = libxl__set_domain_configuration(gc, domid, &d_config);
|
||||
if (rc) goto out;
|
||||
}
|
||||
|
||||
libxl__xs_writev(gc, t, be_path, libxl__xs_kvs_of_flexarray(gc, back));
|
||||
|
||||
@@ -185,7 +196,8 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc,
|
||||
out:
|
||||
libxl__xs_transaction_abort(gc, &t);
|
||||
if (lock) libxl__unlock_domain_userdata(lock);
|
||||
libxl_domain_config_dispose(&d_config);
|
||||
if (!is_stubdomain)
|
||||
libxl_domain_config_dispose(&d_config);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||