From 21c55a45efab47f2c8edc25d4fcabc1b99b6628c Mon Sep 17 00:00:00 2001 From: tuqiang Date: Wed, 9 Feb 2022 18:59:34 +0800 Subject: [PATCH] virNetDevOpenvswitchUpdateVlan: fix vlan tag update error We try to update vlan tag by running virsh update-device command, libvirtd will report ovs-vsctl arguments error. Vlan tag update funtion does't consider the xml with no vlan configured circumstances. The steps to reproduce the problem: 1 define and start domain with its vlan configured as: 2 define and run virsh update-device command with no vlan configured as: #virsh update-device dom-id novlan.xml 3 virsh command returned error, and we got an error in libvirtd.log: error : virCommandWait:2584 : internal error: exit status 1: ovs-vsctl: 'set' command requires at least 3 arguments . Child process (ovs-vsctl --timeout=5 -- --if-exists clear Port vnet4.0 tag -- --if-exists clear Port vnet4.0 trunk -- --if-exists clear Port vnet4.0 vlan_mode -- --if-exists set Port vnet4.0) unexpected error : virNetDevOpenvswitchUpdateVlan:540 : internal error: Unable to set vlan configuration on port vnet4.0 Signed-off-by: Tu Qiang Signed-off-by: Yi Wang Reviewed-by: Michal Privoznik --- src/util/virnetdevopenvswitch.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/util/virnetdevopenvswitch.c b/src/util/virnetdevopenvswitch.c index bcdb7c4180..227c04077d 100644 --- a/src/util/virnetdevopenvswitch.c +++ b/src/util/virnetdevopenvswitch.c @@ -605,8 +605,10 @@ int virNetDevOpenvswitchUpdateVlan(const char *ifname, virCommandAddArgList(cmd, "--", "--if-exists", "clear", "Port", ifname, "tag", "--", "--if-exists", "clear", "Port", ifname, "trunk", - "--", "--if-exists", "clear", "Port", ifname, "vlan_mode", - "--", "--if-exists", "set", "Port", ifname, NULL); + "--", "--if-exists", "clear", "Port", ifname, "vlan_mode", NULL); + + if (virtVlan && virtVlan->nTags > 0) + virCommandAddArgList(cmd, "--", "--if-exists", "set", "Port", ifname, NULL); virNetDevOpenvswitchConstructVlans(cmd, virtVlan);