Blame view
net/9p/mod.c
3.82 KB
bd238fb43
|
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
|
30 31 |
#include <linux/fs.h> #include <linux/parser.h> |
8b81ef589
|
32 |
#include <net/9p/client.h> |
fb0466c3a
|
33 34 |
#include <net/9p/transport.h> #include <linux/list.h> |
72029fe85
|
35 |
#include <linux/spinlock.h> |
bd238fb43
|
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
|
43 44 45 46 |
/* * Dynamic Transport Registration Routines * */ |
72029fe85
|
47 |
static DEFINE_SPINLOCK(v9fs_trans_lock); |
fb0466c3a
|
48 |
static LIST_HEAD(v9fs_trans_list); |
fb0466c3a
|
49 50 51 |
/** * v9fs_register_trans - register a new transport with 9p |
ee443996a
|
52 |
* @m: structure describing the transport module and entry points |
fb0466c3a
|
53 54 55 56 |
* */ void v9fs_register_trans(struct p9_trans_module *m) { |
72029fe85
|
57 |
spin_lock(&v9fs_trans_lock); |
fb0466c3a
|
58 |
list_add_tail(&m->list, &v9fs_trans_list); |
72029fe85
|
59 |
spin_unlock(&v9fs_trans_lock); |
fb0466c3a
|
60 61 62 63 |
} EXPORT_SYMBOL(v9fs_register_trans); /** |
72029fe85
|
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
|
78 |
* @name: string identifying transport |
fb0466c3a
|
79 80 |
* */ |
72029fe85
|
81 |
struct p9_trans_module *v9fs_get_trans_by_name(const substring_t *name) |
fb0466c3a
|
82 |
{ |
72029fe85
|
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
|
96 |
} |
72029fe85
|
97 |
EXPORT_SYMBOL(v9fs_get_trans_by_name); |
fb0466c3a
|
98 99 |
/** |
72029fe85
|
100 |
* v9fs_get_default_trans - get the default transport |
fb0466c3a
|
101 102 |
* */ |
72029fe85
|
103 |
struct p9_trans_module *v9fs_get_default_trans(void) |
fb0466c3a
|
104 |
{ |
72029fe85
|
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
|
124 |
} |
72029fe85
|
125 |
EXPORT_SYMBOL(v9fs_get_default_trans); |
fb0466c3a
|
126 |
|
72029fe85
|
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
|
137 |
|
bd238fb43
|
138 |
/** |
961a5a502
|
139 |
* init_p9 - Initialize module |
bd238fb43
|
140 141 142 143 |
* */ static int __init init_p9(void) { |
8a0dc95fd
|
144 |
int ret = 0; |
bd238fb43
|
145 146 147 148 |
p9_error_init(); printk(KERN_INFO "Installing 9P2000 support "); |
887b3ece6
|
149 |
p9_trans_fd_init(); |
bd238fb43
|
150 |
|
bd238fb43
|
151 152 153 154 |
return ret; } /** |
961a5a502
|
155 |
* exit_p9 - shutdown module |
bd238fb43
|
156 157 158 159 160 |
* */ static void __exit exit_p9(void) { |
8a0dc95fd
|
161 162 |
printk(KERN_INFO "Unloading 9P2000 support "); |
72029fe85
|
163 164 |
p9_trans_fd_exit(); |
bd238fb43
|
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"); |