netlink-socket: Exit NL transaction loop when EINVAL is returned
authorBen Pfaff <blp@nicira.com>
Mon, 20 Apr 2015 19:43:37 +0000 (12:43 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 20 Apr 2015 19:43:57 +0000 (12:43 -0700)
The nl_sock_transact_multiple function enters in an infinite loop,
when invalid error, EINVAL, is returned by nl_sock_transact_multiple__.
EINVAL is the error returned by the latter function when a driver
request fails.

Signed-off-by: Sorin Vinturis <svinturis@cloudbasesolutions.com>
Reported-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Reported-at: https://github.com/openvswitch/ovs-issues/issues/57
Acked-by: Eitan Eliahu <eliahue@vmware.com>
Acked-by: Nithin Raju <nithin@vmware.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/netlink-socket.c

index fab2a66..a809b1e 100644 (file)
@@ -799,6 +799,8 @@ nl_sock_transact_multiple__(struct nl_sock *sock,
                              &reply_len, NULL)) {
             /* XXX: Map to a more appropriate error. */
             error = EINVAL;
+            VLOG_DBG_RL(&rl, "fatal driver failure: %s",
+                ovs_lasterror_to_string());
             break;
         }
 
@@ -909,6 +911,11 @@ nl_sock_transact_multiple(struct nl_sock *sock,
         } else if (error) {
             VLOG_ERR_RL(&rl, "transaction error (%s)", ovs_strerror(error));
             nl_sock_record_errors__(transactions, n, error);
+            if (error != EAGAIN) {
+                /* A fatal error has occurred.  Abort the rest of
+                 * transactions. */
+                break;
+            }
         }
     }
 }