From 5bd7ac029efc86fe8048060c88f03f2a9486d8d8 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Tue, 10 Dec 2013 19:29:54 +0100 Subject: [PATCH] interface: Take interface status into account when starting and destroying 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 --- 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 2e681ec607..c525ca9c0b 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;