Fix the get_ifinfo_list() function to retry if nl_recvmsgs fails with
error -NLE_DUMP_INTR.
Add some extra error reporting to get_ifinfo_list().
This is a fix for
https://bugzilla.redhat.com/show_bug.cgi?id=1273052
Signed-off-by: Chris Card <ctcard1(a)gmail.com>
---
libteam/ifinfo.c | 49 ++++++++++++++++++++++++++++++++-----------------
1 file changed, 32 insertions(+), 17 deletions(-)
diff --git a/libteam/ifinfo.c b/libteam/ifinfo.c
index 484ac1b..df3d49a 100644
--- a/libteam/ifinfo.c
+++ b/libteam/ifinfo.c
@@ -332,24 +332,39 @@ int get_ifinfo_list(struct team_handle *th)
.rtgen_family = AF_UNSPEC,
};
int ret;
-
- ret = nl_send_simple(th->nl_cli.sock, RTM_GETLINK, NLM_F_DUMP,
- &rt_hdr, sizeof(rt_hdr));
- if (ret < 0)
- return -nl2syserr(ret);
- orig_cb = nl_socket_get_cb(th->nl_cli.sock);
- cb = nl_cb_clone(orig_cb);
- nl_cb_put(orig_cb);
- if (!cb)
- return -ENOMEM;
-
- nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, valid_handler, th);
-
- ret = nl_recvmsgs(th->nl_cli.sock, cb);
- nl_cb_put(cb);
+ int retry = 1;
+
+ while (retry) {
+ retry = 0;
+ ret = nl_send_simple(th->nl_cli.sock, RTM_GETLINK, NLM_F_DUMP,
+ &rt_hdr, sizeof(rt_hdr));
+ if (ret < 0) {
+ err(th, "get_ifinfo_list: nl_send_simple failed");
+ return -nl2syserr(ret);
+ }
+ orig_cb = nl_socket_get_cb(th->nl_cli.sock);
+ cb = nl_cb_clone(orig_cb);
+ nl_cb_put(orig_cb);
+ if (!cb) {
+ err(th, "get_ifinfo_list: nl_cb_clone failed");
+ return -ENOMEM;
+ }
+
+ nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, valid_handler, th);
+
+ ret = nl_recvmsgs(th->nl_cli.sock, cb);
+ nl_cb_put(cb);
+ if (ret < 0) {
+ err(th, "get_ifinfo_list: nl_recvmsgs failed");
+ if (ret != -NLE_DUMP_INTR)
+ return -nl2syserr(ret);
+ retry = 1;
+ }
+ }
+ ret = check_call_change_handlers(th, TEAM_IFINFO_CHANGE);
if (ret < 0)
- return -nl2syserr(ret);
- return check_call_change_handlers(th, TEAM_IFINFO_CHANGE);
+ err(th, "get_ifinfo_list: check_call_change_handers failed");
+ return ret;
}
int ifinfo_list_init(struct team_handle *th)
--
2.4.3