From: Pavel Emelyanov <xemul@openvz.org>
To: David Miller <davem@davemloft.net>
Cc: Linux Netdev List <netdev@vger.kernel.org>, devel@openvz.org
Subject: [PATCH net-2.6.25 10/11][INET] Eliminate difference in actions of sysctl and proc handler for conf.all.forwarding
Date: Tue, 04 Dec 2007 13:16:45 +0300 [thread overview]
Message-ID: <4755290D.2090709@openvz.org> (raw)
In-Reply-To: <4755256F.9000505@openvz.org>
AFAIS the net.ipv4.conf. <dev>, all and default sysctls should
work like this when changed (besides changing the value itself):
<dev> : optionally do smth else
all : walk devices
default : walk devices
The proc handler for net.ipv4.conf.all works like this:
<dev> : flush rt cache
all : walk devices and flush rt cache
default : nothing
while the sysctl handler works like this:
<dev> : nothing
all : nothing
default : walk devices but don't flush the cache
All this looks strange. Am I right that regardless of whatever
handler (proc or syscall) is called the behavior should be:
<dev> : flush rt cache
all : walk the devices and flush the cache
default : walk the devices and flush the cache
?
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
---
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 0b5f042..1934a06 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1282,6 +1282,17 @@ static void inet_forward_change(void)
rcu_read_unlock();
}
read_unlock(&dev_base_lock);
+}
+
+static void fixup_forward_change(struct ctl_table *table)
+{
+ struct ipv4_devconf *conf;
+
+ conf = table->extra1;
+ if (conf == &ipv4_devconf)
+ inet_forward_change();
+ else if (conf == &ipv4_devconf_dflt)
+ devinet_copy_dflt_conf(NET_IPV4_CONF_FORWARDING - 1);
rt_cache_flush(0);
}
@@ -1305,9 +1316,9 @@ static int devinet_conf_proc(ctl_table *ctl, int write,
return ret;
}
-static int devinet_conf_sysctl(ctl_table *table, int __user *name, int nlen,
+static int __devinet_conf_sysctl(ctl_table *table, int __user *name, int nlen,
void __user *oldval, size_t __user *oldlenp,
- void __user *newval, size_t newlen)
+ void __user *newval, size_t newlen, int *idx)
{
struct ipv4_devconf *cnf;
int *valp = table->data;
@@ -1346,16 +1357,27 @@ static int devinet_conf_sysctl(ctl_table *table, int __user *name, int nlen,
cnf = table->extra1;
i = (int *)table->data - cnf->data;
-
set_bit(i, cnf->state);
+ *idx = i;
+ return 1;
+}
+
+static int devinet_conf_sysctl(ctl_table *table, int __user *name, int nlen,
+ void __user *oldval, size_t __user *oldlenp,
+ void __user *newval, size_t newlen)
+{
+ int ret, i;
- if (cnf == &ipv4_devconf_dflt)
+ ret = __devinet_conf_sysctl(table, name, nlen, oldval, oldlenp,
+ newval, newlen, &i);
+
+ if (ret == 1 && table->extra1 == &ipv4_devconf_dflt)
devinet_copy_dflt_conf(i);
- return 1;
+ return ret;
}
-static int devinet_sysctl_forward(ctl_table *ctl, int write,
+static int devinet_forward_proc(ctl_table *ctl, int write,
struct file* filp, void __user *buffer,
size_t *lenp, loff_t *ppos)
{
@@ -1363,16 +1385,25 @@ static int devinet_sysctl_forward(ctl_table *ctl, int write,
int val = *valp;
int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
- if (write && *valp != val) {
- if (valp == &IPV4_DEVCONF_ALL(FORWARDING))
- inet_forward_change();
- else if (valp != &IPV4_DEVCONF_DFLT(FORWARDING))
- rt_cache_flush(0);
- }
+ if (write && *valp != val)
+ fixup_forward_change(ctl);
return ret;
}
+static int devinet_forward_sysctl(ctl_table *table, int __user *name, int nlen,
+ void __user *oldval, size_t __user *oldlenp,
+ void __user *newval, size_t newlen)
+{
+ int ret, i;
+
+ ret = __devinet_conf_sysctl(table, name, nlen, oldval, oldlenp,
+ newval, newlen, &i);
+ if (ret == 1)
+ fixup_forward_change(table);
+ return ret;
+}
+
int ipv4_doint_and_flush(ctl_table *ctl, int write,
struct file* filp, void __user *buffer,
size_t *lenp, loff_t *ppos)
@@ -1436,8 +1467,8 @@ static struct devinet_sysctl_table {
} devinet_sysctl = {
.devinet_vars = {
DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding",
- devinet_sysctl_forward,
- devinet_conf_sysctl),
+ devinet_forward_proc,
+ devinet_forward_sysctl),
DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"),
DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"),
@@ -1545,8 +1576,8 @@ static struct ctl_table ctl_forward_entry[] = {
NET_IPV4_CONF_FORWARDING - 1],
.maxlen = sizeof(int),
.mode = 0644,
- .proc_handler = devinet_sysctl_forward,
- .strategy = devinet_conf_sysctl,
+ .proc_handler = devinet_forward_proc,
+ .strategy = devinet_forward_sysctl,
.extra1 = &ipv4_devconf,
},
{ },
--
1.5.3.4
next prev parent reply other threads:[~2007-12-04 10:17 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-04 10:01 [PATCH net-2.6.25 0/11] Combined set of sysctl reworks, cleanups and fixes Pavel Emelyanov
2007-12-04 10:03 ` [PATCH net-2.6.25 1/11][CORE] Remove unneeded ifdefs from sysctl_net_core.c Pavel Emelyanov
2007-12-04 10:21 ` [PATCH net-2.6.25 (resend) " Pavel Emelyanov
2007-12-05 9:36 ` [PATCH net-2.6.25 " David Miller
2007-12-04 10:04 ` [PATCH net-2.6.25 2/11][CORE] Isolate the net/core/ sysctl table Pavel Emelyanov
2007-12-05 9:37 ` David Miller
2007-12-04 10:06 ` [PATCH net-2.6.25 3/11][IPv4] Cleanup the sysctl_net_ipv4.c file Pavel Emelyanov
2007-12-05 9:38 ` David Miller
2007-12-04 10:07 ` [PATCH net-2.6.25 4/11][IPV4] Use ctl paths to register net/ipv4/ table Pavel Emelyanov
2007-12-05 9:41 ` David Miller
2007-12-04 10:09 ` [PATCH net-2.6.25 5/11][TR] Use ctl paths to register net/token-ring/ table Pavel Emelyanov
2007-12-05 9:42 ` David Miller
2007-12-04 10:10 ` [PATCH net-2.6.25 6/11][CORE] Remove the empty net_table Pavel Emelyanov
2007-12-05 9:43 ` David Miller
2007-12-04 10:11 ` [PATCH net-2.6.25 7/11][IPV6] Make the ipv6/sysctl_net_ipv6.c compilation cleaner Pavel Emelyanov
2007-12-05 9:43 ` David Miller
2007-12-04 10:13 ` [PATCH net-2.6.25 8/11][IPV6] Use sysctl paths to register ipv6 sysctl tables Pavel Emelyanov
2007-12-05 9:44 ` David Miller
2007-12-04 10:15 ` [PATCH net-2.6.25 9/11][INET] Merge sys.net.ipv4.ip_forward and sys.net.ipv4.conf.all.forwarding Pavel Emelyanov
2007-12-05 9:45 ` David Miller
2007-12-04 10:16 ` Pavel Emelyanov [this message]
2007-12-05 9:48 ` [PATCH net-2.6.25 10/11][INET] Eliminate difference in actions of sysctl and proc handler for conf.all.forwarding David Miller
2007-12-05 9:58 ` Pavel Emelyanov
2007-12-05 10:06 ` David Miller
2007-12-06 0:13 ` Herbert Xu
2007-12-06 5:39 ` David Miller
2007-12-06 11:06 ` Herbert Xu
2007-12-06 11:14 ` David Miller
2007-12-06 12:31 ` Pavel Emelyanov
2007-12-06 17:42 ` Herbert Xu
2007-12-04 10:19 ` [PATCH net-2.6.25 11/11][IPV6] " Pavel Emelyanov
2007-12-05 9:51 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4755290D.2090709@openvz.org \
--to=xemul@openvz.org \
--cc=davem@davemloft.net \
--cc=devel@openvz.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.