2019-05-19 13:08:55 +01:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-16 15:20:36 -07: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>
2016-12-24 11:46:01 -08:00
# include <linux/uaccess.h>
2005-04-16 15:20:36 -07:00
# include <linux/sunrpc/types.h>
# include <linux/sunrpc/sched.h>
# include <linux/sunrpc/stats.h>
2007-12-30 21:08:31 -06:00
# include <linux/sunrpc/svc_xprt.h>
2005-04-16 15:20:36 -07:00
2012-01-12 22:07:51 +04:00
# include "netns.h"
2005-04-16 15:20:36 -07:00
/*
* Declare the debug flags here
*/
unsigned int rpc_debug ;
2007-07-14 15:39:59 -04:00
EXPORT_SYMBOL_GPL ( rpc_debug ) ;
2007-07-14 15:39:58 -04:00
2005-04-16 15:20:36 -07:00
unsigned int nfs_debug ;
2007-07-14 15:39:59 -04:00
EXPORT_SYMBOL_GPL ( nfs_debug ) ;
2007-07-14 15:39:58 -04:00
2005-04-16 15:20:36 -07:00
unsigned int nfsd_debug ;
2007-07-14 15:39:59 -04:00
EXPORT_SYMBOL_GPL ( nfsd_debug ) ;
2007-07-14 15:39:58 -04:00
2005-04-16 15:20:36 -07:00
unsigned int nlm_debug ;
2007-07-14 15:39:59 -04:00
EXPORT_SYMBOL_GPL ( nlm_debug ) ;
2005-04-16 15:20:36 -07:00
2014-11-17 16:58:04 -05:00
# if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
2005-04-16 15:20:36 -07:00
2013-06-11 23:04:25 -07:00
static int proc_do_xprt ( struct ctl_table * table , int write ,
2020-04-24 08:43:38 +02:00
void * buffer , size_t * lenp , loff_t * ppos )
2007-12-30 21:08:31 -06:00
{
char tmpbuf [ 256 ] ;
2020-11-06 15:50:39 -05:00
ssize_t len ;
2008-08-31 19:25:49 +04:00
2020-11-06 15:39:50 -05:00
if ( write | | * ppos ) {
2007-12-30 21:08:31 -06:00
* lenp = 0 ;
return 0 ;
}
2008-08-31 19:25:49 +04:00
len = svc_print_xprts ( tmpbuf , sizeof ( tmpbuf ) ) ;
2020-11-06 15:50:39 -05:00
len = memory_read_from_buffer ( buffer , * lenp , ppos , tmpbuf , len ) ;
2020-10-12 01:00:45 +03:00
2020-11-06 15:50:39 -05:00
if ( len < 0 ) {
2020-10-12 01:00:45 +03:00
* lenp = 0 ;
return - EINVAL ;
}
2020-11-06 15:50:39 -05:00
* lenp = len ;
2020-10-12 01:00:45 +03:00
return 0 ;
2007-12-30 21:08:31 -06:00
}
2005-04-16 15:20:36 -07:00
static int
2020-04-24 08:43:38 +02:00
proc_dodebug ( struct ctl_table * table , int write , void * buffer , size_t * lenp ,
loff_t * ppos )
2005-04-16 15:20:36 -07:00
{
2020-04-24 08:43:38 +02:00
char tmpbuf [ 20 ] , * s = NULL ;
char * p ;
2005-04-16 15:20:36 -07:00
unsigned int value ;
size_t left , len ;
if ( ( * ppos & & ! write ) | | ! * lenp ) {
* lenp = 0 ;
return 0 ;
}
left = * lenp ;
if ( write ) {
p = buffer ;
2020-04-24 08:43:38 +02:00
while ( left & & isspace ( * p ) ) {
left - - ;
p + + ;
}
2005-04-16 15:20:36 -07:00
if ( ! left )
goto done ;
if ( left > sizeof ( tmpbuf ) - 1 )
return - EINVAL ;
2020-04-24 08:43:38 +02:00
memcpy ( tmpbuf , p , left ) ;
2005-04-16 15:20:36 -07:00
tmpbuf [ left ] = ' \0 ' ;
2015-09-12 09:37:18 +08:00
value = simple_strtol ( tmpbuf , & s , 0 ) ;
if ( s ) {
left - = ( s - tmpbuf ) ;
if ( left & & ! isspace ( * s ) )
return - EINVAL ;
2020-08-24 21:56:25 -07:00
while ( left & & isspace ( * s ) ) {
left - - ;
s + + ;
}
2015-09-12 09:37:18 +08:00
} else
left = 0 ;
2005-04-16 15:20:36 -07:00
* ( unsigned int * ) table - > data = value ;
/* Display the RPC tasks on writing to rpc_debug */
2007-10-29 14:37:18 -07:00
if ( strcmp ( table - > procname , " rpc_debug " ) = = 0 )
2012-01-12 22:07:51 +04:00
rpc_show_tasks ( & init_net ) ;
2005-04-16 15:20:36 -07:00
} else {
2015-09-12 09:37:18 +08:00
len = sprintf ( tmpbuf , " 0x%04x " , * ( unsigned int * ) table - > data ) ;
2005-04-16 15:20:36 -07:00
if ( len > left )
len = left ;
2020-04-24 08:43:38 +02:00
memcpy ( buffer , tmpbuf , len ) ;
2005-04-16 15:20:36 -07:00
if ( ( left - = len ) > 0 ) {
2020-04-24 08:43:38 +02:00
* ( ( char * ) buffer + len ) = ' \n ' ;
2005-04-16 15:20:36 -07:00
left - - ;
}
}
done :
* lenp - = left ;
* ppos + = * lenp ;
return 0 ;
}
2023-03-11 15:39:43 -08:00
static struct ctl_table_header * sunrpc_table_header ;
2005-08-11 16:25:23 -04:00
2013-06-11 23:04:25 -07:00
static struct ctl_table debug_table [ ] = {
2005-04-16 15:20:36 -07:00
{
. procname = " rpc_debug " ,
. data = & rpc_debug ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
2009-11-16 03:11:48 -08:00
. proc_handler = proc_dodebug
2007-02-09 15:38:13 -08:00
} ,
2005-04-16 15:20:36 -07:00
{
. procname = " nfs_debug " ,
. data = & nfs_debug ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
2009-11-16 03:11:48 -08:00
. proc_handler = proc_dodebug
2007-02-09 15:38:13 -08:00
} ,
2005-04-16 15:20:36 -07:00
{
. procname = " nfsd_debug " ,
. data = & nfsd_debug ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
2009-11-16 03:11:48 -08:00
. proc_handler = proc_dodebug
2007-02-09 15:38:13 -08:00
} ,
2005-04-16 15:20:36 -07:00
{
. procname = " nlm_debug " ,
. data = & nlm_debug ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
2009-11-16 03:11:48 -08:00
. proc_handler = proc_dodebug
2007-02-09 15:38:13 -08:00
} ,
2007-12-30 21:08:31 -06:00
{
. procname = " transports " ,
. maxlen = 256 ,
. mode = 0444 ,
2009-11-16 03:11:48 -08:00
. proc_handler = proc_do_xprt ,
2007-12-30 21:08:31 -06:00
} ,
2009-11-05 13:32:03 -08:00
{ }
2005-04-16 15:20:36 -07:00
} ;
2023-03-11 15:39:43 -08:00
void
rpc_register_sysctl ( void )
{
if ( ! sunrpc_table_header )
2023-03-11 15:39:44 -08:00
sunrpc_table_header = register_sysctl ( " sunrpc " , debug_table ) ;
2023-03-11 15:39:43 -08:00
}
void
rpc_unregister_sysctl ( void )
{
if ( sunrpc_table_header ) {
unregister_sysctl_table ( sunrpc_table_header ) ;
sunrpc_table_header = NULL ;
}
}
2005-04-16 15:20:36 -07:00
# endif