Thread (11 messages) 11 messages, 5 authors, 2021-09-16

Re: [PATCH 1/2] sysctl: introduce new proc handler proc_dobool

From: Thomas Huth <hidden>
Date: 2021-08-18 09:39:03
Also in: linux-s390, lkml

On 03/08/2021 12.59, Thomas Huth wrote:
quoted hunk ↗ jump to hunk
From: Jia He <redacted>

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 <redacted>
Signed-off-by: Jia He <redacted>
[thuth: rebased the patch to the current kernel version]
Signed-off-by: Thomas Huth <redacted>
---
  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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help