diff options
author | Roger Pau Monne <roger.pau@citrix.com> | 2012-07-26 16:47:30 +0100 |
---|---|---|
committer | Roger Pau Monne <roger.pau@citrix.com> | 2012-07-26 16:47:30 +0100 |
commit | 962eb2acbb8af50f8cddc28ad4479fe9661ab65c (patch) | |
tree | e92990633073eb3d7c9ee42b7223919731c51188 /tools/libxl/libxl_create.c | |
parent | 6c80432517e30bfe178981b1939b17bea6e2f434 (diff) | |
download | xen-962eb2acbb8af50f8cddc28ad4479fe9661ab65c.tar.gz xen-962eb2acbb8af50f8cddc28ad4479fe9661ab65c.tar.bz2 xen-962eb2acbb8af50f8cddc28ad4479fe9661ab65c.zip |
libxl: convert libxl_device_disk_add to an async op
This patch converts libxl_device_disk_add to an ao operation that
waits for device backend to reach state XenbusStateInitWait and then
marks the operation as completed. This is not really useful now, but
will be used by later patches that will launch hotplug scripts after
we reached the desired xenbus state.
As usual, libxl_device_disk_add callers have been modified, and the
internal function libxl__device_disk_add has been used if the call was
inside an already running ao.
Signed-off-by: Roger Pau Monne <roger.pau@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
[ ijc -- drop hunk modifying libxl_cdrom_insert which is not needed after
25670:3666e9712eaf "libxl: make libxl_cdrom_insert async" ]
Committed-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'tools/libxl/libxl_create.c')
-rw-r--r-- | tools/libxl/libxl_create.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 3c950bab9c..0d47eb472a 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -560,6 +560,10 @@ static void domcreate_bootloader_console_available(libxl__egc *egc, static void domcreate_bootloader_done(libxl__egc *egc, libxl__bootloader_state *bl, int rc); + +static void domcreate_launch_dm(libxl__egc *egc, libxl__ao_devices *aodevs, + int ret); + static void domcreate_console_available(libxl__egc *egc, libxl__domain_create_state *dcs); @@ -850,12 +854,10 @@ static void domcreate_rebuild_done(libxl__egc *egc, int ret) { STATE_AO_GC(dcs->ao); - int i; /* convenience aliases */ const uint32_t domid = dcs->guest_domid; libxl_domain_config *const d_config = dcs->guest_config; - libxl__domain_build_state *const state = &dcs->build_state; libxl_ctx *const ctx = CTX; if (ret) { @@ -866,14 +868,34 @@ static void domcreate_rebuild_done(libxl__egc *egc, store_libxl_entry(gc, domid, &d_config->b_info); - for (i = 0; i < d_config->num_disks; i++) { - ret = libxl_device_disk_add(ctx, domid, &d_config->disks[i]); - if (ret) { - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, - "cannot add disk %d to domain: %d", i, ret); - ret = ERROR_FAIL; - goto error_out; - } + dcs->aodevs.size = d_config->num_disks; + dcs->aodevs.callback = domcreate_launch_dm; + libxl__prepare_ao_devices(ao, &dcs->aodevs); + libxl__add_disks(egc, ao, domid, 0, d_config, &dcs->aodevs); + + return; + + error_out: + assert(ret); + domcreate_complete(egc, dcs, ret); +} + +static void domcreate_launch_dm(libxl__egc *egc, libxl__ao_devices *aodevs, + int ret) +{ + libxl__domain_create_state *dcs = CONTAINER_OF(aodevs, *dcs, aodevs); + STATE_AO_GC(dcs->ao); + int i; + + /* convenience aliases */ + const uint32_t domid = dcs->guest_domid; + libxl_domain_config *const d_config = dcs->guest_config; + libxl__domain_build_state *const state = &dcs->build_state; + libxl_ctx *const ctx = CTX; + + if (ret) { + LOG(ERROR, "unable to add disk devices"); + goto error_out; } for (i = 0; i < d_config->num_nics; i++) { ret = libxl_device_nic_add(ctx, domid, &d_config->nics[i]); |