Blame view

net/9p/mod.c 3.82 KB
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  /*
   *  net/9p/9p.c
   *
   *  9P entry point
   *
   *  Copyright (C) 2007 by Latchesar Ionkov <lucho@ionkov.net>
   *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
   *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
   *
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License version 2
   *  as published by the Free Software Foundation.
   *
   *  This program is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
   *
   *  You should have received a copy of the GNU General Public License
   *  along with this program; if not, write to:
   *  Free Software Foundation
   *  51 Franklin Street, Fifth Floor
   *  Boston, MA  02111-1301  USA
   *
   */
  
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <net/9p/9p.h>
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
30
31
  #include <linux/fs.h>
  #include <linux/parser.h>
8b81ef589   Eric Van Hensbergen   9p: consolidate t...
32
  #include <net/9p/client.h>
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
33
34
  #include <net/9p/transport.h>
  #include <linux/list.h>
72029fe85   Tejun Heo   9p: implement pro...
35
  #include <linux/spinlock.h>
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
36
37
38
39
40
41
42
  
  #ifdef CONFIG_NET_9P_DEBUG
  unsigned int p9_debug_level = 0;	/* feature-rific global debug level  */
  EXPORT_SYMBOL(p9_debug_level);
  module_param_named(debug, p9_debug_level, uint, 0);
  MODULE_PARM_DESC(debug, "9P debugging level");
  #endif
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
43
44
45
46
  /*
   * Dynamic Transport Registration Routines
   *
   */
72029fe85   Tejun Heo   9p: implement pro...
47
  static DEFINE_SPINLOCK(v9fs_trans_lock);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
48
  static LIST_HEAD(v9fs_trans_list);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
49
50
51
  
  /**
   * v9fs_register_trans - register a new transport with 9p
ee443996a   Eric Van Hensbergen   9p: Documentation...
52
   * @m: structure describing the transport module and entry points
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
53
54
55
56
   *
   */
  void v9fs_register_trans(struct p9_trans_module *m)
  {
72029fe85   Tejun Heo   9p: implement pro...
57
  	spin_lock(&v9fs_trans_lock);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
58
  	list_add_tail(&m->list, &v9fs_trans_list);
72029fe85   Tejun Heo   9p: implement pro...
59
  	spin_unlock(&v9fs_trans_lock);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
60
61
62
63
  }
  EXPORT_SYMBOL(v9fs_register_trans);
  
  /**
72029fe85   Tejun Heo   9p: implement pro...
64
65
66
67
68
69
70
71
72
73
74
75
76
77
   * v9fs_unregister_trans - unregister a 9p transport
   * @m: the transport to remove
   *
   */
  void v9fs_unregister_trans(struct p9_trans_module *m)
  {
  	spin_lock(&v9fs_trans_lock);
  	list_del_init(&m->list);
  	spin_unlock(&v9fs_trans_lock);
  }
  EXPORT_SYMBOL(v9fs_unregister_trans);
  
  /**
   * v9fs_get_trans_by_name - get transport with the matching name
ee443996a   Eric Van Hensbergen   9p: Documentation...
78
   * @name: string identifying transport
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
79
80
   *
   */
72029fe85   Tejun Heo   9p: implement pro...
81
  struct p9_trans_module *v9fs_get_trans_by_name(const substring_t *name)
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
82
  {
72029fe85   Tejun Heo   9p: implement pro...
83
84
85
86
87
88
89
90
91
92
93
94
95
  	struct p9_trans_module *t, *found = NULL;
  
  	spin_lock(&v9fs_trans_lock);
  
  	list_for_each_entry(t, &v9fs_trans_list, list)
  		if (strncmp(t->name, name->from, name->to-name->from) == 0 &&
  		    try_module_get(t->owner)) {
  			found = t;
  			break;
  		}
  
  	spin_unlock(&v9fs_trans_lock);
  	return found;
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
96
  }
72029fe85   Tejun Heo   9p: implement pro...
97
  EXPORT_SYMBOL(v9fs_get_trans_by_name);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
98
99
  
  /**
72029fe85   Tejun Heo   9p: implement pro...
100
   * v9fs_get_default_trans - get the default transport
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
101
102
   *
   */
72029fe85   Tejun Heo   9p: implement pro...
103
  struct p9_trans_module *v9fs_get_default_trans(void)
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
104
  {
72029fe85   Tejun Heo   9p: implement pro...
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  	struct p9_trans_module *t, *found = NULL;
  
  	spin_lock(&v9fs_trans_lock);
  
  	list_for_each_entry(t, &v9fs_trans_list, list)
  		if (t->def && try_module_get(t->owner)) {
  			found = t;
  			break;
  		}
  
  	if (!found)
  		list_for_each_entry(t, &v9fs_trans_list, list)
  			if (try_module_get(t->owner)) {
  				found = t;
  				break;
  			}
  
  	spin_unlock(&v9fs_trans_lock);
  	return found;
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
124
  }
72029fe85   Tejun Heo   9p: implement pro...
125
  EXPORT_SYMBOL(v9fs_get_default_trans);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
126

72029fe85   Tejun Heo   9p: implement pro...
127
128
129
130
131
132
133
134
135
136
  /**
   * v9fs_put_trans - put trans
   * @m: transport to put
   *
   */
  void v9fs_put_trans(struct p9_trans_module *m)
  {
  	if (m)
  		module_put(m->owner);
  }
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
137

bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
138
  /**
961a5a502   Rob Landley   net/9p: Change li...
139
   * init_p9 - Initialize module
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
140
141
142
143
   *
   */
  static int __init init_p9(void)
  {
8a0dc95fd   Eric Van Hensbergen   9p: transport API...
144
  	int ret = 0;
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
145
146
147
148
  
  	p9_error_init();
  	printk(KERN_INFO "Installing 9P2000 support
  ");
887b3ece6   Eric Van Hensbergen   9p: fix error pat...
149
  	p9_trans_fd_init();
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
150

bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
151
152
153
154
  	return ret;
  }
  
  /**
961a5a502   Rob Landley   net/9p: Change li...
155
   * exit_p9 - shutdown module
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
156
157
158
159
160
   *
   */
  
  static void __exit exit_p9(void)
  {
8a0dc95fd   Eric Van Hensbergen   9p: transport API...
161
162
  	printk(KERN_INFO "Unloading 9P2000 support
  ");
72029fe85   Tejun Heo   9p: implement pro...
163
164
  
  	p9_trans_fd_exit();
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
165
166
167
168
169
170
171
172
173
  }
  
  module_init(init_p9)
  module_exit(exit_p9)
  
  MODULE_AUTHOR("Latchesar Ionkov <lucho@ionkov.net>");
  MODULE_AUTHOR("Eric Van Hensbergen <ericvh@gmail.com>");
  MODULE_AUTHOR("Ron Minnich <rminnich@lanl.gov>");
  MODULE_LICENSE("GPL");