diff options
| author | Chris Zankel <[email protected]> | 2015-04-14 03:51:35 +0000 | 
|---|---|---|
| committer | Chris Zankel <[email protected]> | 2015-04-14 03:51:35 +0000 | 
| commit | 7ead5b7e4a3cf4a16579a8f164022345b93fe972 (patch) | |
| tree | 0a9b9497f53d1593c9e2ac197b2e686ea74a9975 /net/tipc/core.c | |
| parent | 834a316eeebcb75316c0a7d9088fa638c52dc584 (diff) | |
| parent | 39a8804455fb23f09157341d3ba7db6d7ae6ee76 (diff) | |
Merge tag 'v4.0' into for_next
Linux 4.0
Diffstat (limited to 'net/tipc/core.c')
| -rw-r--r-- | net/tipc/core.c | 154 | 
1 files changed, 71 insertions, 83 deletions
| diff --git a/net/tipc/core.c b/net/tipc/core.c index a5737b8407dd..be1c9fa60b09 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c @@ -34,82 +34,88 @@   * POSSIBILITY OF SUCH DAMAGE.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include "core.h"  #include "name_table.h"  #include "subscr.h" -#include "config.h" +#include "bearer.h" +#include "net.h"  #include "socket.h"  #include <linux/module.h> -/* global variables used by multiple sub-systems within TIPC */ -int tipc_random __read_mostly; -  /* configurable TIPC parameters */ -u32 tipc_own_addr __read_mostly; -int tipc_max_ports __read_mostly;  int tipc_net_id __read_mostly;  int sysctl_tipc_rmem[3] __read_mostly;	/* min/default/max */ -/** - * tipc_buf_acquire - creates a TIPC message buffer - * @size: message size (including TIPC header) - * - * Returns a new buffer with data pointers set to the specified size. - * - * NOTE: Headroom is reserved to allow prepending of a data link header. - *       There may also be unrequested tailroom present at the buffer's end. - */ -struct sk_buff *tipc_buf_acquire(u32 size) +static int __net_init tipc_init_net(struct net *net)  { -	struct sk_buff *skb; -	unsigned int buf_size = (BUF_HEADROOM + size + 3) & ~3u; - -	skb = alloc_skb_fclone(buf_size, GFP_ATOMIC); -	if (skb) { -		skb_reserve(skb, BUF_HEADROOM); -		skb_put(skb, size); -		skb->next = NULL; -	} -	return skb; +	struct tipc_net *tn = net_generic(net, tipc_net_id); +	int err; + +	tn->net_id = 4711; +	tn->own_addr = 0; +	get_random_bytes(&tn->random, sizeof(int)); +	INIT_LIST_HEAD(&tn->node_list); +	spin_lock_init(&tn->node_list_lock); + +	err = tipc_sk_rht_init(net); +	if (err) +		goto out_sk_rht; + +	err = tipc_nametbl_init(net); +	if (err) +		goto out_nametbl; + +	err = tipc_subscr_start(net); +	if (err) +		goto out_subscr; +	return 0; + +out_subscr: +	tipc_nametbl_stop(net); +out_nametbl: +	tipc_sk_rht_destroy(net); +out_sk_rht: +	return err;  } -/** - * tipc_core_stop - switch TIPC from SINGLE NODE to NOT RUNNING mode - */ -static void tipc_core_stop(void) +static void __net_exit tipc_exit_net(struct net *net)  { -	tipc_net_stop(); -	tipc_bearer_cleanup(); -	tipc_netlink_stop(); -	tipc_subscr_stop(); -	tipc_nametbl_stop(); -	tipc_sk_ref_table_stop(); -	tipc_socket_stop(); -	tipc_unregister_sysctl(); +	tipc_subscr_stop(net); +	tipc_net_stop(net); +	tipc_nametbl_stop(net); +	tipc_sk_rht_destroy(net);  } -/** - * tipc_core_start - switch TIPC from NOT RUNNING to SINGLE NODE mode - */ -static int tipc_core_start(void) +static struct pernet_operations tipc_net_ops = { +	.init = tipc_init_net, +	.exit = tipc_exit_net, +	.id   = &tipc_net_id, +	.size = sizeof(struct tipc_net), +}; + +static int __init tipc_init(void)  {  	int err; -	get_random_bytes(&tipc_random, sizeof(tipc_random)); - -	err = tipc_sk_ref_table_init(tipc_max_ports, tipc_random); -	if (err) -		goto out_reftbl; +	pr_info("Activated (version " TIPC_MOD_VER ")\n"); -	err = tipc_nametbl_init(); -	if (err) -		goto out_nametbl; +	sysctl_tipc_rmem[0] = TIPC_CONN_OVERLOAD_LIMIT >> 4 << +			      TIPC_LOW_IMPORTANCE; +	sysctl_tipc_rmem[1] = TIPC_CONN_OVERLOAD_LIMIT >> 4 << +			      TIPC_CRITICAL_IMPORTANCE; +	sysctl_tipc_rmem[2] = TIPC_CONN_OVERLOAD_LIMIT;  	err = tipc_netlink_start();  	if (err)  		goto out_netlink; +	err = tipc_netlink_compat_start(); +	if (err) +		goto out_netlink_compat; +  	err = tipc_socket_init();  	if (err)  		goto out_socket; @@ -118,58 +124,40 @@ static int tipc_core_start(void)  	if (err)  		goto out_sysctl; -	err = tipc_subscr_start(); +	err = register_pernet_subsys(&tipc_net_ops);  	if (err) -		goto out_subscr; +		goto out_pernet;  	err = tipc_bearer_setup();  	if (err)  		goto out_bearer; +	pr_info("Started in single node mode\n");  	return 0;  out_bearer: -	tipc_subscr_stop(); -out_subscr: +	unregister_pernet_subsys(&tipc_net_ops); +out_pernet:  	tipc_unregister_sysctl();  out_sysctl:  	tipc_socket_stop();  out_socket: +	tipc_netlink_compat_stop(); +out_netlink_compat:  	tipc_netlink_stop();  out_netlink: -	tipc_nametbl_stop(); -out_nametbl: -	tipc_sk_ref_table_stop(); -out_reftbl: +	pr_err("Unable to start in single node mode\n");  	return err;  } -static int __init tipc_init(void) -{ -	int res; - -	pr_info("Activated (version " TIPC_MOD_VER ")\n"); - -	tipc_own_addr = 0; -	tipc_max_ports = CONFIG_TIPC_PORTS; -	tipc_net_id = 4711; - -	sysctl_tipc_rmem[0] = TIPC_CONN_OVERLOAD_LIMIT >> 4 << -			      TIPC_LOW_IMPORTANCE; -	sysctl_tipc_rmem[1] = TIPC_CONN_OVERLOAD_LIMIT >> 4 << -			      TIPC_CRITICAL_IMPORTANCE; -	sysctl_tipc_rmem[2] = TIPC_CONN_OVERLOAD_LIMIT; - -	res = tipc_core_start(); -	if (res) -		pr_err("Unable to start in single node mode\n"); -	else -		pr_info("Started in single node mode\n"); -	return res; -} -  static void __exit tipc_exit(void)  { -	tipc_core_stop(); +	tipc_bearer_cleanup(); +	unregister_pernet_subsys(&tipc_net_ops); +	tipc_netlink_stop(); +	tipc_netlink_compat_stop(); +	tipc_socket_stop(); +	tipc_unregister_sysctl(); +  	pr_info("Deactivated\n");  } |