2017-07-13 00:33:43 +03:00
/*
* proc sysctl test driver
*
* Copyright ( C ) 2017 Luis R . Rodriguez < mcgrof @ kernel . org >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation ; either version 2 of the License , or at your option any
* later version ; or , when distributed separately from the Linux kernel or
* when incorporated into other software packages , subject to the following
* license :
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of copyleft - next ( version 0.3 .1 or later ) as published
* at http : //copyleft-next.org/.
*/
/*
2020-10-16 06:11:10 +03:00
* This module provides an interface to the proc sysctl interfaces . This
2017-07-13 00:33:43 +03:00
* driver requires CONFIG_PROC_SYSCTL . It will not normally be loaded by the
* system unless explicitly requested by name . You can also build this driver
* into your kernel .
*/
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
# include <linux/init.h>
# include <linux/list.h>
# include <linux/module.h>
# include <linux/printk.h>
# include <linux/fs.h>
# include <linux/miscdevice.h>
# include <linux/slab.h>
# include <linux/uaccess.h>
# include <linux/async.h>
# include <linux/delay.h>
# include <linux/vmalloc.h>
static int i_zero ;
static int i_one_hundred = 100 ;
2022-05-01 06:55:24 +03:00
static int match_int_ok = 1 ;
2017-07-13 00:33:43 +03:00
struct test_sysctl_data {
int int_0001 ;
2017-07-13 00:33:52 +03:00
int int_0002 ;
2017-07-13 00:33:58 +03:00
int int_0003 [ 4 ] ;
2017-07-13 00:33:52 +03:00
2020-06-08 07:40:38 +03:00
int boot_int ;
2017-07-13 00:33:55 +03:00
unsigned int uint_0001 ;
2017-07-13 00:33:43 +03:00
char string_0001 [ 65 ] ;
2019-05-15 01:45:10 +03:00
# define SYSCTL_TEST_BITMAP_SIZE 65536
unsigned long * bitmap_0001 ;
2017-07-13 00:33:43 +03:00
} ;
static struct test_sysctl_data test_data = {
. int_0001 = 60 ,
2017-07-13 00:33:52 +03:00
. int_0002 = 1 ,
2017-07-13 00:33:58 +03:00
. int_0003 [ 0 ] = 0 ,
. int_0003 [ 1 ] = 1 ,
. int_0003 [ 2 ] = 2 ,
. int_0003 [ 3 ] = 3 ,
2020-06-08 07:40:38 +03:00
. boot_int = 0 ,
2017-07-13 00:33:55 +03:00
. uint_0001 = 314 ,
2017-07-13 00:33:43 +03:00
. string_0001 = " (none) " ,
} ;
/* These are all under /proc/sys/debug/test_sysctl/ */
static struct ctl_table test_table [ ] = {
{
. procname = " int_0001 " ,
. data = & test_data . int_0001 ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
. proc_handler = proc_dointvec_minmax ,
. extra1 = & i_zero ,
. extra2 = & i_one_hundred ,
} ,
2017-07-13 00:33:52 +03:00
{
. procname = " int_0002 " ,
. data = & test_data . int_0002 ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
. proc_handler = proc_dointvec ,
} ,
2017-07-13 00:33:58 +03:00
{
. procname = " int_0003 " ,
. data = & test_data . int_0003 ,
. maxlen = sizeof ( test_data . int_0003 ) ,
. mode = 0644 ,
. proc_handler = proc_dointvec ,
} ,
2022-05-01 06:55:24 +03:00
{
. procname = " match_int " ,
. data = & match_int_ok ,
. maxlen = sizeof ( match_int_ok ) ,
. mode = 0444 ,
. proc_handler = proc_dointvec ,
} ,
2020-06-08 07:40:38 +03:00
{
. procname = " boot_int " ,
. data = & test_data . boot_int ,
. maxlen = sizeof ( test_data . boot_int ) ,
. mode = 0644 ,
. proc_handler = proc_dointvec ,
. extra1 = SYSCTL_ZERO ,
. extra2 = SYSCTL_ONE ,
} ,
2017-07-13 00:33:55 +03:00
{
. procname = " uint_0001 " ,
. data = & test_data . uint_0001 ,
. maxlen = sizeof ( unsigned int ) ,
. mode = 0644 ,
. proc_handler = proc_douintvec ,
} ,
2017-07-13 00:33:43 +03:00
{
. procname = " string_0001 " ,
. data = & test_data . string_0001 ,
. maxlen = sizeof ( test_data . string_0001 ) ,
. mode = 0644 ,
. proc_handler = proc_dostring ,
} ,
2019-05-15 01:45:10 +03:00
{
. procname = " bitmap_0001 " ,
. data = & test_data . bitmap_0001 ,
. maxlen = SYSCTL_TEST_BITMAP_SIZE ,
. mode = 0644 ,
. proc_handler = proc_do_large_bitmap ,
} ,
2017-07-13 00:33:43 +03:00
{ }
} ;
static struct ctl_table_header * test_sysctl_header ;
static int __init test_sysctl_init ( void )
{
2022-05-01 06:55:24 +03:00
int i ;
struct {
int defined ;
int wanted ;
} match_int [ ] = {
{ . defined = * ( int * ) SYSCTL_ZERO , . wanted = 0 } ,
{ . defined = * ( int * ) SYSCTL_ONE , . wanted = 1 } ,
{ . defined = * ( int * ) SYSCTL_TWO , . wanted = 2 } ,
{ . defined = * ( int * ) SYSCTL_THREE , . wanted = 3 } ,
{ . defined = * ( int * ) SYSCTL_FOUR , . wanted = 4 } ,
{ . defined = * ( int * ) SYSCTL_ONE_HUNDRED , . wanted = 100 } ,
{ . defined = * ( int * ) SYSCTL_TWO_HUNDRED , . wanted = 200 } ,
{ . defined = * ( int * ) SYSCTL_ONE_THOUSAND , . wanted = 1000 } ,
{ . defined = * ( int * ) SYSCTL_THREE_THOUSAND , . wanted = 3000 } ,
{ . defined = * ( int * ) SYSCTL_INT_MAX , . wanted = INT_MAX } ,
{ . defined = * ( int * ) SYSCTL_MAXOLDUID , . wanted = 65535 } ,
{ . defined = * ( int * ) SYSCTL_NEG_ONE , . wanted = - 1 } ,
} ;
for ( i = 0 ; i < ARRAY_SIZE ( match_int ) ; i + + )
if ( match_int [ i ] . defined ! = match_int [ i ] . wanted )
match_int_ok = 0 ;
2019-05-15 01:45:10 +03:00
test_data . bitmap_0001 = kzalloc ( SYSCTL_TEST_BITMAP_SIZE / 8 , GFP_KERNEL ) ;
if ( ! test_data . bitmap_0001 )
return - ENOMEM ;
test_sysctl: simplify subdirectory registration with register_sysctl()
There is no need to user boiler plate code to specify a set of base
directories we're going to stuff sysctls under. Simplify this by using
register_sysctl() and specifying the directory path directly.
// pycocci sysctl-subdir-register-sysctl-simplify.cocci lib/test_sysctl.c
@c1@
expression E1;
identifier subdir, sysctls;
@@
static struct ctl_table subdir[] = {
{
.procname = E1,
.maxlen = 0,
.mode = 0555,
.child = sysctls,
},
{ }
};
@c2@
identifier c1.subdir;
expression E2;
identifier base;
@@
static struct ctl_table base[] = {
{
.procname = E2,
.maxlen = 0,
.mode = 0555,
.child = subdir,
},
{ }
};
@c3@
identifier c2.base;
identifier header;
@@
header = register_sysctl_table(base);
@r1 depends on c1 && c2 && c3@
expression c1.E1;
identifier c1.subdir, c1.sysctls;
@@
-static struct ctl_table subdir[] = {
- {
- .procname = E1,
- .maxlen = 0,
- .mode = 0555,
- .child = sysctls,
- },
- { }
-};
@r2 depends on c1 && c2 && c3@
identifier c1.subdir;
expression c2.E2;
identifier c2.base;
@@
-static struct ctl_table base[] = {
- {
- .procname = E2,
- .maxlen = 0,
- .mode = 0555,
- .child = subdir,
- },
- { }
-};
@initialize:python@
@@
def make_my_fresh_expression(s1, s2):
return '"' + s1.strip('"') + "/" + s2.strip('"') + '"'
@r3 depends on c1 && c2 && c3@
expression c1.E1;
identifier c1.sysctls;
expression c2.E2;
identifier c2.base;
identifier c3.header;
fresh identifier E3 = script:python(E2, E1) { make_my_fresh_expression(E2, E1) };
@@
header =
-register_sysctl_table(base);
+register_sysctl(E3, sysctls);
Generated-by: Coccinelle SmPL
Link: https://lkml.kernel.org/r/20211123202422.819032-6-mcgrof@kernel.org
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Amir Goldstein <amir73il@gmail.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Antti Palosaari <crope@iki.fi>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Benjamin LaHaise <bcrl@kvack.org>
Cc: Clemens Ladisch <clemens@ladisch.de>
Cc: David Airlie <airlied@linux.ie>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Iurii Zaikin <yzaikin@google.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Joseph Qi <joseph.qi@linux.alibaba.com>
Cc: Julia Lawall <julia.lawall@inria.fr>
Cc: Kees Cook <keescook@chromium.org>
Cc: Lukas Middendorf <kernel@tuxforce.de>
Cc: Mark Fasheh <mark@fasheh.com>
Cc: Paul Turner <pjt@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Phillip Potter <phil@philpotter.co.uk>
Cc: Qing Wang <wangqing@vivo.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Sebastian Reichel <sre@kernel.org>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Stephen Kitt <steve@sk2.org>
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: Xiaoming Ni <nixiaoming@huawei.com>
Cc: Douglas Gilbert <dgilbert@interlog.com>
Cc: James E.J. Bottomley <jejb@linux.ibm.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: John Ogness <john.ogness@linutronix.de>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2022-01-22 09:11:54 +03:00
test_sysctl_header = register_sysctl ( " debug/test_sysctl " , test_table ) ;
2019-05-15 01:45:10 +03:00
if ( ! test_sysctl_header ) {
kfree ( test_data . bitmap_0001 ) ;
2017-07-13 00:33:43 +03:00
return - ENOMEM ;
2019-05-15 01:45:10 +03:00
}
2017-07-13 00:33:43 +03:00
return 0 ;
}
2020-05-28 17:52:16 +03:00
module_init ( test_sysctl_init ) ;
2017-07-13 00:33:43 +03:00
static void __exit test_sysctl_exit ( void )
{
2019-05-15 01:45:10 +03:00
kfree ( test_data . bitmap_0001 ) ;
2017-07-13 00:33:43 +03:00
if ( test_sysctl_header )
unregister_sysctl_table ( test_sysctl_header ) ;
}
module_exit ( test_sysctl_exit ) ;
MODULE_AUTHOR ( " Luis R. Rodriguez <mcgrof@kernel.org> " ) ;
MODULE_LICENSE ( " GPL " ) ;