mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
1f32761322
Based on 1 normalized pattern(s): 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 extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 27 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Richard Fontana <rfontana@redhat.com> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Reviewed-by: Steve Winslow <swinslow@gmail.com> Reviewed-by: Allison Randal <allison@lohutok.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190528170026.981318839@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
192 lines
3.7 KiB
C
192 lines
3.7 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* 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>
|
|
*/
|
|
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/moduleparam.h>
|
|
#include <net/9p/9p.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/parser.h>
|
|
#include <net/9p/client.h>
|
|
#include <net/9p/transport.h>
|
|
#include <linux/list.h>
|
|
#include <linux/spinlock.h>
|
|
|
|
#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");
|
|
|
|
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);
|
|
#endif
|
|
|
|
/*
|
|
* Dynamic Transport Registration Routines
|
|
*
|
|
*/
|
|
|
|
static DEFINE_SPINLOCK(v9fs_trans_lock);
|
|
static LIST_HEAD(v9fs_trans_list);
|
|
|
|
/**
|
|
* v9fs_register_trans - register a new transport with 9p
|
|
* @m: structure describing the transport module and entry points
|
|
*
|
|
*/
|
|
void v9fs_register_trans(struct p9_trans_module *m)
|
|
{
|
|
spin_lock(&v9fs_trans_lock);
|
|
list_add_tail(&m->list, &v9fs_trans_list);
|
|
spin_unlock(&v9fs_trans_lock);
|
|
}
|
|
EXPORT_SYMBOL(v9fs_register_trans);
|
|
|
|
/**
|
|
* 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
|
|
* @s: string identifying transport
|
|
*
|
|
*/
|
|
struct p9_trans_module *v9fs_get_trans_by_name(char *s)
|
|
{
|
|
struct p9_trans_module *t, *found = NULL;
|
|
|
|
spin_lock(&v9fs_trans_lock);
|
|
|
|
list_for_each_entry(t, &v9fs_trans_list, list)
|
|
if (strcmp(t->name, s) == 0 &&
|
|
try_module_get(t->owner)) {
|
|
found = t;
|
|
break;
|
|
}
|
|
|
|
spin_unlock(&v9fs_trans_lock);
|
|
return found;
|
|
}
|
|
EXPORT_SYMBOL(v9fs_get_trans_by_name);
|
|
|
|
/**
|
|
* v9fs_get_default_trans - get the default transport
|
|
*
|
|
*/
|
|
|
|
struct p9_trans_module *v9fs_get_default_trans(void)
|
|
{
|
|
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;
|
|
}
|
|
EXPORT_SYMBOL(v9fs_get_default_trans);
|
|
|
|
/**
|
|
* v9fs_put_trans - put trans
|
|
* @m: transport to put
|
|
*
|
|
*/
|
|
void v9fs_put_trans(struct p9_trans_module *m)
|
|
{
|
|
if (m)
|
|
module_put(m->owner);
|
|
}
|
|
|
|
/**
|
|
* init_p9 - Initialize module
|
|
*
|
|
*/
|
|
static int __init init_p9(void)
|
|
{
|
|
int ret;
|
|
|
|
ret = p9_client_init();
|
|
if (ret)
|
|
return ret;
|
|
|
|
p9_error_init();
|
|
pr_info("Installing 9P2000 support\n");
|
|
p9_trans_fd_init();
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* exit_p9 - shutdown module
|
|
*
|
|
*/
|
|
|
|
static void __exit exit_p9(void)
|
|
{
|
|
pr_info("Unloading 9P2000 support\n");
|
|
|
|
p9_trans_fd_exit();
|
|
p9_client_exit();
|
|
}
|
|
|
|
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");
|