[PATCH 2/2] interface: Take interface status into account when starting and destroying

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



https://bugzilla.redhat.com/show_bug.cgi?id=956994

Currently, it is possible to start an interface that is already running:

 # virsh iface-start eth2
 Interface eth2 started

 # echo $?
 0

 # virsh iface-start eth2
 Interface eth2 started

 # echo $?
 0

 # virsh iface-start eth2
 Interface eth2 started

 # echo $?
 0

Same applies for destroying a dead interface. We should not allow such
state transitions.

Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx>
---
 src/interface/interface_backend_netcf.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
index 2e681ec..c525ca9 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -944,6 +944,7 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
     struct netcf_if *iface = NULL;
     virInterfaceDefPtr def = NULL;
     int ret = -1;
+    bool active;
 
     virCheckFlags(0, -1);
 
@@ -962,6 +963,15 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
     if (virInterfaceCreateEnsureACL(ifinfo->conn, def) < 0)
        goto cleanup;
 
+    if (netcfInterfaceObjIsActive(iface, &active) < 0)
+        goto cleanup;
+
+    if (active) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("interface is already running"));
+        goto cleanup;
+    }
+
     ret = ncf_if_up(iface);
     if (ret < 0) {
         const char *errmsg, *details;
@@ -987,6 +997,7 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
     struct netcf_if *iface = NULL;
     virInterfaceDefPtr def = NULL;
     int ret = -1;
+    bool active;
 
     virCheckFlags(0, -1);
 
@@ -1005,6 +1016,15 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
     if (virInterfaceDestroyEnsureACL(ifinfo->conn, def) < 0)
        goto cleanup;
 
+    if (netcfInterfaceObjIsActive(iface, &active) < 0)
+        goto cleanup;
+
+    if (!active) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("interface is not running"));
+        goto cleanup;
+    }
+
     ret = ncf_if_down(iface);
     if (ret < 0) {
         const char *errmsg, *details;
-- 
1.8.5.1

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]