[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>
This commit is contained in:
committed by
David S. Miller
parent
51602b2a5e
commit
0a3e78ac2c
@@ -219,7 +219,7 @@ extern struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_spac
|
|||||||
struct ipv6_txoptions * fopt);
|
struct ipv6_txoptions * fopt);
|
||||||
extern void fl6_free_socklist(struct sock *sk);
|
extern void fl6_free_socklist(struct sock *sk);
|
||||||
extern int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen);
|
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);
|
extern void ip6_flowlabel_cleanup(void);
|
||||||
|
|
||||||
static inline void fl6_sock_release(struct ip6_flowlabel *fl)
|
static inline void fl6_sock_release(struct ip6_flowlabel *fl)
|
||||||
|
@@ -851,7 +851,9 @@ static int __init inet6_init(void)
|
|||||||
err = ip6_route_init();
|
err = ip6_route_init();
|
||||||
if (err)
|
if (err)
|
||||||
goto ip6_route_fail;
|
goto ip6_route_fail;
|
||||||
ip6_flowlabel_init();
|
err = ip6_flowlabel_init();
|
||||||
|
if (err)
|
||||||
|
goto ip6_flowlabel_fail;
|
||||||
err = addrconf_init();
|
err = addrconf_init();
|
||||||
if (err)
|
if (err)
|
||||||
goto addrconf_fail;
|
goto addrconf_fail;
|
||||||
@@ -874,6 +876,7 @@ out:
|
|||||||
|
|
||||||
addrconf_fail:
|
addrconf_fail:
|
||||||
ip6_flowlabel_cleanup();
|
ip6_flowlabel_cleanup();
|
||||||
|
ip6_flowlabel_fail:
|
||||||
ip6_route_cleanup();
|
ip6_route_cleanup();
|
||||||
ip6_route_fail:
|
ip6_route_fail:
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
|
@@ -692,20 +692,36 @@ static const struct file_operations ip6fl_seq_fops = {
|
|||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = seq_release_private,
|
.release = seq_release_private,
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
|
static int ip6_flowlabel_proc_init(struct net *net)
|
||||||
void ip6_flowlabel_init(void)
|
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_PROC_FS
|
if (!proc_net_fops_create(net, "ip6_flowlabel", S_IRUGO, &ip6fl_seq_fops))
|
||||||
proc_net_fops_create(&init_net, "ip6_flowlabel", S_IRUGO, &ip6fl_seq_fops);
|
return -ENOMEM;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ip6_flowlabel_proc_fini(struct net *net)
|
||||||
|
{
|
||||||
|
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
|
#endif
|
||||||
|
|
||||||
|
int ip6_flowlabel_init(void)
|
||||||
|
{
|
||||||
|
return ip6_flowlabel_proc_init(&init_net);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ip6_flowlabel_cleanup(void)
|
void ip6_flowlabel_cleanup(void)
|
||||||
{
|
{
|
||||||
del_timer(&ip6_fl_gc_timer);
|
del_timer(&ip6_fl_gc_timer);
|
||||||
#ifdef CONFIG_PROC_FS
|
ip6_flowlabel_proc_fini(&init_net);
|
||||||
proc_net_remove(&init_net, "ip6_flowlabel");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user