Commit f2f67390 authored by Nicolas Dichtel's avatar Nicolas Dichtel Committed by David S. Miller

tipc: remove wrong use of NLM_F_MULTI

NLM_F_MULTI must be used only when a NLMSG_DONE message is sent. In fact,
it is sent only at the end of a dump.

Libraries like libnl will wait forever for NLMSG_DONE.

Fixes: 35b9dd76 ("tipc: add bearer get/dump to new netlink api")
Fixes: 7be57fc6 ("tipc: add link get/dump to new netlink api")
Fixes: 46f15c67 ("tipc: add media get/dump to new netlink api")
CC: Richard Alpe <richard.alpe@ericsson.com>
CC: Jon Maloy <jon.maloy@ericsson.com>
CC: Ying Xue <ying.xue@windriver.com>
CC: tipc-discussion@lists.sourceforge.net
Signed-off-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 46c264da
...@@ -591,14 +591,14 @@ void tipc_bearer_stop(struct net *net) ...@@ -591,14 +591,14 @@ void tipc_bearer_stop(struct net *net)
/* Caller should hold rtnl_lock to protect the bearer */ /* Caller should hold rtnl_lock to protect the bearer */
static int __tipc_nl_add_bearer(struct tipc_nl_msg *msg, static int __tipc_nl_add_bearer(struct tipc_nl_msg *msg,
struct tipc_bearer *bearer) struct tipc_bearer *bearer, int nlflags)
{ {
void *hdr; void *hdr;
struct nlattr *attrs; struct nlattr *attrs;
struct nlattr *prop; struct nlattr *prop;
hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family,
NLM_F_MULTI, TIPC_NL_BEARER_GET); nlflags, TIPC_NL_BEARER_GET);
if (!hdr) if (!hdr)
return -EMSGSIZE; return -EMSGSIZE;
...@@ -657,7 +657,7 @@ int tipc_nl_bearer_dump(struct sk_buff *skb, struct netlink_callback *cb) ...@@ -657,7 +657,7 @@ int tipc_nl_bearer_dump(struct sk_buff *skb, struct netlink_callback *cb)
if (!bearer) if (!bearer)
continue; continue;
err = __tipc_nl_add_bearer(&msg, bearer); err = __tipc_nl_add_bearer(&msg, bearer, NLM_F_MULTI);
if (err) if (err)
break; break;
} }
...@@ -705,7 +705,7 @@ int tipc_nl_bearer_get(struct sk_buff *skb, struct genl_info *info) ...@@ -705,7 +705,7 @@ int tipc_nl_bearer_get(struct sk_buff *skb, struct genl_info *info)
goto err_out; goto err_out;
} }
err = __tipc_nl_add_bearer(&msg, bearer); err = __tipc_nl_add_bearer(&msg, bearer, 0);
if (err) if (err)
goto err_out; goto err_out;
rtnl_unlock(); rtnl_unlock();
...@@ -857,14 +857,14 @@ int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info) ...@@ -857,14 +857,14 @@ int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
} }
static int __tipc_nl_add_media(struct tipc_nl_msg *msg, static int __tipc_nl_add_media(struct tipc_nl_msg *msg,
struct tipc_media *media) struct tipc_media *media, int nlflags)
{ {
void *hdr; void *hdr;
struct nlattr *attrs; struct nlattr *attrs;
struct nlattr *prop; struct nlattr *prop;
hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family,
NLM_F_MULTI, TIPC_NL_MEDIA_GET); nlflags, TIPC_NL_MEDIA_GET);
if (!hdr) if (!hdr)
return -EMSGSIZE; return -EMSGSIZE;
...@@ -916,7 +916,8 @@ int tipc_nl_media_dump(struct sk_buff *skb, struct netlink_callback *cb) ...@@ -916,7 +916,8 @@ int tipc_nl_media_dump(struct sk_buff *skb, struct netlink_callback *cb)
rtnl_lock(); rtnl_lock();
for (; media_info_array[i] != NULL; i++) { for (; media_info_array[i] != NULL; i++) {
err = __tipc_nl_add_media(&msg, media_info_array[i]); err = __tipc_nl_add_media(&msg, media_info_array[i],
NLM_F_MULTI);
if (err) if (err)
break; break;
} }
...@@ -963,7 +964,7 @@ int tipc_nl_media_get(struct sk_buff *skb, struct genl_info *info) ...@@ -963,7 +964,7 @@ int tipc_nl_media_get(struct sk_buff *skb, struct genl_info *info)
goto err_out; goto err_out;
} }
err = __tipc_nl_add_media(&msg, media); err = __tipc_nl_add_media(&msg, media, 0);
if (err) if (err)
goto err_out; goto err_out;
rtnl_unlock(); rtnl_unlock();
......
...@@ -2013,7 +2013,7 @@ static int __tipc_nl_add_stats(struct sk_buff *skb, struct tipc_stats *s) ...@@ -2013,7 +2013,7 @@ static int __tipc_nl_add_stats(struct sk_buff *skb, struct tipc_stats *s)
/* Caller should hold appropriate locks to protect the link */ /* Caller should hold appropriate locks to protect the link */
static int __tipc_nl_add_link(struct net *net, struct tipc_nl_msg *msg, static int __tipc_nl_add_link(struct net *net, struct tipc_nl_msg *msg,
struct tipc_link *link) struct tipc_link *link, int nlflags)
{ {
int err; int err;
void *hdr; void *hdr;
...@@ -2022,7 +2022,7 @@ static int __tipc_nl_add_link(struct net *net, struct tipc_nl_msg *msg, ...@@ -2022,7 +2022,7 @@ static int __tipc_nl_add_link(struct net *net, struct tipc_nl_msg *msg,
struct tipc_net *tn = net_generic(net, tipc_net_id); struct tipc_net *tn = net_generic(net, tipc_net_id);
hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family,
NLM_F_MULTI, TIPC_NL_LINK_GET); nlflags, TIPC_NL_LINK_GET);
if (!hdr) if (!hdr)
return -EMSGSIZE; return -EMSGSIZE;
...@@ -2095,7 +2095,7 @@ static int __tipc_nl_add_node_links(struct net *net, struct tipc_nl_msg *msg, ...@@ -2095,7 +2095,7 @@ static int __tipc_nl_add_node_links(struct net *net, struct tipc_nl_msg *msg,
if (!node->links[i]) if (!node->links[i])
continue; continue;
err = __tipc_nl_add_link(net, msg, node->links[i]); err = __tipc_nl_add_link(net, msg, node->links[i], NLM_F_MULTI);
if (err) if (err)
return err; return err;
} }
...@@ -2209,7 +2209,7 @@ int tipc_nl_link_get(struct sk_buff *skb, struct genl_info *info) ...@@ -2209,7 +2209,7 @@ int tipc_nl_link_get(struct sk_buff *skb, struct genl_info *info)
goto err_out; goto err_out;
} }
err = __tipc_nl_add_link(net, &msg, link); err = __tipc_nl_add_link(net, &msg, link, 0);
if (err) if (err)
goto err_out; goto err_out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment