]> xenbits.xensource.com Git - libvirt.git/commitdiff
libxlDomainAttachNetDevice: release actual deivce and remove hostdev when fail
authorChunyan Liu <cyliu@suse.com>
Mon, 21 Mar 2016 08:11:36 +0000 (16:11 +0800)
committerJim Fehlig <jfehlig@suse.com>
Fri, 25 Mar 2016 22:57:33 +0000 (16:57 -0600)
When AttachNetDevice failed, should call networkReleaseActualDevice
to release actual device, and if actual device is hostdev, should
remove the hostdev from vm->def->hostdevs.

Signed-off-by: Chunyan Liu <cyliu@suse.com>
src/libxl/libxl_driver.c

index 87ec5a530c4920adae6cf9b11446a15b95273a70..f6417eaf61d28979413fdb137b6a71bad0a0367f 100644 (file)
@@ -3122,16 +3122,18 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
     int ret = -1;
     char mac[VIR_MAC_STRING_BUFLEN];
 
+    libxl_device_nic_init(&nic);
+
     /* preallocate new slot for device */
     if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0)
-        goto out;
+        goto cleanup;
 
     /* If appropriate, grab a physical device from the configured
      * network's pool of devices, or resolve bridge device name
      * to the one defined in the network definition.
      */
     if (networkAllocateActualDevice(vm->def, net) < 0)
-        goto out;
+        goto cleanup;
 
     actualType = virDomainNetGetActualType(net);
 
@@ -3139,7 +3141,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
         virReportError(VIR_ERR_INVALID_ARG,
                        _("network device with mac %s already exists"),
                        virMacAddrFormat(&net->mac, mac));
-        return -1;
+        goto cleanup;
     }
 
     if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
@@ -3150,10 +3152,9 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
          */
         ret = libxlDomainAttachHostDevice(driver, vm,
                                           virDomainNetGetActualHostdev(net));
-        goto out;
+        goto cleanup;
     }
 
-    libxl_device_nic_init(&nic);
     if (libxlMakeNic(vm->def, net, &nic) < 0)
         goto cleanup;
 
@@ -3163,13 +3164,15 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
         goto cleanup;
     }
 
+    vm->def->nets[vm->def->nnets++] = net;
     ret = 0;
 
  cleanup:
     libxl_device_nic_dispose(&nic);
- out:
-    if (!ret)
-        vm->def->nets[vm->def->nnets++] = net;
+    if (ret) {
+        virDomainNetRemoveHostdev(vm->def, net);
+        networkReleaseActualDevice(vm->def, net);
+    }
     virObjectUnref(cfg);
     return ret;
 }