Commit a2071573 authored by Jia He's avatar Jia He Committed by Chuck Lever

sysctl: introduce new proc handler proc_dobool

This is to let bool variable could be correctly displayed in
big/little endian sysctl procfs. sizeof(bool) is arch dependent,
proc_dobool should work in all arches.
Suggested-by: default avatarPan Xinhui <xinhui@linux.vnet.ibm.com>
Signed-off-by: default avatarJia He <hejianet@gmail.com>
[thuth: rebased the patch to the current kernel version]
Signed-off-by: default avatarThomas Huth <thuth@redhat.com>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 5c117207
...@@ -48,6 +48,8 @@ typedef int proc_handler(struct ctl_table *ctl, int write, void *buffer, ...@@ -48,6 +48,8 @@ typedef int proc_handler(struct ctl_table *ctl, int write, void *buffer,
size_t *lenp, loff_t *ppos); size_t *lenp, loff_t *ppos);
int proc_dostring(struct ctl_table *, int, void *, size_t *, loff_t *); int proc_dostring(struct ctl_table *, int, void *, size_t *, loff_t *);
int proc_dobool(struct ctl_table *table, int write, void *buffer,
size_t *lenp, loff_t *ppos);
int proc_dointvec(struct ctl_table *, int, void *, size_t *, loff_t *); int proc_dointvec(struct ctl_table *, int, void *, size_t *, loff_t *);
int proc_douintvec(struct ctl_table *, int, void *, size_t *, loff_t *); int proc_douintvec(struct ctl_table *, int, void *, size_t *, loff_t *);
int proc_dointvec_minmax(struct ctl_table *, int, void *, size_t *, loff_t *); int proc_dointvec_minmax(struct ctl_table *, int, void *, size_t *, loff_t *);
......
...@@ -536,6 +536,21 @@ static void proc_put_char(void **buf, size_t *size, char c) ...@@ -536,6 +536,21 @@ static void proc_put_char(void **buf, size_t *size, char c)
} }
} }
static int do_proc_dobool_conv(bool *negp, unsigned long *lvalp,
int *valp,
int write, void *data)
{
if (write) {
*(bool *)valp = *lvalp;
} else {
int val = *(bool *)valp;
*lvalp = (unsigned long)val;
*negp = false;
}
return 0;
}
static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp, static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
int *valp, int *valp,
int write, void *data) int write, void *data)
...@@ -798,6 +813,26 @@ static int do_proc_douintvec(struct ctl_table *table, int write, ...@@ -798,6 +813,26 @@ static int do_proc_douintvec(struct ctl_table *table, int write,
buffer, lenp, ppos, conv, data); buffer, lenp, ppos, conv, data);
} }
/**
* proc_dobool - read/write a bool
* @table: the sysctl table
* @write: %TRUE if this is a write to the sysctl file
* @buffer: the user buffer
* @lenp: the size of the user buffer
* @ppos: file position
*
* Reads/writes up to table->maxlen/sizeof(unsigned int) integer
* values from/to the user buffer, treated as an ASCII string.
*
* Returns 0 on success.
*/
int proc_dobool(struct ctl_table *table, int write, void *buffer,
size_t *lenp, loff_t *ppos)
{
return do_proc_dointvec(table, write, buffer, lenp, ppos,
do_proc_dobool_conv, NULL);
}
/** /**
* proc_dointvec - read a vector of integers * proc_dointvec - read a vector of integers
* @table: the sysctl table * @table: the sysctl table
...@@ -1630,6 +1665,12 @@ int proc_dostring(struct ctl_table *table, int write, ...@@ -1630,6 +1665,12 @@ int proc_dostring(struct ctl_table *table, int write,
return -ENOSYS; return -ENOSYS;
} }
int proc_dobool(struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}
int proc_dointvec(struct ctl_table *table, int write, int proc_dointvec(struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
...@@ -3425,6 +3466,7 @@ int __init sysctl_init(void) ...@@ -3425,6 +3466,7 @@ int __init sysctl_init(void)
* No sense putting this after each symbol definition, twice, * No sense putting this after each symbol definition, twice,
* exception granted :-) * exception granted :-)
*/ */
EXPORT_SYMBOL(proc_dobool);
EXPORT_SYMBOL(proc_dointvec); EXPORT_SYMBOL(proc_dointvec);
EXPORT_SYMBOL(proc_douintvec); EXPORT_SYMBOL(proc_douintvec);
EXPORT_SYMBOL(proc_dointvec_jiffies); EXPORT_SYMBOL(proc_dointvec_jiffies);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment