[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 05/13] libxl: convert libxl__device_disk_local_attach to an async op
On Thu, 2012-06-14 at 13:21 +0100, Roger Pau Monne wrote: > +void libxl__device_disk_local_detach(libxl__egc *egc, > + libxl__disk_local_state *dls) > { > + STATE_AO_GC(dls->ao); > int rc = 0; > + libxl_device_disk *disk = &dls->disk; > + libxl__device *device; > + libxl__ao_device *aodev = &dls->aodev; > > switch (disk->backend) { > case LIBXL_DISK_BACKEND_QDISK: > if (disk->vdev != NULL) { > - libxl_device_disk_remove(gc->owner, LIBXL_TOOLSTACK_DOMID, > - disk, 0); > - /* fixme-ao */ > - rc = libxl_device_disk_destroy(gc->owner, > - LIBXL_TOOLSTACK_DOMID, disk, 0); > + GCNEW(device); > + rc = libxl__device_from_disk(gc, LIBXL_TOOLSTACK_DOMID, > + disk, device); > + if (rc != 0) goto out; > + > + libxl__prepare_ao_device(ao, aodev); > + aodev->action = DEVICE_DISCONNECT; > + aodev->dev = device; > + aodev->callback = local_device_detach_cb; > + aodev->force = 0; > + libxl__initiate_device_remove(egc, aodev); > } You need else dls->callback(...) here otherwise in the case where the qdisk attach just used the raw file directly it hangs. You might want to consolidate both this and the default/PHYSTYPE_PHY case which follows into a single "nothing to do, call callback" path? > - break; > + return; > default: > /* > * Nothing to do for PHYSTYPE_PHY. > * For other device types assume that the blktap2 process is > * needed by the soon to be started domain and do nothing. > */ > - break; > + dls->callback(egc, dls, rc); > + return; > } > > +out: > + assert(rc); > + dls->callback(egc, dls, rc); > + return; > +} > > - return rc; > +static void local_device_detach_cb(libxl__egc *egc, libxl__ao_device *aodev) > +{ > + STATE_AO_GC(aodev->ao); > + libxl__disk_local_state *dls = CONTAINER_OF(aodev, *dls, aodev); > + > + if (aodev->rc) { > + LOGE(ERROR, "unable to %s %s with id %u", > + aodev->action == DEVICE_CONNECT ? "add" : "remove", > + libxl__device_kind_to_string(aodev->dev->kind), > + aodev->dev->devid); > + goto out; > + } > + > +out: > + dls->callback(egc, dls, aodev->rc); > + return; > } > > > /******************************************************************************/ > diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c > index 7ebc0df..182a975 100644 > --- a/tools/libxl/libxl_bootloader.c > +++ b/tools/libxl/libxl_bootloader.c > @@ -224,11 +224,6 @@ static void bootloader_cleanup(libxl__egc *egc, > libxl__bootloader_state *bl) > if (bl->outputpath) libxl__remove_file(gc, bl->outputpath); > if (bl->outputdir) libxl__remove_directory(gc, bl->outputdir); > > - if (bl->diskpath) { > - libxl__device_disk_local_detach(gc, &bl->localdisk); > - free(bl->diskpath); > - bl->diskpath = 0; > - } > libxl__domaindeathcheck_stop(gc,&bl->deathcheck); > libxl__datacopier_kill(&bl->keystrokes); > libxl__datacopier_kill(&bl->display); > @@ -249,10 +244,40 @@ static void bootloader_setpaths(libxl__gc *gc, > libxl__bootloader_state *bl) > bl->outputpath = GCSPRINTF(XEN_RUN_DIR "/bootloader.%"PRIu32".out", > domid); > } > > +/* Callbacks */ > + > +static void bootloader_fisnihed_cb(libxl__egc *egc, > + libxl__disk_local_state *dls, > + int rc); > + > static void bootloader_callback(libxl__egc *egc, libxl__bootloader_state *bl, > int rc) > { > bootloader_cleanup(egc, bl); > + > + if (bl->diskpath) { > + bl->dls.callback = bootloader_fisnihed_cb; > + libxl__device_disk_local_detach(egc, &bl->dls); > + return; > + } > + > + bl->callback(egc, bl, rc); > +} > + > +static void bootloader_fisnihed_cb(libxl__egc *egc, > + libxl__disk_local_state *dls, > + int rc) > +{ > + STATE_AO_GC(dls->ao); > + libxl__bootloader_state *bl = CONTAINER_OF(dls, *bl, dls); > + > + free(bl->diskpath); > + bl->diskpath = 0; > + > + if (rc) { > + LOG(ERROR, "unable to detach locally attached disk"); > + } > + > bl->callback(egc, bl, rc); > } > > @@ -275,6 +300,16 @@ static void bootloader_abort(libxl__egc *egc, > > /*----- main flow of control -----*/ > > +/* Callbacks */ > + > +static void bootloader_disk_attached_cb(libxl__egc *egc, > + libxl__disk_local_state *dls, > + int rc); > + > +static void bootloader_disk_failed_cb(libxl__egc *egc, > + libxl__disk_local_state *dls, > + int rc); > + > void libxl__bootloader_run(libxl__egc *egc, libxl__bootloader_state *bl) > { > STATE_AO_GC(bl->ao); > @@ -282,7 +317,6 @@ void libxl__bootloader_run(libxl__egc *egc, > libxl__bootloader_state *bl) > uint32_t domid = bl->domid; > char *logfile_tmp = NULL; > int rc, r; > - const char *bootloader; > > libxl__bootloader_init(bl); > > @@ -344,13 +378,38 @@ void libxl__bootloader_run(libxl__egc *egc, > libxl__bootloader_state *bl) > goto out; > } > > - bl->diskpath = libxl__device_disk_local_attach(gc, bl->disk, > &bl->localdisk, > - info->blkdev_start); > - if (!bl->diskpath) { > - rc = ERROR_FAIL; > - goto out; > + bl->dls.ao = ao; > + bl->dls.in_disk = bl->disk; > + bl->dls.blkdev_start = info->blkdev_start; > + bl->dls.callback = bootloader_disk_attached_cb; > + libxl__device_disk_local_attach(egc, &bl->dls); > + return; > + > + out: > + assert(rc); > + out_ok: > + free(logfile_tmp); > + bootloader_callback(egc, bl, rc); > +} > + > +static void bootloader_disk_attached_cb(libxl__egc *egc, > + libxl__disk_local_state *dls, > + int rc) > +{ > + STATE_AO_GC(dls->ao); > + libxl__bootloader_state *bl = CONTAINER_OF(dls, *bl, dls); > + const libxl_domain_build_info *info = bl->info; > + const char *bootloader; > + > + if (rc) { > + LOG(ERROR, "failed to attach local disk for bootloader execution"); > + dls->callback = bootloader_disk_failed_cb; > + libxl__device_disk_local_detach(egc, dls); > + return; > } > > + bl->diskpath = bl->dls.diskpath; > + > LOG(DEBUG, "Config bootloader value: %s", info->u.pv.bootloader); > > if ( !strcmp(info->u.pv.bootloader, "/usr/bin/pygrub") ) > @@ -389,11 +448,23 @@ void libxl__bootloader_run(libxl__egc *egc, > libxl__bootloader_state *bl) > > out: > assert(rc); > - out_ok: > - free(logfile_tmp); > bootloader_callback(egc, bl, rc); > } > > +static void bootloader_disk_failed_cb(libxl__egc *egc, > + libxl__disk_local_state *dls, > + int rc) > +{ > + STATE_AO_GC(dls->ao); > + libxl__bootloader_state *bl = CONTAINER_OF(dls, *bl, dls); > + > + if (rc) { > + LOG(ERROR, "failed to detach locally attached disk"); > + } > + > + bootloader_callback(egc, bl, ERROR_FAIL); > +} > + > static void bootloader_gotptys(libxl__egc *egc, libxl__openpty_state *op) > { > libxl__bootloader_state *bl = CONTAINER_OF(op, *bl, openpty); > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > index 0000d6b..85c21b4 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -1245,17 +1245,6 @@ _hidden int libxl__device_from_disk(libxl__gc *gc, > uint32_t domid, > _hidden int libxl__device_disk_add(libxl__gc *gc, uint32_t domid, > xs_transaction_t t, libxl_device_disk *disk); > > -/* > - * Make a disk available in this (the control) domain. Returns path to > - * a device. > - */ > -_hidden char * libxl__device_disk_local_attach(libxl__gc *gc, > - const libxl_device_disk *in_disk, > - libxl_device_disk *new_disk, > - const char *blkdev_start); > -_hidden int libxl__device_disk_local_detach(libxl__gc *gc, > - libxl_device_disk *disk); > - > _hidden char *libxl__uuid2string(libxl__gc *gc, const libxl_uuid uuid); > > struct libxl__xen_console_reader { > @@ -1775,6 +1764,35 @@ struct libxl__ao_devices { > _hidden void libxl__initiate_device_remove(libxl__egc *egc, > libxl__ao_device *aodev); > > +/*----- local disk attach: attach a disk locally to run the bootloader > -----*/ > + > +typedef struct libxl__disk_local_state libxl__disk_local_state; > +typedef void libxl__disk_local_state_callback(libxl__egc*, > + libxl__disk_local_state*, > + int rc); > + > +struct libxl__disk_local_state { > + /* filled by the user */ > + libxl__ao *ao; > + const libxl_device_disk *in_disk; > + libxl_device_disk disk; > + const char *blkdev_start; > + libxl__disk_local_state_callback *callback; > + /* filled by libxl__device_disk_local_attach */ > + char *diskpath; > + /* private for implementation of local detach */ > + libxl__ao_device aodev; > +}; > + > +/* > + * Make a disk available in this (the control) domain. Calls dls->callback > + * when finished. > + */ > +_hidden void libxl__device_disk_local_attach(libxl__egc *egc, > + libxl__disk_local_state *dls); > +_hidden void libxl__device_disk_local_detach(libxl__egc *egc, > + libxl__disk_local_state *dls); > + > /*----- datacopier: copies data from one fd to another -----*/ > > typedef struct libxl__datacopier_state libxl__datacopier_state; > @@ -1872,7 +1890,7 @@ struct libxl__bootloader_state { > * the caller using libxl__device_disk_local_detach, but only > * after the domain's kernel and initramfs have been loaded into > * memory and the file references disposed of. */ > - libxl_device_disk localdisk; > + libxl__disk_local_state dls; > uint32_t domid; > /* outputs: > * - caller must initialise kernel and ramdisk to point to file > -- > 1.7.7.5 (Apple Git-26) > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |