diff options
author | Daniel Lezcano <dlezcano@fr.ibm.com> | 2007-12-11 02:23:18 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 14:57:10 -0800 |
commit | 0a3e78ac2c555441f5bc00588070058533bc8d6b (patch) | |
tree | c5d406c1ea39ae256bc682e5d824682e0a6f6d56 | |
parent | 51602b2a5e849babd94311e555bf1ba58151b8d4 (diff) | |
download | kernel_samsung_aries-0a3e78ac2c555441f5bc00588070058533bc8d6b.zip kernel_samsung_aries-0a3e78ac2c555441f5bc00588070058533bc8d6b.tar.gz kernel_samsung_aries-0a3e78ac2c555441f5bc00588070058533bc8d6b.tar.bz2 |
[IPV6]: make flowlabel to return an error
This patch makes the flowlab subsystem to return an error code and makes
some cleanup with procfs ifdefs.
The af_inet6 will use the flowlabel init return code to check the initialization
was correct.
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/ipv6.h | 2 | ||||
-rw-r--r-- | net/ipv6/af_inet6.c | 5 | ||||
-rw-r--r-- | net/ipv6/ip6_flowlabel.c | 30 |
3 files changed, 28 insertions, 9 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 38df94b..4d91065 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -219,7 +219,7 @@ extern struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_spac struct ipv6_txoptions * fopt); extern void fl6_free_socklist(struct sock *sk); extern int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen); -extern void ip6_flowlabel_init(void); +extern int ip6_flowlabel_init(void); extern void ip6_flowlabel_cleanup(void); static inline void fl6_sock_release(struct ip6_flowlabel *fl) diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 90d2f72..614f3d9 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -851,7 +851,9 @@ static int __init inet6_init(void) err = ip6_route_init(); if (err) goto ip6_route_fail; - ip6_flowlabel_init(); + err = ip6_flowlabel_init(); + if (err) + goto ip6_flowlabel_fail; err = addrconf_init(); if (err) goto addrconf_fail; @@ -874,6 +876,7 @@ out: addrconf_fail: ip6_flowlabel_cleanup(); +ip6_flowlabel_fail: ip6_route_cleanup(); ip6_route_fail: #ifdef CONFIG_PROC_FS diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index b12cc22..d0babea 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c @@ -692,20 +692,36 @@ static const struct file_operations ip6fl_seq_fops = { .llseek = seq_lseek, .release = seq_release_private, }; -#endif +static int ip6_flowlabel_proc_init(struct net *net) +{ + if (!proc_net_fops_create(net, "ip6_flowlabel", S_IRUGO, &ip6fl_seq_fops)) + return -ENOMEM; + return 0; +} -void ip6_flowlabel_init(void) +static void ip6_flowlabel_proc_fini(struct net *net) { -#ifdef CONFIG_PROC_FS - proc_net_fops_create(&init_net, "ip6_flowlabel", S_IRUGO, &ip6fl_seq_fops); + proc_net_remove(net, "ip6_flowlabel"); +} +#else +static inline int ip6_flowlabel_proc_init(struct net *net) +{ + return 0; +} +static inline void ip6_flowlabel_proc_fini(struct net *net) +{ + return ; +} #endif + +int ip6_flowlabel_init(void) +{ + return ip6_flowlabel_proc_init(&init_net); } void ip6_flowlabel_cleanup(void) { del_timer(&ip6_fl_gc_timer); -#ifdef CONFIG_PROC_FS - proc_net_remove(&init_net, "ip6_flowlabel"); -#endif + ip6_flowlabel_proc_fini(&init_net); } |