[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <37533.192.168.101.12.1207865395.squirrel@intranet>
Date: Fri, 11 Apr 2008 00:09:55 +0200 (CEST)
From: "Daniel Hokka Zakrisson" <daniel@...ac.com>
To: "Pavel Emelyanov" <xemul@...nvz.org>
Cc: "Linux Netdev List" <netdev@...r.kernel.org>,
"Linux Containers" <containers@...ts.osdl.org>,
"Denis Lunev" <den@...nvz.org>,
"Benjamin Thery" <benjamin.thery@...l.net>
Subject: Re: [PATCH 6/14][RTNL]: Introduce the rtnl_kill_links call.
Pavel Emelyanov wrote:
> ... which will kill all the devices in the given net with
> the given rtnl_link_ops. Will be used in VLAN patches later.
>
> Signed-off-by: Pavel Emelyanov <xemul@...nvz.org>
>
> ---
> include/net/rtnetlink.h | 1 +
> net/core/rtnetlink.c | 29 +++++++++++++++++++++--------
> 2 files changed, 22 insertions(+), 8 deletions(-)
>
> diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h
> index 793863e..3c1895e 100644
> --- a/include/net/rtnetlink.h
> +++ b/include/net/rtnetlink.h
> @@ -74,6 +74,7 @@ struct rtnl_link_ops {
>
> extern int __rtnl_link_register(struct rtnl_link_ops *ops);
> extern void __rtnl_link_unregister(struct rtnl_link_ops *ops);
> +extern void rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops);
>
> extern int rtnl_link_register(struct rtnl_link_ops *ops);
> extern void rtnl_link_unregister(struct rtnl_link_ops *ops);
> diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
> index da99ac0..bc39e41 100644
> --- a/net/core/rtnetlink.c
> +++ b/net/core/rtnetlink.c
> @@ -269,6 +269,26 @@ int rtnl_link_register(struct rtnl_link_ops *ops)
>
> EXPORT_SYMBOL_GPL(rtnl_link_register);
>
> +static void __rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
> +{
> + struct net_device *dev;
> +restart:
> + for_each_netdev(net, dev) {
> + if (dev->rtnl_link_ops == ops) {
> + ops->dellink(dev);
> + goto restart;
> + }
> + }
> +}
> +
> +void rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
> +{
> + rtnl_lock();
> + __rtnl_kill_links(net, ops);
> + rtnl_unlock();
> +}
> +EXPORT_SYMBOL_GPL(rtnl_kill_links);
> +
> /**
> * __rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
> * @ops: struct rtnl_link_ops * to unregister
> @@ -277,17 +297,10 @@ EXPORT_SYMBOL_GPL(rtnl_link_register);
> */
> void __rtnl_link_unregister(struct rtnl_link_ops *ops)
> {
> - struct net_device *dev, *n;
> struct net *net;
>
> for_each_net(net) {
> -restart:
> - for_each_netdev_safe(net, dev, n) {
> - if (dev->rtnl_link_ops == ops) {
> - ops->dellink(dev);
> - goto restart;
> - }
> - }
> + __rtnl_kill_links(net, ops);
This was _safe, and now it's not. Is that intentional?
> }
> list_del(&ops->list);
> }
> --
> 1.5.3.4
--
Daniel Hokka Zakrisson
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists