Message ID | 20210803105937.52052-2-thuth@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix /proc/sys/fs/nfs/nsm_use_hostnames on big endian machines | expand |
On 03/08/2021 12.59, Thomas Huth wrote: > From: Jia He <hejianet@gmail.com> > > 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: Pan Xinhui <xinhui@linux.vnet.ibm.com> > Signed-off-by: Jia He <hejianet@gmail.com> > [thuth: rebased the patch to the current kernel version] > Signed-off-by: Thomas Huth <thuth@redhat.com> > --- > include/linux/sysctl.h | 2 ++ > kernel/sysctl.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 44 insertions(+) > > diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h > index d99ca99837de..1fa2b69c6fc3 100644 > --- a/include/linux/sysctl.h > +++ b/include/linux/sysctl.h > @@ -48,6 +48,8 @@ typedef int proc_handler(struct ctl_table *ctl, int write, void *buffer, > size_t *lenp, loff_t *ppos); > > 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_douintvec(struct ctl_table *, int, void *, size_t *, loff_t *); > int proc_dointvec_minmax(struct ctl_table *, int, void *, size_t *, loff_t *); > diff --git a/kernel/sysctl.c b/kernel/sysctl.c > index 272f4a272f8c..25e49b4d8049 100644 > --- a/kernel/sysctl.c > +++ b/kernel/sysctl.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, > int *valp, > int write, void *data) > @@ -798,6 +813,26 @@ static int do_proc_douintvec(struct ctl_table *table, int write, > 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 > * @table: the sysctl table > @@ -1630,6 +1665,12 @@ int proc_dostring(struct ctl_table *table, int write, > 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, > void *buffer, size_t *lenp, loff_t *ppos) > { > @@ -3425,6 +3466,7 @@ int __init sysctl_init(void) > * No sense putting this after each symbol definition, twice, > * exception granted :-) > */ > +EXPORT_SYMBOL(proc_dobool); > EXPORT_SYMBOL(proc_dointvec); > EXPORT_SYMBOL(proc_douintvec); > EXPORT_SYMBOL(proc_dointvec_jiffies); > Friendly ping! Luis, Kees, Iurii, could you please have a look and provide an Ack if this looks ok to you? Thanks, Thomas
On 18/08/2021 11.38, Thomas Huth wrote: > On 03/08/2021 12.59, Thomas Huth wrote: >> From: Jia He <hejianet@gmail.com> >> >> 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: Pan Xinhui <xinhui@linux.vnet.ibm.com> >> Signed-off-by: Jia He <hejianet@gmail.com> >> [thuth: rebased the patch to the current kernel version] >> Signed-off-by: Thomas Huth <thuth@redhat.com> >> --- >> include/linux/sysctl.h | 2 ++ >> kernel/sysctl.c | 42 ++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 44 insertions(+) >> >> diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h >> index d99ca99837de..1fa2b69c6fc3 100644 >> --- a/include/linux/sysctl.h >> +++ b/include/linux/sysctl.h >> @@ -48,6 +48,8 @@ typedef int proc_handler(struct ctl_table *ctl, int >> write, void *buffer, >> size_t *lenp, loff_t *ppos); >> 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_douintvec(struct ctl_table *, int, void *, size_t *, loff_t *); >> int proc_dointvec_minmax(struct ctl_table *, int, void *, size_t *, >> loff_t *); >> diff --git a/kernel/sysctl.c b/kernel/sysctl.c >> index 272f4a272f8c..25e49b4d8049 100644 >> --- a/kernel/sysctl.c >> +++ b/kernel/sysctl.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, >> int *valp, >> int write, void *data) >> @@ -798,6 +813,26 @@ static int do_proc_douintvec(struct ctl_table *table, >> int write, >> 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 >> * @table: the sysctl table >> @@ -1630,6 +1665,12 @@ int proc_dostring(struct ctl_table *table, int write, >> 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, >> void *buffer, size_t *lenp, loff_t *ppos) >> { >> @@ -3425,6 +3466,7 @@ int __init sysctl_init(void) >> * No sense putting this after each symbol definition, twice, >> * exception granted :-) >> */ >> +EXPORT_SYMBOL(proc_dobool); >> EXPORT_SYMBOL(proc_dointvec); >> EXPORT_SYMBOL(proc_douintvec); >> EXPORT_SYMBOL(proc_dointvec_jiffies); >> > > Friendly ping! > > Luis, Kees, Iurii, could you please have a look and provide an Ack if this > looks ok to you? Ping again! Could anybody please provide an Ack? Thanks, Thomas
On Tue, Aug 03, 2021 at 12:59:36PM +0200, Thomas Huth wrote: > From: Jia He <hejianet@gmail.com> > > 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: Pan Xinhui <xinhui@linux.vnet.ibm.com> > Signed-off-by: Jia He <hejianet@gmail.com> Hi! I apologize for the delay. Yes, this looks good to me; thanks! Acked-by: Kees Cook <keescook@chromium.org>
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index d99ca99837de..1fa2b69c6fc3 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -48,6 +48,8 @@ typedef int proc_handler(struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos); 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_douintvec(struct ctl_table *, int, void *, size_t *, loff_t *); int proc_dointvec_minmax(struct ctl_table *, int, void *, size_t *, loff_t *); diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 272f4a272f8c..25e49b4d8049 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.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, int *valp, int write, void *data) @@ -798,6 +813,26 @@ static int do_proc_douintvec(struct ctl_table *table, int write, 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 * @table: the sysctl table @@ -1630,6 +1665,12 @@ int proc_dostring(struct ctl_table *table, int write, 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, void *buffer, size_t *lenp, loff_t *ppos) { @@ -3425,6 +3466,7 @@ int __init sysctl_init(void) * No sense putting this after each symbol definition, twice, * exception granted :-) */ +EXPORT_SYMBOL(proc_dobool); EXPORT_SYMBOL(proc_dointvec); EXPORT_SYMBOL(proc_douintvec); EXPORT_SYMBOL(proc_dointvec_jiffies);