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 /* 43 * Dynamic Transport Registration Routines 44 * 45 */ 46 47 static LIST_HEAD(v9fs_trans_list); 48 static struct p9_trans_module *v9fs_default_transport; 49 50 /** 51 * v9fs_register_trans - register a new transport with 9p 52 * @m: structure describing the transport module and entry points 53 * 54 */ 55 void v9fs_register_trans(struct p9_trans_module *m) 56 { 57 list_add_tail(&m->list, &v9fs_trans_list); 58 if (m->def) 59 v9fs_default_transport = m; 60 } 61 EXPORT_SYMBOL(v9fs_register_trans); 62 63 /** 64 * v9fs_match_trans - match transport versus registered transports 65 * @name: string identifying transport 66 * 67 */ 68 struct p9_trans_module *v9fs_match_trans(const substring_t *name) 69 { 70 struct list_head *p; 71 struct p9_trans_module *t = NULL; 72 73 list_for_each(p, &v9fs_trans_list) { 74 t = list_entry(p, struct p9_trans_module, list); 75 if (strncmp(t->name, name->from, name->to-name->from) == 0) 76 return t; 77 } 78 return NULL; 79 } 80 EXPORT_SYMBOL(v9fs_match_trans); 81 82 /** 83 * v9fs_default_trans - returns pointer to default transport 84 * 85 */ 86 87 struct p9_trans_module *v9fs_default_trans(void) 88 { 89 if (v9fs_default_transport) 90 return v9fs_default_transport; 91 else if (!list_empty(&v9fs_trans_list)) 92 return list_first_entry(&v9fs_trans_list, 93 struct p9_trans_module, list); 94 else 95 return NULL; 96 } 97 EXPORT_SYMBOL(v9fs_default_trans); 98 99 100 /** 101 * v9fs_init - Initialize module 102 * 103 */ 104 static int __init init_p9(void) 105 { 106 int ret = 0; 107 108 p9_error_init(); 109 printk(KERN_INFO "Installing 9P2000 support\n"); 110 p9_trans_fd_init(); 111 112 return ret; 113 } 114 115 /** 116 * v9fs_init - shutdown module 117 * 118 */ 119 120 static void __exit exit_p9(void) 121 { 122 printk(KERN_INFO "Unloading 9P2000 support\n"); 123 } 124 125 module_init(init_p9) 126 module_exit(exit_p9) 127 128 MODULE_AUTHOR("Latchesar Ionkov <lucho@ionkov.net>"); 129 MODULE_AUTHOR("Eric Van Hensbergen <ericvh@gmail.com>"); 130 MODULE_AUTHOR("Ron Minnich <rminnich@lanl.gov>"); 131 MODULE_LICENSE("GPL"); 132