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: 35b9dd7607f0 ("tipc: add bearer get/dump to new netlink api") Fixes: 7be57fc69184 ("tipc: add link get/dump to new netlink api") Fixes: 46f15c6794fb ("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: Nicolas Dichtel <nicolas.dichtel@6wind.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
46c264daaa
commit
f2f67390a4
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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 @@ msg_full:
|
|||||||
|
|
||||||
/* 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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user