Blame view

net/rxrpc/net_ns.c 2.35 KB
2baec2c3f   David Howells   rxrpc: Support ne...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  /* rxrpc network namespace handling.
   *
   * Copyright (C) 2017 Red Hat, Inc. All Rights Reserved.
   * Written by David Howells (dhowells@redhat.com)
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public Licence
   * as published by the Free Software Foundation; either version
   * 2 of the Licence, or (at your option) any later version.
   */
  
  #include <linux/proc_fs.h>
  #include "ar-internal.h"
  
  unsigned int rxrpc_net_id;
  
  /*
   * Initialise a per-network namespace record.
   */
  static __net_init int rxrpc_init_net(struct net *net)
  {
  	struct rxrpc_net *rxnet = rxrpc_net(net);
  	int ret;
1392633ba   David Howells   rxrpc: Fix servic...
24
  	rxnet->live = true;
2baec2c3f   David Howells   rxrpc: Support ne...
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  	get_random_bytes(&rxnet->epoch, sizeof(rxnet->epoch));
  	rxnet->epoch |= RXRPC_RANDOM_EPOCH;
  
  	INIT_LIST_HEAD(&rxnet->calls);
  	rwlock_init(&rxnet->call_lock);
  
  	INIT_LIST_HEAD(&rxnet->conn_proc_list);
  	INIT_LIST_HEAD(&rxnet->service_conns);
  	rwlock_init(&rxnet->conn_lock);
  	INIT_DELAYED_WORK(&rxnet->service_conn_reaper,
  			  rxrpc_service_connection_reaper);
  
  	rxnet->nr_client_conns = 0;
  	rxnet->nr_active_client_conns = 0;
  	rxnet->kill_all_client_conns = false;
  	spin_lock_init(&rxnet->client_conn_cache_lock);
  	spin_lock_init(&rxnet->client_conn_discard_lock);
  	INIT_LIST_HEAD(&rxnet->waiting_client_conns);
  	INIT_LIST_HEAD(&rxnet->active_client_conns);
  	INIT_LIST_HEAD(&rxnet->idle_client_conns);
  	INIT_DELAYED_WORK(&rxnet->client_conn_reaper,
  			  rxrpc_discard_expired_client_conns);
  
  	INIT_LIST_HEAD(&rxnet->local_endpoints);
  	mutex_init(&rxnet->local_mutex);
  	hash_init(rxnet->peer_hash);
  	spin_lock_init(&rxnet->peer_hash_lock);
  
  	ret = -ENOMEM;
  	rxnet->proc_net = proc_net_mkdir(net, "rxrpc", net->proc_net);
  	if (!rxnet->proc_net)
  		goto err_proc;
  
  	proc_create("calls", 0444, rxnet->proc_net, &rxrpc_call_seq_fops);
  	proc_create("conns", 0444, rxnet->proc_net, &rxrpc_connection_seq_fops);
  	return 0;
2baec2c3f   David Howells   rxrpc: Support ne...
61
  err_proc:
1392633ba   David Howells   rxrpc: Fix servic...
62
  	rxnet->live = false;
2baec2c3f   David Howells   rxrpc: Support ne...
63
64
65
66
67
68
69
70
71
  	return ret;
  }
  
  /*
   * Clean up a per-network namespace record.
   */
  static __net_exit void rxrpc_exit_net(struct net *net)
  {
  	struct rxrpc_net *rxnet = rxrpc_net(net);
1392633ba   David Howells   rxrpc: Fix servic...
72
  	rxnet->live = false;
2baec2c3f   David Howells   rxrpc: Support ne...
73
74
75
76
77
78
79
80
81
82
83
84
  	rxrpc_destroy_all_calls(rxnet);
  	rxrpc_destroy_all_connections(rxnet);
  	rxrpc_destroy_all_locals(rxnet);
  	proc_remove(rxnet->proc_net);
  }
  
  struct pernet_operations rxrpc_net_ops = {
  	.init	= rxrpc_init_net,
  	.exit	= rxrpc_exit_net,
  	.id	= &rxrpc_net_id,
  	.size	= sizeof(struct rxrpc_net),
  };