2019-05-28 09:57:16 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2007-07-10 17:57:28 -05:00
/*
* 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 10:40:46 -08:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2007-07-10 17:57:28 -05:00
# include <linux/module.h>
2021-10-17 15:46:11 +02:00
# include <linux/kmod.h>
2011-11-28 10:40:46 -08:00
# include <linux/errno.h>
# include <linux/sched.h>
2007-07-10 17:57:28 -05:00
# include <linux/moduleparam.h>
# include <net/9p/9p.h>
2007-10-17 14:31:07 -05:00
# include <linux/fs.h>
# include <linux/parser.h>
2008-10-13 18:45:25 -05:00
# include <net/9p/client.h>
2007-10-17 14:31:07 -05:00
# include <net/9p/transport.h>
# include <linux/list.h>
2008-09-24 16:22:23 -05:00
# include <linux/spinlock.h>
2007-07-10 17:57:28 -05:00
# ifdef CONFIG_NET_9P_DEBUG
2021-11-02 22:16:43 +09:00
unsigned int p9_debug_level ; /* feature-rific global debug level */
2007-07-10 17:57:28 -05:00
EXPORT_SYMBOL ( p9_debug_level ) ;
module_param_named ( debug , p9_debug_level , uint , 0 ) ;
MODULE_PARM_DESC ( debug , " 9P debugging level " ) ;
2011-11-28 10:40:46 -08:00
void _p9_debug ( enum p9_debug_flags level , const char * func ,
2021-11-02 22:16:43 +09:00
const char * fmt , . . . )
2011-11-28 10:40:46 -08:00
{
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-10 17:57:28 -05:00
# endif
2021-11-02 22:16:43 +09:00
/* Dynamic Transport Registration Routines */
2007-10-17 14:31:07 -05:00
2008-09-24 16:22:23 -05:00
static DEFINE_SPINLOCK ( v9fs_trans_lock ) ;
2007-10-17 14:31:07 -05:00
static LIST_HEAD ( v9fs_trans_list ) ;
/**
* v9fs_register_trans - register a new transport with 9 p
2008-03-05 07:08:09 -06:00
* @ m : structure describing the transport module and entry points
2007-10-17 14:31:07 -05:00
*
*/
void v9fs_register_trans ( struct p9_trans_module * m )
{
2008-09-24 16:22:23 -05:00
spin_lock ( & v9fs_trans_lock ) ;
2007-10-17 14:31:07 -05:00
list_add_tail ( & m - > list , & v9fs_trans_list ) ;
2008-09-24 16:22:23 -05:00
spin_unlock ( & v9fs_trans_lock ) ;
2007-10-17 14:31:07 -05:00
}
EXPORT_SYMBOL ( v9fs_register_trans ) ;
/**
2008-09-24 16:22:23 -05: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 ) ;
2021-11-03 20:38:23 +01:00
static struct p9_trans_module * _p9_get_trans_by_name ( const char * s )
2007-10-17 14:31:07 -05:00
{
2008-09-24 16:22:23 -05: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 18:35:32 +05:30
if ( strcmp ( t - > name , s ) = = 0 & &
2008-09-24 16:22:23 -05:00
try_module_get ( t - > owner ) ) {
found = t ;
break ;
}
spin_unlock ( & v9fs_trans_lock ) ;
2021-10-17 15:46:11 +02:00
return found ;
}
/**
* v9fs_get_trans_by_name - get transport with the matching name
* @ s : string identifying transport
*
*/
2021-11-03 20:38:23 +01:00
struct p9_trans_module * v9fs_get_trans_by_name ( const char * s )
2021-10-17 15:46:11 +02:00
{
struct p9_trans_module * found = NULL ;
found = _p9_get_trans_by_name ( s ) ;
# ifdef CONFIG_MODULES
if ( ! found ) {
request_module ( " 9p-%s " , s ) ;
found = _p9_get_trans_by_name ( s ) ;
}
# endif
2008-09-24 16:22:23 -05:00
return found ;
2007-10-17 14:31:07 -05:00
}
2008-09-24 16:22:23 -05:00
EXPORT_SYMBOL ( v9fs_get_trans_by_name ) ;
2007-10-17 14:31:07 -05:00
2021-11-03 20:38:23 +01:00
static const char * const v9fs_default_transports [ ] = {
" virtio " , " tcp " , " fd " , " unix " , " xen " , " rdma " ,
} ;
2007-10-17 14:31:07 -05:00
/**
2008-09-24 16:22:23 -05:00
* v9fs_get_default_trans - get the default transport
2007-10-17 14:31:07 -05:00
*
*/
2008-09-24 16:22:23 -05:00
struct p9_trans_module * v9fs_get_default_trans ( void )
2007-10-17 14:31:07 -05:00
{
2008-09-24 16:22:23 -05:00
struct p9_trans_module * t , * found = NULL ;
2021-11-03 20:38:23 +01:00
int i ;
2008-09-24 16:22:23 -05:00
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 ) ;
2021-11-03 20:38:23 +01:00
for ( i = 0 ; ! found & & i < ARRAY_SIZE ( v9fs_default_transports ) ; i + + )
found = v9fs_get_trans_by_name ( v9fs_default_transports [ i ] ) ;
2008-09-24 16:22:23 -05:00
return found ;
2007-10-17 14:31:07 -05:00
}
2008-09-24 16:22:23 -05:00
EXPORT_SYMBOL ( v9fs_get_default_trans ) ;
2007-10-17 14:31:07 -05:00
2008-09-24 16:22:23 -05: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 14:31:07 -05:00
2007-07-10 17:57:28 -05:00
/**
2011-04-30 12:56:24 -05:00
* init_p9 - Initialize module
2007-07-10 17:57:28 -05:00
*
*/
static int __init init_p9 ( void )
{
2018-07-11 14:02:24 -07:00
int ret ;
ret = p9_client_init ( ) ;
if ( ret )
return ret ;
2007-07-10 17:57:28 -05:00
p9_error_init ( ) ;
2011-11-28 10:40:46 -08:00
pr_info ( " Installing 9P2000 support \n " ) ;
2007-07-10 17:57:28 -05:00
2018-07-11 14:02:24 -07:00
return ret ;
2007-07-10 17:57:28 -05:00
}
/**
2011-04-30 12:56:24 -05:00
* exit_p9 - shutdown module
2007-07-10 17:57:28 -05:00
*
*/
static void __exit exit_p9 ( void )
{
2011-11-28 10:40:46 -08:00
pr_info ( " Unloading 9P2000 support \n " ) ;
2008-09-24 16:22:23 -05:00
2018-07-11 14:02:24 -07:00
p9_client_exit ( ) ;
2007-07-10 17:57:28 -05: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 02:08:25 +00:00
MODULE_DESCRIPTION ( " Plan 9 Resource Sharing Support (9P2000) " ) ;