static void nic_setup(libxl__egc *egc, libxl__checkpoint_device *dev) { int rc; libxl__remus_device_nic *remus_nic; const libxl_device_nic *nic = dev->backend_dev; STATE_AO_GC(dev->cds->ao); /* * thers's no subkind of nic devices, so nic ops is always matched * with nic devices */ dev->matched = true; GCNEW(remus_nic); dev->concrete_data = remus_nic; remus_nic->devid = nic->devid; remus_nic->vif = get_vifname(dev, nic); if (!remus_nic->vif) { rc = ERROR_FAIL; goto out; } setup_async_exec(dev, "setup"); rc = libxl__async_exec_start(&dev->aodev.aes); if (rc) goto out; return; out: dev->aodev.rc = rc; dev->aodev.callback(egc, &dev->aodev); }
static void nic_teardown(libxl__egc *egc, libxl__checkpoint_device *dev) { int rc; STATE_AO_GC(dev->cds->ao); setup_async_exec(dev, "teardown"); rc = libxl__async_exec_start(&dev->aodev.aes); if (rc) goto out; return; out: dev->aodev.rc = rc; dev->aodev.callback(egc, &dev->aodev); }
static void match_async_exec(libxl__egc *egc, libxl__remus_device *dev) { int arraysize, nr = 0, rc; const libxl_device_disk *disk = dev->backend_dev; libxl__async_exec_state *aes = &dev->aodev.aes; STATE_AO_GC(dev->rds->ao); /* setup env & args */ arraysize = 1; GCNEW_ARRAY(aes->env, arraysize); aes->env[nr++] = NULL; assert(nr <= arraysize); arraysize = 3; nr = 0; GCNEW_ARRAY(aes->args, arraysize); aes->args[nr++] = dev->rds->drbd_probe_script; aes->args[nr++] = disk->pdev_path; aes->args[nr++] = NULL; assert(nr <= arraysize); aes->ao = dev->rds->ao; aes->what = GCSPRINTF("%s %s", aes->args[0], aes->args[1]); aes->timeout_ms = LIBXL_HOTPLUG_TIMEOUT * 1000; aes->callback = match_async_exec_cb; aes->stdfds[0] = -1; aes->stdfds[1] = -1; aes->stdfds[2] = -1; rc = libxl__async_exec_start(gc, aes); if (rc) goto out; return; out: dev->aodev.rc = rc; dev->aodev.callback(egc, &dev->aodev); }