mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
constify string/array kparam tracking structures
.. in an effort to make read-only whatever can be made, so that CONFIG_DEBUG_RODATA can catch as many issues as possible. Signed-off-by: Jan Beulich <jbeulich@novell.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d5aa0daf6d
commit
22e48eaf58
2 changed files with 18 additions and 17 deletions
|
@ -38,7 +38,11 @@ struct kernel_param {
|
||||||
unsigned int perm;
|
unsigned int perm;
|
||||||
param_set_fn set;
|
param_set_fn set;
|
||||||
param_get_fn get;
|
param_get_fn get;
|
||||||
void *arg;
|
union {
|
||||||
|
void *arg;
|
||||||
|
const struct kparam_string *str;
|
||||||
|
const struct kparam_array *arr;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Special one for strings we want to copy into */
|
/* Special one for strings we want to copy into */
|
||||||
|
@ -66,11 +70,11 @@ struct kparam_array
|
||||||
/* Default value instead of permissions? */ \
|
/* Default value instead of permissions? */ \
|
||||||
static int __param_perm_check_##name __attribute__((unused)) = \
|
static int __param_perm_check_##name __attribute__((unused)) = \
|
||||||
BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2)); \
|
BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2)); \
|
||||||
static char __param_str_##name[] = prefix #name; \
|
static const char __param_str_##name[] = prefix #name; \
|
||||||
static struct kernel_param const __param_##name \
|
static struct kernel_param const __param_##name \
|
||||||
__attribute_used__ \
|
__attribute_used__ \
|
||||||
__attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
|
__attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
|
||||||
= { __param_str_##name, perm, set, get, arg }
|
= { __param_str_##name, perm, set, get, { arg } }
|
||||||
|
|
||||||
#define module_param_call(name, set, get, arg, perm) \
|
#define module_param_call(name, set, get, arg, perm) \
|
||||||
__module_param_call(MODULE_PARAM_PREFIX, name, set, get, arg, perm)
|
__module_param_call(MODULE_PARAM_PREFIX, name, set, get, arg, perm)
|
||||||
|
@ -88,10 +92,10 @@ struct kparam_array
|
||||||
|
|
||||||
/* Actually copy string: maxlen param is usually sizeof(string). */
|
/* Actually copy string: maxlen param is usually sizeof(string). */
|
||||||
#define module_param_string(name, string, len, perm) \
|
#define module_param_string(name, string, len, perm) \
|
||||||
static struct kparam_string __param_string_##name \
|
static const struct kparam_string __param_string_##name \
|
||||||
= { len, string }; \
|
= { len, string }; \
|
||||||
module_param_call(name, param_set_copystring, param_get_string, \
|
module_param_call(name, param_set_copystring, param_get_string, \
|
||||||
&__param_string_##name, perm); \
|
.str = &__param_string_##name, perm); \
|
||||||
__MODULE_PARM_TYPE(name, "string")
|
__MODULE_PARM_TYPE(name, "string")
|
||||||
|
|
||||||
/* Called on module insert or kernel boot */
|
/* Called on module insert or kernel boot */
|
||||||
|
@ -149,11 +153,11 @@ extern int param_get_invbool(char *buffer, struct kernel_param *kp);
|
||||||
|
|
||||||
/* Comma-separated array: *nump is set to number they actually specified. */
|
/* Comma-separated array: *nump is set to number they actually specified. */
|
||||||
#define module_param_array_named(name, array, type, nump, perm) \
|
#define module_param_array_named(name, array, type, nump, perm) \
|
||||||
static struct kparam_array __param_arr_##name \
|
static const struct kparam_array __param_arr_##name \
|
||||||
= { ARRAY_SIZE(array), nump, param_set_##type, param_get_##type,\
|
= { ARRAY_SIZE(array), nump, param_set_##type, param_get_##type,\
|
||||||
sizeof(array[0]), array }; \
|
sizeof(array[0]), array }; \
|
||||||
module_param_call(name, param_array_set, param_array_get, \
|
module_param_call(name, param_array_set, param_array_get, \
|
||||||
&__param_arr_##name, perm); \
|
.arr = &__param_arr_##name, perm); \
|
||||||
__MODULE_PARM_TYPE(name, "array of " #type)
|
__MODULE_PARM_TYPE(name, "array of " #type)
|
||||||
|
|
||||||
#define module_param_array(name, type, nump, perm) \
|
#define module_param_array(name, type, nump, perm) \
|
||||||
|
|
|
@ -252,8 +252,9 @@ int param_get_bool(char *buffer, struct kernel_param *kp)
|
||||||
int param_set_invbool(const char *val, struct kernel_param *kp)
|
int param_set_invbool(const char *val, struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
int boolval, ret;
|
int boolval, ret;
|
||||||
struct kernel_param dummy = { .arg = &boolval };
|
struct kernel_param dummy;
|
||||||
|
|
||||||
|
dummy.arg = &boolval;
|
||||||
ret = param_set_bool(val, &dummy);
|
ret = param_set_bool(val, &dummy);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
*(int *)kp->arg = !boolval;
|
*(int *)kp->arg = !boolval;
|
||||||
|
@ -262,11 +263,7 @@ int param_set_invbool(const char *val, struct kernel_param *kp)
|
||||||
|
|
||||||
int param_get_invbool(char *buffer, struct kernel_param *kp)
|
int param_get_invbool(char *buffer, struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
int val;
|
return sprintf(buffer, "%c", (*(int *)kp->arg) ? 'N' : 'Y');
|
||||||
struct kernel_param dummy = { .arg = &val };
|
|
||||||
|
|
||||||
val = !*(int *)kp->arg;
|
|
||||||
return param_get_bool(buffer, &dummy);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We break the rule and mangle the string. */
|
/* We break the rule and mangle the string. */
|
||||||
|
@ -325,7 +322,7 @@ static int param_array(const char *name,
|
||||||
|
|
||||||
int param_array_set(const char *val, struct kernel_param *kp)
|
int param_array_set(const char *val, struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
struct kparam_array *arr = kp->arg;
|
const struct kparam_array *arr = kp->arr;
|
||||||
unsigned int temp_num;
|
unsigned int temp_num;
|
||||||
|
|
||||||
return param_array(kp->name, val, 1, arr->max, arr->elem,
|
return param_array(kp->name, val, 1, arr->max, arr->elem,
|
||||||
|
@ -335,7 +332,7 @@ int param_array_set(const char *val, struct kernel_param *kp)
|
||||||
int param_array_get(char *buffer, struct kernel_param *kp)
|
int param_array_get(char *buffer, struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
int i, off, ret;
|
int i, off, ret;
|
||||||
struct kparam_array *arr = kp->arg;
|
const struct kparam_array *arr = kp->arr;
|
||||||
struct kernel_param p;
|
struct kernel_param p;
|
||||||
|
|
||||||
p = *kp;
|
p = *kp;
|
||||||
|
@ -354,7 +351,7 @@ int param_array_get(char *buffer, struct kernel_param *kp)
|
||||||
|
|
||||||
int param_set_copystring(const char *val, struct kernel_param *kp)
|
int param_set_copystring(const char *val, struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
struct kparam_string *kps = kp->arg;
|
const struct kparam_string *kps = kp->str;
|
||||||
|
|
||||||
if (!val) {
|
if (!val) {
|
||||||
printk(KERN_ERR "%s: missing param set value\n", kp->name);
|
printk(KERN_ERR "%s: missing param set value\n", kp->name);
|
||||||
|
@ -371,7 +368,7 @@ int param_set_copystring(const char *val, struct kernel_param *kp)
|
||||||
|
|
||||||
int param_get_string(char *buffer, struct kernel_param *kp)
|
int param_get_string(char *buffer, struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
struct kparam_string *kps = kp->arg;
|
const struct kparam_string *kps = kp->str;
|
||||||
return strlcpy(buffer, kps->string, kps->maxlen);
|
return strlcpy(buffer, kps->string, kps->maxlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue