]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemuOpenVhostNet: Decrease vhostfdSize on open failure
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 24 May 2013 12:45:06 +0000 (14:45 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 29 May 2013 07:20:04 +0000 (09:20 +0200)
Currently, if there's an error opening /dev/vhost-net (e.g. because
it doesn't exist) but it's not required we proceed with vhostfd array
filled with -1 and vhostfdSize unchanged. Later, when constructing
the qemu command line only non-negative items within vhostfd array
are taken into account. This means, vhostfdSize may be greater than
the actual count of non-negative items in vhostfd array. This results
in improper command line arguments being generated, e.g.:

-netdev tap,fd=21,id=hostnet0,vhost=on,vhostfd=(null)

src/qemu/qemu_command.c

index 0373626556e7af718a2e8fa38d7c5d0fde92d25d..c4a162a69acbb501f7fbb786800fd8968abb5a1c 100644 (file)
@@ -486,6 +486,10 @@ qemuOpenVhostNet(virDomainDefPtr def,
                                        "but is unavailable"));
                 goto error;
             }
+            VIR_WARN("Unable to open vhost-net. Opened so far %d, requested %d",
+                     i, *vhostfdSize);
+            *vhostfdSize = i;
+            break;
         }
     }
     virDomainAuditNetDevice(def, net, "/dev/vhost-net", *vhostfdSize);
@@ -6560,12 +6564,10 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
     }
 
     for (i = 0; i < vhostfdSize; i++) {
-        if (vhostfd[i] >= 0) {
-            virCommandTransferFD(cmd, vhostfd[i]);
-            if (virAsprintf(&vhostfdName[i], "%d", vhostfd[i]) < 0) {
-                virReportOOMError();
-                goto cleanup;
-            }
+        virCommandTransferFD(cmd, vhostfd[i]);
+        if (virAsprintf(&vhostfdName[i], "%d", vhostfd[i]) < 0) {
+            virReportOOMError();
+            goto cleanup;
         }
     }