blob: aa38b8b0e0f61ccb4342612b0aa589f067846232 [file] [log] [blame]
Thomas Gleixner1f327612019-05-28 09:57:16 -07001// SPDX-License-Identifier: GPL-2.0-only
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -05002/*
3 * net/9p/9p.c
4 *
5 * 9P entry point
6 *
7 * Copyright (C) 2007 by Latchesar Ionkov <[email protected]>
8 * Copyright (C) 2004 by Eric Van Hensbergen <[email protected]>
9 * Copyright (C) 2002 by Ron Minnich <[email protected]>
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -050010 */
11
Joe Perches5d385152011-11-28 10:40:46 -080012#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
13
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -050014#include <linux/module.h>
Thomas Weißschuh4cd82a52021-10-17 15:46:11 +020015#include <linux/kmod.h>
Joe Perches5d385152011-11-28 10:40:46 -080016#include <linux/errno.h>
17#include <linux/sched.h>
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -050018#include <linux/moduleparam.h>
19#include <net/9p/9p.h>
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050020#include <linux/fs.h>
21#include <linux/parser.h>
Eric Van Hensbergen8b81ef52008-10-13 18:45:25 -050022#include <net/9p/client.h>
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050023#include <net/9p/transport.h>
24#include <linux/list.h>
Tejun Heo72029fe2008-09-24 16:22:23 -050025#include <linux/spinlock.h>
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -050026
27#ifdef CONFIG_NET_9P_DEBUG
28unsigned int p9_debug_level = 0; /* feature-rific global debug level */
29EXPORT_SYMBOL(p9_debug_level);
30module_param_named(debug, p9_debug_level, uint, 0);
31MODULE_PARM_DESC(debug, "9P debugging level");
Joe Perches5d385152011-11-28 10:40:46 -080032
33void _p9_debug(enum p9_debug_flags level, const char *func,
34 const char *fmt, ...)
35{
36 struct va_format vaf;
37 va_list args;
38
39 if ((p9_debug_level & level) != level)
40 return;
41
42 va_start(args, fmt);
43
44 vaf.fmt = fmt;
45 vaf.va = &args;
46
47 if (level == P9_DEBUG_9P)
48 pr_notice("(%8.8d) %pV", task_pid_nr(current), &vaf);
49 else
50 pr_notice("-- %s (%d): %pV", func, task_pid_nr(current), &vaf);
51
52 va_end(args);
53}
54EXPORT_SYMBOL(_p9_debug);
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -050055#endif
56
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050057/*
58 * Dynamic Transport Registration Routines
59 *
60 */
61
Tejun Heo72029fe2008-09-24 16:22:23 -050062static DEFINE_SPINLOCK(v9fs_trans_lock);
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050063static LIST_HEAD(v9fs_trans_list);
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050064
65/**
66 * v9fs_register_trans - register a new transport with 9p
Eric Van Hensbergenee443992008-03-05 07:08:09 -060067 * @m: structure describing the transport module and entry points
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050068 *
69 */
70void v9fs_register_trans(struct p9_trans_module *m)
71{
Tejun Heo72029fe2008-09-24 16:22:23 -050072 spin_lock(&v9fs_trans_lock);
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050073 list_add_tail(&m->list, &v9fs_trans_list);
Tejun Heo72029fe2008-09-24 16:22:23 -050074 spin_unlock(&v9fs_trans_lock);
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050075}
76EXPORT_SYMBOL(v9fs_register_trans);
77
78/**
Tejun Heo72029fe2008-09-24 16:22:23 -050079 * v9fs_unregister_trans - unregister a 9p transport
80 * @m: the transport to remove
81 *
82 */
83void v9fs_unregister_trans(struct p9_trans_module *m)
84{
85 spin_lock(&v9fs_trans_lock);
86 list_del_init(&m->list);
87 spin_unlock(&v9fs_trans_lock);
88}
89EXPORT_SYMBOL(v9fs_unregister_trans);
90
Thomas Weißschuh4cd82a52021-10-17 15:46:11 +020091static struct p9_trans_module *_p9_get_trans_by_name(char *s)
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050092{
Tejun Heo72029fe2008-09-24 16:22:23 -050093 struct p9_trans_module *t, *found = NULL;
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -050094
Tejun Heo72029fe2008-09-24 16:22:23 -050095 spin_lock(&v9fs_trans_lock);
96
97 list_for_each_entry(t, &v9fs_trans_list, list)
Prem Karat4d630552011-05-06 18:35:32 +053098 if (strcmp(t->name, s) == 0 &&
Tejun Heo72029fe2008-09-24 16:22:23 -050099 try_module_get(t->owner)) {
100 found = t;
101 break;
102 }
103
104 spin_unlock(&v9fs_trans_lock);
Thomas Weißschuh4cd82a52021-10-17 15:46:11 +0200105
106 return found;
107}
108
109/**
110 * v9fs_get_trans_by_name - get transport with the matching name
111 * @s: string identifying transport
112 *
113 */
114struct p9_trans_module *v9fs_get_trans_by_name(char *s)
115{
116 struct p9_trans_module *found = NULL;
117
118 found = _p9_get_trans_by_name(s);
119
120#ifdef CONFIG_MODULES
121 if (!found) {
122 request_module("9p-%s", s);
123 found = _p9_get_trans_by_name(s);
124 }
125#endif
126
Tejun Heo72029fe2008-09-24 16:22:23 -0500127 return found;
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -0500128}
Tejun Heo72029fe2008-09-24 16:22:23 -0500129EXPORT_SYMBOL(v9fs_get_trans_by_name);
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -0500130
131/**
Tejun Heo72029fe2008-09-24 16:22:23 -0500132 * v9fs_get_default_trans - get the default transport
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -0500133 *
134 */
135
Tejun Heo72029fe2008-09-24 16:22:23 -0500136struct p9_trans_module *v9fs_get_default_trans(void)
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -0500137{
Tejun Heo72029fe2008-09-24 16:22:23 -0500138 struct p9_trans_module *t, *found = NULL;
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -0500139
Tejun Heo72029fe2008-09-24 16:22:23 -0500140 spin_lock(&v9fs_trans_lock);
141
142 list_for_each_entry(t, &v9fs_trans_list, list)
143 if (t->def && try_module_get(t->owner)) {
144 found = t;
145 break;
146 }
147
148 if (!found)
149 list_for_each_entry(t, &v9fs_trans_list, list)
150 if (try_module_get(t->owner)) {
151 found = t;
152 break;
153 }
154
155 spin_unlock(&v9fs_trans_lock);
156 return found;
157}
158EXPORT_SYMBOL(v9fs_get_default_trans);
159
160/**
161 * v9fs_put_trans - put trans
162 * @m: transport to put
163 *
164 */
165void v9fs_put_trans(struct p9_trans_module *m)
166{
167 if (m)
168 module_put(m->owner);
169}
Eric Van Hensbergenfb0466c32007-10-17 14:31:07 -0500170
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -0500171/**
Rob Landley961a5a52011-04-30 12:56:24 -0500172 * init_p9 - Initialize module
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -0500173 *
174 */
175static int __init init_p9(void)
176{
Matthew Wilcox996d5b42018-07-11 14:02:24 -0700177 int ret;
178
179 ret = p9_client_init();
180 if (ret)
181 return ret;
182
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -0500183 p9_error_init();
Joe Perches5d385152011-11-28 10:40:46 -0800184 pr_info("Installing 9P2000 support\n");
Eric Van Hensbergen887b3ec2008-05-08 20:26:37 -0500185 p9_trans_fd_init();
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -0500186
Matthew Wilcox996d5b42018-07-11 14:02:24 -0700187 return ret;
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -0500188}
189
190/**
Rob Landley961a5a52011-04-30 12:56:24 -0500191 * exit_p9 - shutdown module
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -0500192 *
193 */
194
195static void __exit exit_p9(void)
196{
Joe Perches5d385152011-11-28 10:40:46 -0800197 pr_info("Unloading 9P2000 support\n");
Tejun Heo72029fe2008-09-24 16:22:23 -0500198
199 p9_trans_fd_exit();
Matthew Wilcox996d5b42018-07-11 14:02:24 -0700200 p9_client_exit();
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -0500201}
202
203module_init(init_p9)
204module_exit(exit_p9)
205
206MODULE_AUTHOR("Latchesar Ionkov <[email protected]>");
207MODULE_AUTHOR("Eric Van Hensbergen <[email protected]>");
208MODULE_AUTHOR("Ron Minnich <[email protected]>");
209MODULE_LICENSE("GPL");
Rob Gill67c20de2020-06-20 02:08:25 +0000210MODULE_DESCRIPTION("Plan 9 Resource Sharing Support (9P2000)");