Yes, this looks ok.

Reviewed-by: me


On 08/17/2016 09:42 AM, Richard Alpe wrote:
> Add TIPC_NL_PEER_REMOVE netlink command. This command can remove
> an offline peer node from the internal data structures.
>
> This will be supported by the tipc user space tool in iproute2.
>
> Signed-off-by: Richard Alpe <richard.a...@ericsson.com>
> Reviewed-by: Jon Maloy <jon.ma...@ericsson.com>
> Acked-by: Ying Xue <ying....@windriver.com>
> ---
>   include/uapi/linux/tipc_netlink.h |  1 +
>   net/tipc/net.h                    |  2 ++
>   net/tipc/netlink.c                |  5 ++++
>   net/tipc/node.c                   | 63 
> +++++++++++++++++++++++++++++++++++++++
>   net/tipc/node.h                   |  1 +
>   5 files changed, 72 insertions(+)
>
> diff --git a/include/uapi/linux/tipc_netlink.h 
> b/include/uapi/linux/tipc_netlink.h
> index 5f3f6d0..bcb65ef 100644
> --- a/include/uapi/linux/tipc_netlink.h
> +++ b/include/uapi/linux/tipc_netlink.h
> @@ -59,6 +59,7 @@ enum {
>       TIPC_NL_MON_SET,
>       TIPC_NL_MON_GET,
>       TIPC_NL_MON_PEER_GET,
> +     TIPC_NL_PEER_REMOVE,
>   
>       __TIPC_NL_CMD_MAX,
>       TIPC_NL_CMD_MAX = __TIPC_NL_CMD_MAX - 1
> diff --git a/net/tipc/net.h b/net/tipc/net.h
> index 77a7a11..c7c2549 100644
> --- a/net/tipc/net.h
> +++ b/net/tipc/net.h
> @@ -39,6 +39,8 @@
>   
>   #include <net/genetlink.h>
>   
> +extern const struct nla_policy tipc_nl_net_policy[];
> +
>   int tipc_net_start(struct net *net, u32 addr);
>   
>   void tipc_net_stop(struct net *net);
> diff --git a/net/tipc/netlink.c b/net/tipc/netlink.c
> index a84daec..2718de6 100644
> --- a/net/tipc/netlink.c
> +++ b/net/tipc/netlink.c
> @@ -238,6 +238,11 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
>               .dumpit = tipc_nl_node_dump_monitor_peer,
>               .policy = tipc_nl_policy,
>       },
> +     {
> +             .cmd    = TIPC_NL_PEER_REMOVE,
> +             .doit   = tipc_nl_peer_rm,
> +             .policy = tipc_nl_policy,
> +     }
>   };
>   
>   int tipc_nlmsg_parse(const struct nlmsghdr *nlh, struct nlattr ***attr)
> diff --git a/net/tipc/node.c b/net/tipc/node.c
> index 2197419..7e8b75f 100644
> --- a/net/tipc/node.c
> +++ b/net/tipc/node.c
> @@ -1553,6 +1553,69 @@ discard:
>       kfree_skb(skb);
>   }
>   
> +int tipc_nl_peer_rm(struct sk_buff *skb, struct genl_info *info)
> +{
> +     struct net *net = sock_net(skb->sk);
> +     struct tipc_net *tn = net_generic(net, tipc_net_id);
> +     struct nlattr *attrs[TIPC_NLA_NET_MAX + 1];
> +     struct tipc_node *peer;
> +     u32 addr;
> +     int err;
> +     int i;
> +
> +     /* We identify the peer by its net */
> +     if (!info->attrs[TIPC_NLA_NET])
> +             return -EINVAL;
> +
> +     err = nla_parse_nested(attrs, TIPC_NLA_NET_MAX,
> +                            info->attrs[TIPC_NLA_NET],
> +                            tipc_nl_net_policy);
> +     if (err)
> +             return err;
> +
> +     if (!attrs[TIPC_NLA_NET_ADDR])
> +             return -EINVAL;
> +
> +     addr = nla_get_u32(attrs[TIPC_NLA_NET_ADDR]);
> +
> +     if (in_own_node(net, addr))
> +             return -ENOTSUPP;
> +
> +     spin_lock_bh(&tn->node_list_lock);
> +     peer = tipc_node_find(net, addr);
> +     if (!peer) {
> +             spin_unlock_bh(&tn->node_list_lock);
> +             return -ENXIO;
> +     }
> +
> +     tipc_node_write_lock(peer);
> +     if (peer->state != SELF_DOWN_PEER_DOWN &&
> +         peer->state != SELF_DOWN_PEER_LEAVING) {
> +             tipc_node_write_unlock(peer);
> +             err = -EBUSY;
> +             goto err_out;
> +     }
> +
> +     for (i = 0; i < MAX_BEARERS; i++) {
> +             struct tipc_link_entry *le = &peer->links[i];
> +
> +             if (le->link) {
> +                     kfree(le->link);
> +                     le->link = NULL;
> +                     peer->link_cnt--;
> +             }
> +     }
> +     tipc_node_write_unlock(peer);
> +     tipc_node_delete(peer);
> +
> +     err = 0;
> +err_out:
> +     tipc_node_put(peer);
> +     spin_unlock_bh(&tn->node_list_lock);
> +
> +     return err;
> +}
> +
>   int tipc_nl_node_dump(struct sk_buff *skb, struct netlink_callback *cb)
>   {
>       int err;
> diff --git a/net/tipc/node.h b/net/tipc/node.h
> index d69fdfc..4578b34 100644
> --- a/net/tipc/node.h
> +++ b/net/tipc/node.h
> @@ -77,6 +77,7 @@ int tipc_nl_node_dump_link(struct sk_buff *skb, struct 
> netlink_callback *cb);
>   int tipc_nl_node_reset_link_stats(struct sk_buff *skb, struct genl_info 
> *info);
>   int tipc_nl_node_get_link(struct sk_buff *skb, struct genl_info *info);
>   int tipc_nl_node_set_link(struct sk_buff *skb, struct genl_info *info);
> +int tipc_nl_peer_rm(struct sk_buff *skb, struct genl_info *info);
>   
>   int tipc_nl_node_set_monitor(struct sk_buff *skb, struct genl_info *info);
>   int tipc_nl_node_get_monitor(struct sk_buff *skb, struct genl_info *info);


------------------------------------------------------------------------------
_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to