1 /* 2 * net/9p/9p.c 3 * 4 * 9P entry point 5 * 6 * Copyright (C) 2007 by Latchesar Ionkov <lucho@ionkov.net> 7 * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com> 8 * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License version 2 12 * as published by the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to: 21 * Free Software Foundation 22 * 51 Franklin Street, Fifth Floor 23 * Boston, MA 02111-1301 USA 24 * 25 */ 26 27 #include <linux/module.h> 28 #include <linux/moduleparam.h> 29 #include <net/9p/9p.h> 30 #include <linux/fs.h> 31 #include <linux/parser.h> 32 #include <net/9p/transport.h> 33 #include <linux/list.h> 34 35 #ifdef CONFIG_NET_9P_DEBUG 36 unsigned int p9_debug_level = 0; /* feature-rific global debug level */ 37 EXPORT_SYMBOL(p9_debug_level); 38 module_param_named(debug, p9_debug_level, uint, 0); 39 MODULE_PARM_DESC(debug, "9P debugging level"); 40 #endif 41 42 extern int p9_mux_global_init(void); 43 extern void p9_mux_global_exit(void); 44 45 /* 46 * Dynamic Transport Registration Routines 47 * 48 */ 49 50 static LIST_HEAD(v9fs_trans_list); 51 static struct p9_trans_module *v9fs_default_transport; 52 53 /** 54 * v9fs_register_trans - register a new transport with 9p 55 * @m - structure describing the transport module and entry points 56 * 57 */ 58 void v9fs_register_trans(struct p9_trans_module *m) 59 { 60 list_add_tail(&m->list, &v9fs_trans_list); 61 if (m->def) 62 v9fs_default_transport = m; 63 } 64 EXPORT_SYMBOL(v9fs_register_trans); 65 66 /** 67 * v9fs_match_trans - match transport versus registered transports 68 * @arg: string identifying transport 69 * 70 */ 71 struct p9_trans_module *v9fs_match_trans(const substring_t *name) 72 { 73 struct list_head *p; 74 struct p9_trans_module *t = NULL; 75 76 list_for_each(p, &v9fs_trans_list) { 77 t = list_entry(p, struct p9_trans_module, list); 78 if (strncmp(t->name, name->from, name->to-name->from) == 0) 79 return t; 80 } 81 return NULL; 82 } 83 EXPORT_SYMBOL(v9fs_match_trans); 84 85 /** 86 * v9fs_default_trans - returns pointer to default transport 87 * 88 */ 89 90 struct p9_trans_module *v9fs_default_trans(void) 91 { 92 if (v9fs_default_transport) 93 return v9fs_default_transport; 94 else if (!list_empty(&v9fs_trans_list)) 95 return list_first_entry(&v9fs_trans_list, 96 struct p9_trans_module, list); 97 else 98 return NULL; 99 } 100 EXPORT_SYMBOL(v9fs_default_trans); 101 102 103 /** 104 * v9fs_init - Initialize module 105 * 106 */ 107 static int __init init_p9(void) 108 { 109 int ret = 0; 110 111 p9_error_init(); 112 printk(KERN_INFO "Installing 9P2000 support\n"); 113 114 return ret; 115 } 116 117 /** 118 * v9fs_init - shutdown module 119 * 120 */ 121 122 static void __exit exit_p9(void) 123 { 124 printk(KERN_INFO "Unloading 9P2000 support\n"); 125 } 126 127 module_init(init_p9) 128 module_exit(exit_p9) 129 130 MODULE_AUTHOR("Latchesar Ionkov <lucho@ionkov.net>"); 131 MODULE_AUTHOR("Eric Van Hensbergen <ericvh@gmail.com>"); 132 MODULE_AUTHOR("Ron Minnich <rminnich@lanl.gov>"); 133 MODULE_LICENSE("GPL"); 134