aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/route.c
diff options
context:
space:
mode:
authorDenis V. Lunev <den@openvz.org>2008-07-05 19:02:06 -0700
committerDavid S. Miller <davem@davemloft.net>2008-07-05 19:02:06 -0700
commit639e104facec20f64f2eb940851ae45e5f255e6b (patch)
tree54e035641e7640b1b1d49fd2fc94d503540274c5 /net/ipv4/route.c
parentnet: add fib_rules_ops to flush_cache method (diff)
downloadlinux-dev-639e104facec20f64f2eb940851ae45e5f255e6b.tar.xz
linux-dev-639e104facec20f64f2eb940851ae45e5f255e6b.zip
ipv4: remove static flush_delay variable
flush delay is used as an external storage for net.ipv4.route.flush sysctl entry. It is write-only. The ctl_table->data for this entry is used once. Fix this case to point to the stack to remove global variable. Do this to avoid additional variable on struct net in the next patch. Possible race (as it was before) accessing this local variable is removed using flush_mutex. Signed-off-by: Denis V. Lunev <den@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to '')
-rw-r--r--net/ipv4/route.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index cedc366505bd..790de32cd7d4 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2829,14 +2829,20 @@ void ip_rt_multicast_event(struct in_device *in_dev)
}
#ifdef CONFIG_SYSCTL
-static int flush_delay;
-
static int ipv4_sysctl_rtcache_flush(ctl_table *ctl, int write,
struct file *filp, void __user *buffer,
size_t *lenp, loff_t *ppos)
{
if (write) {
+ int flush_delay;
+ static DEFINE_MUTEX(flush_mutex);
+
+ mutex_lock(&flush_mutex);
+ ctl->data = &flush_delay;
proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
+ ctl->data = NULL;
+ mutex_unlock(&flush_mutex);
+
rt_cache_flush(&init_net, flush_delay);
return 0;
}
@@ -2865,7 +2871,6 @@ ctl_table ipv4_route_table[] = {
{
.ctl_name = NET_IPV4_ROUTE_FLUSH,
.procname = "flush",
- .data = &flush_delay,
.maxlen = sizeof(int),
.mode = 0200,
.proc_handler = &ipv4_sysctl_rtcache_flush,