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.

v2: Any error returned by nl_sock_transact_multiple__, except EAGAIN,
causes the rest of NL transactions to be aborted.
An error response from the driver is considered a successful transaction
and the 'done' transactions counter is incremented.

v3: Removed the incrementation of the transactions counter in case of driver
request failure.

Signed-off-by: Sorin Vinturis <svintu...@cloudbasesolutions.com>
Reported-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com>
Reported-at: https://github.com/openvswitch/ovs-issues/issues/57
Acked-by: Eitan Eliahu <elia...@vmware.com>
Acked-by: Nithin Raju <nit...@vmware.com>
---
 lib/netlink-socket.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lib/netlink-socket.c b/lib/netlink-socket.c
index fab2a66..b73d843 100644
--- a/lib/netlink-socket.c
+++ b/lib/netlink-socket.c
@@ -797,8 +797,12 @@ nl_sock_transact_multiple__(struct nl_sock *sock,
                              txn->request->size,
                              reply_buf, sizeof reply_buf,
                              &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 +913,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 occured. Abort the rest of
+                 * transactions. */
+                break;
+            }
         }
     }
 }
-- 
1.9.0.msysgit.0
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to