From 931116a29046a91fa072d0cae4523ee9e8529c4f Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Mon, 23 Jul 2012 13:09:46 +0100 Subject: hotplug: vif: fail if a duplicate vifname is used. This is based on a patch from Hans van Kranenburg in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=658305. Quoting that bug report: When configurating a duplicate custom vifname for interfaces in the Xen dom0 that are added to a bridge (which is obviously a configuration error), the hotplug scripts fail silently to rename the new vifX.0 to the custom vifname, if it's already existing. The result of this, is that the domU will start normally, but no network traffic between domU and the dom0 bridge is possible, because the vifX.0 never gets added to the bridge. Worse... when doing xm shutdown on the newly created domU, while investigating the issue, the interface of another running domU gets shut down, and remains hanging around in a DOWN state, because it cannot be removed (the other unrelated domU is still running, but succesfully made unavailable on the network!). When starting the new domU again, the interface of the other domU will be added to the bridge again, and while looking at the output of brctl show, tcpdump and ping, which make no sense, because everything will seem to be right, nagios will notify you of another host being down. :| Note that libxl doesn't actually check the hotplug status yet, this changes with Rogers hotplug script changes. xend correctly picks the failure up. Signed-off-by: Ian Campbell Acked-by: Ian Jackson Committed-by: Ian Campbell --- tools/hotplug/Linux/vif-common.sh | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'tools/hotplug') diff --git a/tools/hotplug/Linux/vif-common.sh b/tools/hotplug/Linux/vif-common.sh index fff22bbf9d..a8bd19a6a3 100644 --- a/tools/hotplug/Linux/vif-common.sh +++ b/tools/hotplug/Linux/vif-common.sh @@ -65,6 +65,20 @@ case "$command" in ;; esac +rename_vif() { + local dev=$1 + local vifname=$2 + + # if a custom vifname was chosen and a link with that desired name + # already exists, then stop, before messing up whatever is using + # that interface (e.g. another running domU) because it's likely a + # configuration error + if ip link show "$vifname" >&/dev/null + then + fatal "Cannot rename interface $dev. An interface with name $vifname already exists." + fi + do_or_die ip link set "$dev" name "$vifname" +} if [ "$type_if" = vif ]; then # Check presence of compulsory args. @@ -74,9 +88,9 @@ if [ "$type_if" = vif ]; then vifname=$(xenstore_read_default "$XENBUS_PATH/vifname" "") if [ "$vifname" ] then - if [ "$command" == "online" ] && ! ip link show "$vifname" >&/dev/null + if [ "$command" == "online" ] then - do_or_die ip link set "$dev" name "$vifname" + rename_vif "$dev" "$vifname" fi dev="$vifname" fi @@ -96,9 +110,9 @@ elif [ "$type_if" = tap ]; then if [ "$vifname" ] then vifname="${vifname}-emu" - if [ "$command" == "add" ] && ! ip link show "$vifname" >&/dev/null + if [ "$command" == "add" ] then - do_or_die ip link set "$dev" name "$vifname" + rename_vif "$dev" "$vifname" fi dev="$vifname" fi -- cgit v1.2.3