From 780d37e9d68a88ce5c21695a4be5f1dda3903c6a Mon Sep 17 00:00:00 2001 From: Stefan Bader Date: Thu, 4 Oct 2012 13:57:11 +0200 Subject: [PATCH] net/ipv4: Always flush route cache on unregister batch call When doing (for example) a connect to an unused port on localhost in a new net namespace, it was observed that lo could not be removed immediately because there were still references on it. This was tracked down to an element in the route cache which was supposed to be dropped by a notify call with sending a NETDEVICE_UNREGISTER_BATCH message, but as in_dev is returned NULL the case statement never was executed. Move the handling of that message up to be done regardless of in_dev. Signed-off-by: Stefan Bader --- net/ipv4/fib_frontend.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 3854411..f2cabd9 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -998,6 +998,14 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo fib_disable_ip(dev, 2, -1); return NOTIFY_DONE; } + if (event == NETDEV_UNREGISTER_BATCH) { + /* The batch unregister is only called on the first + * device in the list of devices being unregistered. + * Therefore we should not pass dev_net(dev) in here. + */ + rt_cache_flush_batch(NULL); + return NOTIFY_DONE; + } if (!in_dev) return NOTIFY_DONE; @@ -1020,13 +1028,6 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo case NETDEV_CHANGE: rt_cache_flush(dev_net(dev), 0); break; - case NETDEV_UNREGISTER_BATCH: - /* The batch unregister is only called on the first - * device in the list of devices being unregistered. - * Therefore we should not pass dev_net(dev) in here. - */ - rt_cache_flush_batch(NULL); - break; } return NOTIFY_DONE; } -- 1.7.9.5