2005-04-17 02:20:36 +04:00
/*
* linux / net / sunrpc / sysctl . c
*
* Sysctl interface to sunrpc module .
*
* I would prefer to register the sunrpc table below sys / net , but that ' s
* impossible at the moment .
*/
# include <linux/types.h>
# include <linux/linkage.h>
# include <linux/ctype.h>
# include <linux/fs.h>
# include <linux/sysctl.h>
# include <linux/module.h>
# include <asm/uaccess.h>
# include <linux/sunrpc/types.h>
# include <linux/sunrpc/sched.h>
# include <linux/sunrpc/stats.h>
2007-12-31 06:08:31 +03:00
# include <linux/sunrpc/svc_xprt.h>
2005-04-17 02:20:36 +04:00
2012-01-12 22:07:51 +04:00
# include "netns.h"
2005-04-17 02:20:36 +04:00
/*
* Declare the debug flags here
*/
unsigned int rpc_debug ;
2007-07-14 23:39:59 +04:00
EXPORT_SYMBOL_GPL ( rpc_debug ) ;
2007-07-14 23:39:58 +04:00
2005-04-17 02:20:36 +04:00
unsigned int nfs_debug ;
2007-07-14 23:39:59 +04:00
EXPORT_SYMBOL_GPL ( nfs_debug ) ;
2007-07-14 23:39:58 +04:00
2005-04-17 02:20:36 +04:00
unsigned int nfsd_debug ;
2007-07-14 23:39:59 +04:00
EXPORT_SYMBOL_GPL ( nfsd_debug ) ;
2007-07-14 23:39:58 +04:00
2005-04-17 02:20:36 +04:00
unsigned int nlm_debug ;
2007-07-14 23:39:59 +04:00
EXPORT_SYMBOL_GPL ( nlm_debug ) ;
2005-04-17 02:20:36 +04:00
2014-11-18 00:58:04 +03:00
# if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
2005-04-17 02:20:36 +04:00
static struct ctl_table_header * sunrpc_table_header ;
2013-06-12 10:04:25 +04:00
static struct ctl_table sunrpc_table [ ] ;
2005-04-17 02:20:36 +04:00
void
rpc_register_sysctl ( void )
{
2007-02-14 11:33:24 +03:00
if ( ! sunrpc_table_header )
2007-02-14 11:34:09 +03:00
sunrpc_table_header = register_sysctl_table ( sunrpc_table ) ;
2005-04-17 02:20:36 +04:00
}
void
rpc_unregister_sysctl ( void )
{
if ( sunrpc_table_header ) {
unregister_sysctl_table ( sunrpc_table_header ) ;
sunrpc_table_header = NULL ;
}
}
2013-06-12 10:04:25 +04:00
static int proc_do_xprt ( struct ctl_table * table , int write ,
2007-12-31 06:08:31 +03:00
void __user * buffer , size_t * lenp , loff_t * ppos )
{
char tmpbuf [ 256 ] ;
2008-08-31 19:25:49 +04:00
size_t len ;
2007-12-31 06:08:31 +03:00
if ( ( * ppos & & ! write ) | | ! * lenp ) {
* lenp = 0 ;
return 0 ;
}
2008-08-31 19:25:49 +04:00
len = svc_print_xprts ( tmpbuf , sizeof ( tmpbuf ) ) ;
return simple_read_from_buffer ( buffer , * lenp , ppos , tmpbuf , len ) ;
2007-12-31 06:08:31 +03:00
}
2005-04-17 02:20:36 +04:00
static int
2013-06-12 10:04:25 +04:00
proc_dodebug ( struct ctl_table * table , int write ,
2005-04-17 02:20:36 +04:00
void __user * buffer , size_t * lenp , loff_t * ppos )
{
char tmpbuf [ 20 ] , c , * s ;
char __user * p ;
unsigned int value ;
size_t left , len ;
if ( ( * ppos & & ! write ) | | ! * lenp ) {
* lenp = 0 ;
return 0 ;
}
left = * lenp ;
if ( write ) {
if ( ! access_ok ( VERIFY_READ , buffer , left ) )
return - EFAULT ;
p = buffer ;
while ( left & & __get_user ( c , p ) > = 0 & & isspace ( c ) )
left - - , p + + ;
if ( ! left )
goto done ;
if ( left > sizeof ( tmpbuf ) - 1 )
return - EINVAL ;
if ( copy_from_user ( tmpbuf , p , left ) )
return - EFAULT ;
tmpbuf [ left ] = ' \0 ' ;
for ( s = tmpbuf , value = 0 ; ' 0 ' < = * s & & * s < = ' 9 ' ; s + + , left - - )
value = 10 * value + ( * s - ' 0 ' ) ;
if ( * s & & ! isspace ( * s ) )
return - EINVAL ;
while ( left & & isspace ( * s ) )
left - - , s + + ;
* ( unsigned int * ) table - > data = value ;
/* Display the RPC tasks on writing to rpc_debug */
2007-10-30 00:37:18 +03:00
if ( strcmp ( table - > procname , " rpc_debug " ) = = 0 )
2012-01-12 22:07:51 +04:00
rpc_show_tasks ( & init_net ) ;
2005-04-17 02:20:36 +04:00
} else {
if ( ! access_ok ( VERIFY_WRITE , buffer , left ) )
return - EFAULT ;
len = sprintf ( tmpbuf , " %d " , * ( unsigned int * ) table - > data ) ;
if ( len > left )
len = left ;
if ( __copy_to_user ( buffer , tmpbuf , len ) )
return - EFAULT ;
if ( ( left - = len ) > 0 ) {
if ( put_user ( ' \n ' , ( char __user * ) buffer + len ) )
return - EFAULT ;
left - - ;
}
}
done :
* lenp - = left ;
* ppos + = * lenp ;
return 0 ;
}
2005-08-12 00:25:23 +04:00
2013-06-12 10:04:25 +04:00
static struct ctl_table debug_table [ ] = {
2005-04-17 02:20:36 +04:00
{
. procname = " rpc_debug " ,
. data = & rpc_debug ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
2009-11-16 14:11:48 +03:00
. proc_handler = proc_dodebug
2007-02-10 02:38:13 +03:00
} ,
2005-04-17 02:20:36 +04:00
{
. procname = " nfs_debug " ,
. data = & nfs_debug ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
2009-11-16 14:11:48 +03:00
. proc_handler = proc_dodebug
2007-02-10 02:38:13 +03:00
} ,
2005-04-17 02:20:36 +04:00
{
. procname = " nfsd_debug " ,
. data = & nfsd_debug ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
2009-11-16 14:11:48 +03:00
. proc_handler = proc_dodebug
2007-02-10 02:38:13 +03:00
} ,
2005-04-17 02:20:36 +04:00
{
. procname = " nlm_debug " ,
. data = & nlm_debug ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
2009-11-16 14:11:48 +03:00
. proc_handler = proc_dodebug
2007-02-10 02:38:13 +03:00
} ,
2007-12-31 06:08:31 +03:00
{
. procname = " transports " ,
. maxlen = 256 ,
. mode = 0444 ,
2009-11-16 14:11:48 +03:00
. proc_handler = proc_do_xprt ,
2007-12-31 06:08:31 +03:00
} ,
2009-11-06 00:32:03 +03:00
{ }
2005-04-17 02:20:36 +04:00
} ;
2013-06-12 10:04:25 +04:00
static struct ctl_table sunrpc_table [ ] = {
2005-04-17 02:20:36 +04:00
{
. procname = " sunrpc " ,
. mode = 0555 ,
. child = debug_table
} ,
2009-11-06 00:32:03 +03:00
{ }
2005-04-17 02:20:36 +04:00
} ;
# endif