2019-05-28 19:57:16 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2007-07-11 02:57:28 +04:00
/*
* net / 9 p / 9 p . c
*
* 9 P 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 >
*/
2011-11-28 22:40:46 +04:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2007-07-11 02:57:28 +04:00
# include <linux/module.h>
2011-11-28 22:40:46 +04:00
# include <linux/errno.h>
# include <linux/sched.h>
2007-07-11 02:57:28 +04:00
# include <linux/moduleparam.h>
# include <net/9p/9p.h>
2007-10-17 23:31:07 +04:00
# include <linux/fs.h>
# include <linux/parser.h>
2008-10-14 03:45:25 +04:00
# include <net/9p/client.h>
2007-10-17 23:31:07 +04:00
# include <net/9p/transport.h>
# include <linux/list.h>
2008-09-25 01:22:23 +04:00
# include <linux/spinlock.h>
2007-07-11 02:57:28 +04:00
# 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 " ) ;
2011-11-28 22:40:46 +04:00
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 ) ;
2007-07-11 02:57:28 +04:00
# endif
2007-10-17 23:31:07 +04:00
/*
* Dynamic Transport Registration Routines
*
*/
2008-09-25 01:22:23 +04:00
static DEFINE_SPINLOCK ( v9fs_trans_lock ) ;
2007-10-17 23:31:07 +04:00
static LIST_HEAD ( v9fs_trans_list ) ;
/**
* v9fs_register_trans - register a new transport with 9 p
2008-03-05 16:08:09 +03:00
* @ m : structure describing the transport module and entry points
2007-10-17 23:31:07 +04:00
*
*/
void v9fs_register_trans ( struct p9_trans_module * m )
{
2008-09-25 01:22:23 +04:00
spin_lock ( & v9fs_trans_lock ) ;
2007-10-17 23:31:07 +04:00
list_add_tail ( & m - > list , & v9fs_trans_list ) ;
2008-09-25 01:22:23 +04:00
spin_unlock ( & v9fs_trans_lock ) ;
2007-10-17 23:31:07 +04:00
}
EXPORT_SYMBOL ( v9fs_register_trans ) ;
/**
2008-09-25 01:22:23 +04:00
* v9fs_unregister_trans - unregister a 9 p 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
2018-05-05 06:29:16 +03:00
* @ s : string identifying transport
2007-10-17 23:31:07 +04:00
*
*/
2011-05-06 17:05:32 +04:00
struct p9_trans_module * v9fs_get_trans_by_name ( char * s )
2007-10-17 23:31:07 +04:00
{
2008-09-25 01:22:23 +04:00
struct p9_trans_module * t , * found = NULL ;
spin_lock ( & v9fs_trans_lock ) ;
list_for_each_entry ( t , & v9fs_trans_list , list )
2011-05-06 17:05:32 +04:00
if ( strcmp ( t - > name , s ) = = 0 & &
2008-09-25 01:22:23 +04:00
try_module_get ( t - > owner ) ) {
found = t ;
break ;
}
spin_unlock ( & v9fs_trans_lock ) ;
return found ;
2007-10-17 23:31:07 +04:00
}
2008-09-25 01:22:23 +04:00
EXPORT_SYMBOL ( v9fs_get_trans_by_name ) ;
2007-10-17 23:31:07 +04:00
/**
2008-09-25 01:22:23 +04:00
* v9fs_get_default_trans - get the default transport
2007-10-17 23:31:07 +04:00
*
*/
2008-09-25 01:22:23 +04:00
struct p9_trans_module * v9fs_get_default_trans ( void )
2007-10-17 23:31:07 +04:00
{
2008-09-25 01:22:23 +04:00
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 ;
2007-10-17 23:31:07 +04:00
}
2008-09-25 01:22:23 +04:00
EXPORT_SYMBOL ( v9fs_get_default_trans ) ;
2007-10-17 23:31:07 +04:00
2008-09-25 01:22:23 +04:00
/**
* v9fs_put_trans - put trans
* @ m : transport to put
*
*/
void v9fs_put_trans ( struct p9_trans_module * m )
{
if ( m )
module_put ( m - > owner ) ;
}
2007-10-17 23:31:07 +04:00
2007-07-11 02:57:28 +04:00
/**
2011-04-30 21:56:24 +04:00
* init_p9 - Initialize module
2007-07-11 02:57:28 +04:00
*
*/
static int __init init_p9 ( void )
{
2018-07-12 00:02:24 +03:00
int ret ;
ret = p9_client_init ( ) ;
if ( ret )
return ret ;
2007-07-11 02:57:28 +04:00
p9_error_init ( ) ;
2011-11-28 22:40:46 +04:00
pr_info ( " Installing 9P2000 support \n " ) ;
2008-05-09 05:26:37 +04:00
p9_trans_fd_init ( ) ;
2007-07-11 02:57:28 +04:00
2018-07-12 00:02:24 +03:00
return ret ;
2007-07-11 02:57:28 +04:00
}
/**
2011-04-30 21:56:24 +04:00
* exit_p9 - shutdown module
2007-07-11 02:57:28 +04:00
*
*/
static void __exit exit_p9 ( void )
{
2011-11-28 22:40:46 +04:00
pr_info ( " Unloading 9P2000 support \n " ) ;
2008-09-25 01:22:23 +04:00
p9_trans_fd_exit ( ) ;
2018-07-12 00:02:24 +03:00
p9_client_exit ( ) ;
2007-07-11 02:57:28 +04:00
}
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 " ) ;
2020-06-20 05:08:25 +03:00
MODULE_DESCRIPTION ( " Plan 9 Resource Sharing Support (9P2000) " ) ;