diff options
Diffstat (limited to 'lib/test_sysctl.c')
| -rw-r--r-- | lib/test_sysctl.c | 131 | 
1 files changed, 91 insertions, 40 deletions
diff --git a/lib/test_sysctl.c b/lib/test_sysctl.c index 4249e0cc8aaf..c02aa9c868f2 100644 --- a/lib/test_sysctl.c +++ b/lib/test_sysctl.c @@ -30,15 +30,17 @@ static int i_zero;  static int i_one_hundred = 100;  static int match_int_ok = 1; +enum { +	TEST_H_SETUP_NODE, +	TEST_H_MNT, +	TEST_H_MNTERROR, +	TEST_H_EMPTY_ADD, +	TEST_H_EMPTY, +	TEST_H_U8, +	TEST_H_SIZE /* Always at the end */ +}; -static struct { -	struct ctl_table_header *test_h_setup_node; -	struct ctl_table_header *test_h_mnt; -	struct ctl_table_header *test_h_mnterror; -	struct ctl_table_header *empty_add; -	struct ctl_table_header *empty; -} sysctl_test_headers; - +static struct ctl_table_header *ctl_headers[TEST_H_SIZE] = {};  struct test_sysctl_data {  	int int_0001;  	int int_0002; @@ -167,8 +169,8 @@ static int test_sysctl_setup_node_tests(void)  	test_data.bitmap_0001 = kzalloc(SYSCTL_TEST_BITMAP_SIZE/8, GFP_KERNEL);  	if (!test_data.bitmap_0001)  		return -ENOMEM; -	sysctl_test_headers.test_h_setup_node = register_sysctl("debug/test_sysctl", test_table); -	if (!sysctl_test_headers.test_h_setup_node) { +	ctl_headers[TEST_H_SETUP_NODE] = register_sysctl("debug/test_sysctl", test_table); +	if (!ctl_headers[TEST_H_SETUP_NODE]) {  		kfree(test_data.bitmap_0001);  		return -ENOMEM;  	} @@ -202,12 +204,12 @@ static int test_sysctl_run_unregister_nested(void)  static int test_sysctl_run_register_mount_point(void)  { -	sysctl_test_headers.test_h_mnt +	ctl_headers[TEST_H_MNT]  		= register_sysctl_mount_point("debug/test_sysctl/mnt"); -	if (!sysctl_test_headers.test_h_mnt) +	if (!ctl_headers[TEST_H_MNT])  		return -ENOMEM; -	sysctl_test_headers.test_h_mnterror +	ctl_headers[TEST_H_MNTERROR]  		= register_sysctl("debug/test_sysctl/mnt/mnt_error",  				  test_table_unregister);  	/* @@ -225,39 +227,94 @@ static const struct ctl_table test_table_empty[] = { };  static int test_sysctl_run_register_empty(void)  {  	/* Tets that an empty dir can be created */ -	sysctl_test_headers.empty_add +	ctl_headers[TEST_H_EMPTY_ADD]  		= register_sysctl("debug/test_sysctl/empty_add", test_table_empty); -	if (!sysctl_test_headers.empty_add) +	if (!ctl_headers[TEST_H_EMPTY_ADD])  		return -ENOMEM;  	/* Test that register on top of an empty dir works */ -	sysctl_test_headers.empty +	ctl_headers[TEST_H_EMPTY]  		= register_sysctl("debug/test_sysctl/empty_add/empty", test_table_empty); -	if (!sysctl_test_headers.empty) +	if (!ctl_headers[TEST_H_EMPTY])  		return -ENOMEM;  	return 0;  } -static int __init test_sysctl_init(void) +static const struct ctl_table table_u8_over[] = { +	{ +		.procname	= "u8_over", +		.data		= &test_data.uint_0001, +		.maxlen		= sizeof(u8), +		.mode		= 0644, +		.proc_handler	= proc_dou8vec_minmax, +		.extra1		= SYSCTL_FOUR, +		.extra2		= SYSCTL_ONE_THOUSAND, +	}, +}; + +static const struct ctl_table table_u8_under[] = { +	{ +		.procname	= "u8_under", +		.data		= &test_data.uint_0001, +		.maxlen		= sizeof(u8), +		.mode		= 0644, +		.proc_handler	= proc_dou8vec_minmax, +		.extra1		= SYSCTL_NEG_ONE, +		.extra2		= SYSCTL_ONE_HUNDRED, +	}, +}; + +static const struct ctl_table table_u8_valid[] = { +	{ +		.procname	= "u8_valid", +		.data		= &test_data.uint_0001, +		.maxlen		= sizeof(u8), +		.mode		= 0644, +		.proc_handler	= proc_dou8vec_minmax, +		.extra1		= SYSCTL_ZERO, +		.extra2		= SYSCTL_TWO_HUNDRED, +	}, +}; + +static int test_sysctl_register_u8_extra(void)  { -	int err; +	/* should fail because it's over */ +	ctl_headers[TEST_H_U8] +		= register_sysctl("debug/test_sysctl", table_u8_over); +	if (ctl_headers[TEST_H_U8]) +		return -ENOMEM; + +	/* should fail because it's under */ +	ctl_headers[TEST_H_U8] +		= register_sysctl("debug/test_sysctl", table_u8_under); +	if (ctl_headers[TEST_H_U8]) +		return -ENOMEM; -	err = test_sysctl_setup_node_tests(); -	if (err) -		goto out; +	/* should not fail because it's valid */ +	ctl_headers[TEST_H_U8] +		= register_sysctl("debug/test_sysctl", table_u8_valid); +	if (!ctl_headers[TEST_H_U8]) +		return -ENOMEM; -	err = test_sysctl_run_unregister_nested(); -	if (err) -		goto out; +	return 0; +} -	err = test_sysctl_run_register_mount_point(); -	if (err) -		goto out; +static int __init test_sysctl_init(void) +{ +	int err = 0; + +	int (*func_array[])(void) = { +		test_sysctl_setup_node_tests, +		test_sysctl_run_unregister_nested, +		test_sysctl_run_register_mount_point, +		test_sysctl_run_register_empty, +		test_sysctl_register_u8_extra +	}; -	err = test_sysctl_run_register_empty(); +	for (int i = 0; !err && i < ARRAY_SIZE(func_array); i++) +		err = func_array[i](); -out:  	return err;  }  module_init(test_sysctl_init); @@ -265,16 +322,10 @@ module_init(test_sysctl_init);  static void __exit test_sysctl_exit(void)  {  	kfree(test_data.bitmap_0001); -	if (sysctl_test_headers.test_h_setup_node) -		unregister_sysctl_table(sysctl_test_headers.test_h_setup_node); -	if (sysctl_test_headers.test_h_mnt) -		unregister_sysctl_table(sysctl_test_headers.test_h_mnt); -	if (sysctl_test_headers.test_h_mnterror) -		unregister_sysctl_table(sysctl_test_headers.test_h_mnterror); -	if (sysctl_test_headers.empty) -		unregister_sysctl_table(sysctl_test_headers.empty); -	if (sysctl_test_headers.empty_add) -		unregister_sysctl_table(sysctl_test_headers.empty_add); +	for (int i = 0; i < TEST_H_SIZE; i++) { +		if (ctl_headers[i]) +			unregister_sysctl_table(ctl_headers[i]); +	}  }  module_exit(test_sysctl_exit);  | 
