]> git.proxmox.com Git - mirror_ovs.git/commit
dpif: Return ENODEV from dpif_port_query_by_*() if there's no port.
authorDaniele Di Proietto <diproiettod@vmware.com>
Fri, 6 Jan 2017 04:21:23 +0000 (20:21 -0800)
committerDaniele Di Proietto <diproiettod@vmware.com>
Fri, 6 Jan 2017 23:12:44 +0000 (15:12 -0800)
commit0f6a066f638eb2ebf1b49b0e193fa1f5932edb61
tree770784e8a1c680d2824d835a1ecbd3aa5d33e4f2
parent5351980b047f4dd40be7a59a1e4b910df21eca0a
dpif: Return ENODEV from dpif_port_query_by_*() if there's no port.

bridge_delete_or_reconfigure() deletes every interface that's not dumped
by OFPROTO_PORT_FOR_EACH().  ofproto_dpif.c:port_dump_next(), used by
OFPROTO_PORT_FOR_EACH, checks if the ofport is in the datapath by
calling port_query_by_name().  If port_query_by_name() returns an error,
the dump is interrupted.  If port_query_by_name() returns ENODEV, the
device doesn't exist and the dump can continue.

port_query_by_name() for the userspace datapath returns ENOENT instead
of ENODEV.  This is expected by dpif_port_query_by_name(), but it's not
handled correctly by port_dump_next().

dpif-netdev handles reconfiguration errors for an interface by deleting
it from the datapath, so it's possible that a device is missing. When this
happens we must make sure that port_dump_next() continues to dump other
devices, otherwise they will be deleted and the two layers will have an
inconsistent view.

This commit fixes the problem by returning ENODEV from the userspace
datapath if the port doesn't exist, and by documenting this clearly in
the dpif interfaces.

The problem was found while developing new code.

Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com>
Acked-by: Ben Pfaff <blp@ovn.org>
lib/dpif-netdev.c
lib/dpif-provider.h
lib/dpif.c