diff options
Diffstat (limited to 'net/ipv4/devinet.c')
| -rw-r--r-- | net/ipv4/devinet.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 040c4f05b65..26dec2be961 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -1317,14 +1317,19 @@ static int devinet_sysctl_forward(ctl_table *ctl, int write,  {  	int *valp = ctl->data;  	int val = *valp; +	loff_t pos = *ppos;  	int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);  	if (write && *valp != val) {  		struct net *net = ctl->extra2;  		if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) { -			if (!rtnl_trylock()) +			if (!rtnl_trylock()) { +				/* Restore the original values before restarting */ +				*valp = val; +				*ppos = pos;  				return restart_syscall(); +			}  			if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) {  				inet_forward_change(net);  			} else if (*valp) {  |