From 88c98bf5635c732d4c77e5314ec7440a08a09dec Mon Sep 17 00:00:00 2001 From: Daniele Di Proietto Date: Wed, 6 May 2015 19:00:26 +0100 Subject: [PATCH] dpctl: Ignore enumeration errors if there is at least one datapath. When dpctl commands are used to inspect a userspace datapath, but OVS has also built-in support for the kernel datapath, an error message is reported if the kernel module is not loaded. This commit suppresses the message. Suggested-by: Ethan Jackson Signed-off-by: Daniele Di Proietto Signed-off-by: Ben Pfaff --- lib/dpctl.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/dpctl.c b/lib/dpctl.c index 711b18dc486..05c28d177ff 100644 --- a/lib/dpctl.c +++ b/lib/dpctl.c @@ -621,26 +621,28 @@ dps_for_each(struct dpctl_params *dpctl_p, dps_for_each_cb cb) { struct sset dpif_names = SSET_INITIALIZER(&dpif_names), dpif_types = SSET_INITIALIZER(&dpif_types); - int error, lasterror = 0; + int error, openerror = 0, enumerror = 0; const char *type, *name; + bool at_least_one = false; dp_enumerate_types(&dpif_types); SSET_FOR_EACH (type, &dpif_types) { error = dp_enumerate_names(type, &dpif_names); if (error) { - lasterror = error; + enumerror = error; } SSET_FOR_EACH (name, &dpif_names) { struct dpif *dpif; + at_least_one = true; error = dpif_open(name, type, &dpif); if (!error) { cb(dpif, dpctl_p); dpif_close(dpif); } else { - lasterror = error; + openerror = error; dpctl_error(dpctl_p, error, "opening datapath %s failed", name); } @@ -650,7 +652,17 @@ dps_for_each(struct dpctl_params *dpctl_p, dps_for_each_cb cb) sset_destroy(&dpif_names); sset_destroy(&dpif_types); - return lasterror; + /* If there has been an error while opening a datapath it should be + * reported. Otherwise, we want to ignore the errors generated by + * dp_enumerate_names() if at least one datapath has been discovered, + * because they're not interesting for the user. This happens, for + * example, if OVS is using a userspace datapath and the kernel module + * is not loaded. */ + if (openerror) { + return openerror; + } else { + return at_least_one ? 0 : enumerror; + } } static int