Blame view

net/9p/mod.c 4.27 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
  /*
   *  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
   *
   */
5d3851530   Joe Perches   9p: Reduce object...
26
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
27
  #include <linux/module.h>
5d3851530   Joe Perches   9p: Reduce object...
28
29
  #include <linux/errno.h>
  #include <linux/sched.h>
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
30
31
  #include <linux/moduleparam.h>
  #include <net/9p/9p.h>
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
32
33
  #include <linux/fs.h>
  #include <linux/parser.h>
8b81ef589   Eric Van Hensbergen   9p: consolidate t...
34
  #include <net/9p/client.h>
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
35
36
  #include <net/9p/transport.h>
  #include <linux/list.h>
72029fe85   Tejun Heo   9p: implement pro...
37
  #include <linux/spinlock.h>
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
38
39
40
41
42
43
  
  #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");
5d3851530   Joe Perches   9p: Reduce object...
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  
  void _p9_debug(enum p9_debug_flags level, const char *func,
  		const char *fmt, ...)
  {
  	struct va_format vaf;
  	va_list args;
  
  	if ((p9_debug_level & level) != level)
  		return;
  
  	va_start(args, fmt);
  
  	vaf.fmt = fmt;
  	vaf.va = &args;
  
  	if (level == P9_DEBUG_9P)
  		pr_notice("(%8.8d) %pV", task_pid_nr(current), &vaf);
  	else
  		pr_notice("-- %s (%d): %pV", func, task_pid_nr(current), &vaf);
  
  	va_end(args);
  }
  EXPORT_SYMBOL(_p9_debug);
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
67
  #endif
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
68
69
70
71
  /*
   * Dynamic Transport Registration Routines
   *
   */
72029fe85   Tejun Heo   9p: implement pro...
72
  static DEFINE_SPINLOCK(v9fs_trans_lock);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
73
  static LIST_HEAD(v9fs_trans_list);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
74
75
76
  
  /**
   * v9fs_register_trans - register a new transport with 9p
ee443996a   Eric Van Hensbergen   9p: Documentation...
77
   * @m: structure describing the transport module and entry points
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
78
79
80
81
   *
   */
  void v9fs_register_trans(struct p9_trans_module *m)
  {
72029fe85   Tejun Heo   9p: implement pro...
82
  	spin_lock(&v9fs_trans_lock);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
83
  	list_add_tail(&m->list, &v9fs_trans_list);
72029fe85   Tejun Heo   9p: implement pro...
84
  	spin_unlock(&v9fs_trans_lock);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
85
86
87
88
  }
  EXPORT_SYMBOL(v9fs_register_trans);
  
  /**
72029fe85   Tejun Heo   9p: implement pro...
89
90
91
92
93
94
95
96
97
98
99
100
101
102
   * 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...
103
   * @name: string identifying transport
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
104
105
   *
   */
4d63055fa   Prem Karat   fs/9p: Clean-up g...
106
  struct p9_trans_module *v9fs_get_trans_by_name(char *s)
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
107
  {
72029fe85   Tejun Heo   9p: implement pro...
108
109
110
111
112
  	struct p9_trans_module *t, *found = NULL;
  
  	spin_lock(&v9fs_trans_lock);
  
  	list_for_each_entry(t, &v9fs_trans_list, list)
4d63055fa   Prem Karat   fs/9p: Clean-up g...
113
  		if (strcmp(t->name, s) == 0 &&
72029fe85   Tejun Heo   9p: implement pro...
114
115
116
117
118
119
120
  		    try_module_get(t->owner)) {
  			found = t;
  			break;
  		}
  
  	spin_unlock(&v9fs_trans_lock);
  	return found;
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
121
  }
72029fe85   Tejun Heo   9p: implement pro...
122
  EXPORT_SYMBOL(v9fs_get_trans_by_name);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
123
124
  
  /**
72029fe85   Tejun Heo   9p: implement pro...
125
   * v9fs_get_default_trans - get the default transport
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
126
127
   *
   */
72029fe85   Tejun Heo   9p: implement pro...
128
  struct p9_trans_module *v9fs_get_default_trans(void)
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
129
  {
72029fe85   Tejun Heo   9p: implement pro...
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
  	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...
149
  }
72029fe85   Tejun Heo   9p: implement pro...
150
  EXPORT_SYMBOL(v9fs_get_default_trans);
fb0466c3a   Eric Van Hensbergen   9p: fix bad kconf...
151

72029fe85   Tejun Heo   9p: implement pro...
152
153
154
155
156
157
158
159
160
161
  /**
   * 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...
162

bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
163
  /**
961a5a502   Rob Landley   net/9p: Change li...
164
   * init_p9 - Initialize module
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
165
166
167
168
   *
   */
  static int __init init_p9(void)
  {
8a0dc95fd   Eric Van Hensbergen   9p: transport API...
169
  	int ret = 0;
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
170
171
  
  	p9_error_init();
5d3851530   Joe Perches   9p: Reduce object...
172
173
  	pr_info("Installing 9P2000 support
  ");
887b3ece6   Eric Van Hensbergen   9p: fix error pat...
174
  	p9_trans_fd_init();
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
175

bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
176
177
178
179
  	return ret;
  }
  
  /**
961a5a502   Rob Landley   net/9p: Change li...
180
   * exit_p9 - shutdown module
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
181
182
183
184
185
   *
   */
  
  static void __exit exit_p9(void)
  {
5d3851530   Joe Perches   9p: Reduce object...
186
187
  	pr_info("Unloading 9P2000 support
  ");
72029fe85   Tejun Heo   9p: implement pro...
188
189
  
  	p9_trans_fd_exit();
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
190
191
192
193
194
195
196
197
198
  }
  
  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");