linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 0/2] change the proc handler for nsm_use_hostnames
@ 2016-12-15  7:24 Jia He
  2016-12-15  7:24 ` [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool Jia He
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Jia He @ 2016-12-15  7:24 UTC (permalink / raw)
  To: linux-nfs, linux-kernel
  Cc: Eric W. Biederman, Andrew Morton, Dmitry Torokhov, Serge Hallyn,
	David S. Miller, Alexey Dobriyan, Subash Abhinov Kasiviswanathan,
	Arnaldo Carvalho de Melo, Al Viro, Mel Gorman, Kees Cook,
	Hugh Dickins, Daniel Bristot de Oliveira, Daniel Cashman,
	Arnd Bergmann, J. Bruce Fields, Jeff Layton, Trond Myklebust,
	Anna Schumaker, Jia He

nsm_use_hostnames is a module parameter and it will be exported to sysctl
procfs. This is to let user sometimes change it from userspace. But the
minimal unit for sysctl procfs read/write it sizeof(int).
In big endian system, the converting from/to  bool to/from int will cause
error for proc items.

This patch introduces a new proc handler proc_dobool for nsm_use_hostnames.

Changes:
v5: Fix compilation error when CONFIG_PROC_SYSCTL is not set 
v4: Change (u8 *) to (bool *)
v3: Introduce a new proc handler proc_dou8vec(suggested by Xinhui Pan)
v2: Change extern type in lockd.h

The test case I used:
/***************************************************************/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sysctl.h>

bool __read_mostly nsm_use_hostnames;
module_param(nsm_use_hostnames, bool, 0644);

static struct ctl_table my_sysctl[] = {
        {
                .procname       = "nsm_use_hostnames",
                .data           = &nsm_use_hostnames,
                .maxlen         = sizeof(int),
                .mode           = 0644,
                .proc_handler   = &proc_dointvec,
        },
        {}
};

static struct ctl_table my_root[] = {
        {
        .procname       = "mysysctl",
        .mode           = 0555,
        .child          = my_sysctl,
        },
        {}
};

static struct ctl_table_header * my_ctl_header;

static int __init sysctl_exam_init(void)
{
        my_ctl_header = register_sysctl_table(&my_root);
        if (my_ctl_header == NULL)
                printk("error regiester sysctl");

        return 0;
}

static void __exit sysctl_exam_exit(void)
{
        unregister_sysctl_table(my_ctl_header);
}

module_init(sysctl_exam_init);
module_exit(sysctl_exam_exit);
MODULE_LICENSE("GPL");
/****************************************************************/

[root@bigendian my]# insmod -f /root/my/hello.ko nsm_use_hostnames=1   
[root@bigendian my]# cat /proc/sys/mysysctl/nsm_use_hostnames 
16777216

After I change the proc_dointvec to new handler proc_dou8vec with the
patch:
[root@bigendian my]# insmod -f /root/my/hello.ko nsm_use_hostnames=1
[root@bigendian my]# cat /proc/sys/mysysctl/nsm_use_hostnames
1

In little endian system, there is no such issue.
Already tested in both of big and little endian(ppc64 and ppc64le)

Jia He (2):
  sysctl: introduce new proc handler proc_dobool
  lockd: change the proc_handler for nsm_use_hostnames

 fs/lockd/svc.c         |  2 +-
 include/linux/sysctl.h |  2 ++
 kernel/sysctl.c        | 41 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+), 1 deletion(-)
-- 
2.5.5

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool
  2016-12-15  7:24 [PATCH v5 0/2] change the proc handler for nsm_use_hostnames Jia He
@ 2016-12-15  7:24 ` Jia He
  2016-12-15  8:13   ` Pan Xinhui
  2017-01-04 21:09   ` J. Bruce Fields
  2016-12-15  7:24 ` [PATCH v5 2/2] lockd: change the proc_handler for nsm_use_hostnames Jia He
  2017-01-04  6:35 ` [PATCH v5 0/2] change the proc handler " hejianet
  2 siblings, 2 replies; 8+ messages in thread
From: Jia He @ 2016-12-15  7:24 UTC (permalink / raw)
  To: linux-nfs, linux-kernel
  Cc: Eric W. Biederman, Andrew Morton, Dmitry Torokhov, Serge Hallyn,
	David S. Miller, Alexey Dobriyan, Subash Abhinov Kasiviswanathan,
	Arnaldo Carvalho de Melo, Al Viro, Mel Gorman, Kees Cook,
	Hugh Dickins, Daniel Bristot de Oliveira, Daniel Cashman,
	Arnd Bergmann, J. Bruce Fields, Jeff Layton, Trond Myklebust,
	Anna Schumaker, Jia He

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>
---
 include/linux/sysctl.h |  2 ++
 kernel/sysctl.c        | 41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
index adf4e51..255a9c7 100644
--- a/include/linux/sysctl.h
+++ b/include/linux/sysctl.h
@@ -41,6 +41,8 @@ typedef int proc_handler (struct ctl_table *ctl, int write,
 
 extern int proc_dostring(struct ctl_table *, int,
 			 void __user *, size_t *, loff_t *);
+extern int proc_dobool(struct ctl_table *, int,
+			void __user *, size_t *, loff_t *);
 extern int proc_dointvec(struct ctl_table *, int,
 			 void __user *, size_t *, loff_t *);
 extern int proc_douintvec(struct ctl_table *, int,
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 706309f..c4bec65 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -2112,6 +2112,20 @@ static int proc_put_char(void __user **buf, size_t *size, char c)
 	return 0;
 }
 
+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;
+	}
+	return 0;
+}
+
 static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
 				 int *valp,
 				 int write, void *data)
@@ -2258,6 +2272,26 @@ static int do_proc_dointvec(struct ctl_table *table, int write,
 }
 
 /**
+ * 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 __user *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
  * @write: %TRUE if this is a write to the sysctl file
@@ -2885,6 +2919,12 @@ int proc_dostring(struct ctl_table *table, int write,
 	return -ENOSYS;
 }
 
+int proc_dobool(struct ctl_table *table, int write,
+                  void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+        return -ENOSYS;
+}
+
 int proc_dointvec(struct ctl_table *table, int write,
 		  void __user *buffer, size_t *lenp, loff_t *ppos)
 {
@@ -2941,6 +2981,7 @@ int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
  * 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);
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v5 2/2] lockd: change the proc_handler for nsm_use_hostnames
  2016-12-15  7:24 [PATCH v5 0/2] change the proc handler for nsm_use_hostnames Jia He
  2016-12-15  7:24 ` [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool Jia He
@ 2016-12-15  7:24 ` Jia He
  2016-12-15  8:11   ` Pan Xinhui
  2017-01-04  6:35 ` [PATCH v5 0/2] change the proc handler " hejianet
  2 siblings, 1 reply; 8+ messages in thread
From: Jia He @ 2016-12-15  7:24 UTC (permalink / raw)
  To: linux-nfs, linux-kernel
  Cc: Eric W. Biederman, Andrew Morton, Dmitry Torokhov, Serge Hallyn,
	David S. Miller, Alexey Dobriyan, Subash Abhinov Kasiviswanathan,
	Arnaldo Carvalho de Melo, Al Viro, Mel Gorman, Kees Cook,
	Hugh Dickins, Daniel Bristot de Oliveira, Daniel Cashman,
	Arnd Bergmann, J. Bruce Fields, Jeff Layton, Trond Myklebust,
	Anna Schumaker, Jia He

nsm_use_hostnames is a module parameter and it will be exported to sysctl
procfs. This is to let user sometimes change it from userspace. But the
minimal unit for sysctl procfs read/write it sizeof(int).
In big endian system, the converting from/to  bool to/from int will cause
error for proc items.

This patch use a new proc_handler proc_dobool to fixe it.

Signed-off-by: Jia He <hejianet@gmail.com>
---
 fs/lockd/svc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
index fc4084e..bd6fcf9 100644
--- a/fs/lockd/svc.c
+++ b/fs/lockd/svc.c
@@ -561,7 +561,7 @@ static struct ctl_table nlm_sysctls[] = {
 		.data		= &nsm_use_hostnames,
 		.maxlen		= sizeof(int),
 		.mode		= 0644,
-		.proc_handler	= proc_dointvec,
+		.proc_handler	= proc_dobool,
 	},
 	{
 		.procname	= "nsm_local_state",
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 2/2] lockd: change the proc_handler for nsm_use_hostnames
  2016-12-15  7:24 ` [PATCH v5 2/2] lockd: change the proc_handler for nsm_use_hostnames Jia He
@ 2016-12-15  8:11   ` Pan Xinhui
  0 siblings, 0 replies; 8+ messages in thread
From: Pan Xinhui @ 2016-12-15  8:11 UTC (permalink / raw)
  To: Jia He, linux-nfs, linux-kernel
  Cc: Eric W. Biederman, Andrew Morton, Dmitry Torokhov, Serge Hallyn,
	David S. Miller, Alexey Dobriyan, Subash Abhinov Kasiviswanathan,
	Arnaldo Carvalho de Melo, Al Viro, Mel Gorman, Kees Cook,
	Hugh Dickins, Daniel Bristot de Oliveira, Daniel Cashman,
	Arnd Bergmann, J. Bruce Fields, Jeff Layton, Trond Myklebust,
	Anna Schumaker



在 2016/12/15 15:24, Jia He 写道:
> nsm_use_hostnames is a module parameter and it will be exported to sysctl
> procfs. This is to let user sometimes change it from userspace. But the
> minimal unit for sysctl procfs read/write it sizeof(int).
					^^^is^^^
> In big endian system, the converting from/to  bool to/from int will cause
> error for proc items.
>
> This patch use a new proc_handler proc_dobool to fixe it.
						 ^^^fix^^^	
> Signed-off-by: Jia He <hejianet@gmail.com>
> ---
other than that is okay for me.

Reviewed-by: Pan Xinhui <xinhui.pan@linux.vnet.ibm.com>

>  fs/lockd/svc.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
> index fc4084e..bd6fcf9 100644
> --- a/fs/lockd/svc.c
> +++ b/fs/lockd/svc.c
> @@ -561,7 +561,7 @@ static struct ctl_table nlm_sysctls[] = {
>  		.data		= &nsm_use_hostnames,
>  		.maxlen		= sizeof(int),
>  		.mode		= 0644,
> -		.proc_handler	= proc_dointvec,
> +		.proc_handler	= proc_dobool,
>  	},
>  	{
>  		.procname	= "nsm_local_state",
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool
  2016-12-15  7:24 ` [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool Jia He
@ 2016-12-15  8:13   ` Pan Xinhui
  2017-01-04 21:09   ` J. Bruce Fields
  1 sibling, 0 replies; 8+ messages in thread
From: Pan Xinhui @ 2016-12-15  8:13 UTC (permalink / raw)
  To: Jia He, linux-nfs, linux-kernel
  Cc: Eric W. Biederman, Andrew Morton, Dmitry Torokhov, Serge Hallyn,
	David S. Miller, Alexey Dobriyan, Subash Abhinov Kasiviswanathan,
	Arnaldo Carvalho de Melo, Al Viro, Mel Gorman, Kees Cook,
	Hugh Dickins, Daniel Bristot de Oliveira, Daniel Cashman,
	Arnd Bergmann, J. Bruce Fields, Jeff Layton, Trond Myklebust,
	Anna Schumaker



在 2016/12/15 15:24, Jia He 写道:
> 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>
> ---
>  include/linux/sysctl.h |  2 ++
>  kernel/sysctl.c        | 41 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 43 insertions(+)
>

Reviewed-by: Pan Xinhui <xinhui.pan@linux.vnet.ibm.com>

> diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
> index adf4e51..255a9c7 100644
> --- a/include/linux/sysctl.h
> +++ b/include/linux/sysctl.h
> @@ -41,6 +41,8 @@ typedef int proc_handler (struct ctl_table *ctl, int write,
>
>  extern int proc_dostring(struct ctl_table *, int,
>  			 void __user *, size_t *, loff_t *);
> +extern int proc_dobool(struct ctl_table *, int,
> +			void __user *, size_t *, loff_t *);
>  extern int proc_dointvec(struct ctl_table *, int,
>  			 void __user *, size_t *, loff_t *);
>  extern int proc_douintvec(struct ctl_table *, int,
> diff --git a/kernel/sysctl.c b/kernel/sysctl.c
> index 706309f..c4bec65 100644
> --- a/kernel/sysctl.c
> +++ b/kernel/sysctl.c
> @@ -2112,6 +2112,20 @@ static int proc_put_char(void __user **buf, size_t *size, char c)
>  	return 0;
>  }
>
> +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;
> +	}
> +	return 0;
> +}
> +
>  static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
>  				 int *valp,
>  				 int write, void *data)
> @@ -2258,6 +2272,26 @@ static int do_proc_dointvec(struct ctl_table *table, int write,
>  }
>
>  /**
> + * 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 __user *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
>   * @write: %TRUE if this is a write to the sysctl file
> @@ -2885,6 +2919,12 @@ int proc_dostring(struct ctl_table *table, int write,
>  	return -ENOSYS;
>  }
>
> +int proc_dobool(struct ctl_table *table, int write,
> +                  void __user *buffer, size_t *lenp, loff_t *ppos)
> +{
> +        return -ENOSYS;
> +}
> +
>  int proc_dointvec(struct ctl_table *table, int write,
>  		  void __user *buffer, size_t *lenp, loff_t *ppos)
>  {
> @@ -2941,6 +2981,7 @@ int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
>   * 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);
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 0/2] change the proc handler for nsm_use_hostnames
  2016-12-15  7:24 [PATCH v5 0/2] change the proc handler for nsm_use_hostnames Jia He
  2016-12-15  7:24 ` [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool Jia He
  2016-12-15  7:24 ` [PATCH v5 2/2] lockd: change the proc_handler for nsm_use_hostnames Jia He
@ 2017-01-04  6:35 ` hejianet
  2 siblings, 0 replies; 8+ messages in thread
From: hejianet @ 2017-01-04  6:35 UTC (permalink / raw)
  To: linux-nfs, linux-kernel
  Cc: Eric W. Biederman, Andrew Morton, Dmitry Torokhov, Serge Hallyn,
	David S. Miller, Alexey Dobriyan, Subash Abhinov Kasiviswanathan,
	Arnaldo Carvalho de Melo, Al Viro, Mel Gorman, Kees Cook,
	Hugh Dickins, Daniel Bristot de Oliveira, Daniel Cashman,
	Arnd Bergmann, J. Bruce Fields, Jeff Layton, Trond Myklebust,
	Anna Schumaker

Ping, any comments are welcome. Thanks

B.R.

Jia


On 15/12/2016 3:24 PM, Jia He wrote:
> nsm_use_hostnames is a module parameter and it will be exported to sysctl
> procfs. This is to let user sometimes change it from userspace. But the
> minimal unit for sysctl procfs read/write it sizeof(int).
> In big endian system, the converting from/to  bool to/from int will cause
> error for proc items.
>
> This patch introduces a new proc handler proc_dobool for nsm_use_hostnames.
>
> Changes:
> v5: Fix compilation error when CONFIG_PROC_SYSCTL is not set
> v4: Change (u8 *) to (bool *)
> v3: Introduce a new proc handler proc_dou8vec(suggested by Xinhui Pan)
> v2: Change extern type in lockd.h
>
> The test case I used:
> /***************************************************************/
> #include <linux/kernel.h>
> #include <linux/module.h>
> #include <linux/sysctl.h>
>
> bool __read_mostly nsm_use_hostnames;
> module_param(nsm_use_hostnames, bool, 0644);
>
> static struct ctl_table my_sysctl[] = {
>          {
>                  .procname       = "nsm_use_hostnames",
>                  .data           = &nsm_use_hostnames,
>                  .maxlen         = sizeof(int),
>                  .mode           = 0644,
>                  .proc_handler   = &proc_dointvec,
>          },
>          {}
> };
>
> static struct ctl_table my_root[] = {
>          {
>          .procname       = "mysysctl",
>          .mode           = 0555,
>          .child          = my_sysctl,
>          },
>          {}
> };
>
> static struct ctl_table_header * my_ctl_header;
>
> static int __init sysctl_exam_init(void)
> {
>          my_ctl_header = register_sysctl_table(&my_root);
>          if (my_ctl_header == NULL)
>                  printk("error regiester sysctl");
>
>          return 0;
> }
>
> static void __exit sysctl_exam_exit(void)
> {
>          unregister_sysctl_table(my_ctl_header);
> }
>
> module_init(sysctl_exam_init);
> module_exit(sysctl_exam_exit);
> MODULE_LICENSE("GPL");
> /****************************************************************/
>
> [root@bigendian my]# insmod -f /root/my/hello.ko nsm_use_hostnames=1
> [root@bigendian my]# cat /proc/sys/mysysctl/nsm_use_hostnames
> 16777216
>
> After I change the proc_dointvec to new handler proc_dou8vec with the
> patch:
> [root@bigendian my]# insmod -f /root/my/hello.ko nsm_use_hostnames=1
> [root@bigendian my]# cat /proc/sys/mysysctl/nsm_use_hostnames
> 1
>
> In little endian system, there is no such issue.
> Already tested in both of big and little endian(ppc64 and ppc64le)
>
> Jia He (2):
>    sysctl: introduce new proc handler proc_dobool
>    lockd: change the proc_handler for nsm_use_hostnames
>
>   fs/lockd/svc.c         |  2 +-
>   include/linux/sysctl.h |  2 ++
>   kernel/sysctl.c        | 41 +++++++++++++++++++++++++++++++++++++++++
>   3 files changed, 44 insertions(+), 1 deletion(-)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool
  2016-12-15  7:24 ` [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool Jia He
  2016-12-15  8:13   ` Pan Xinhui
@ 2017-01-04 21:09   ` J. Bruce Fields
  2017-01-05  2:45     ` hejianet
  1 sibling, 1 reply; 8+ messages in thread
From: J. Bruce Fields @ 2017-01-04 21:09 UTC (permalink / raw)
  To: Jia He
  Cc: linux-nfs, linux-kernel, Eric W. Biederman, Andrew Morton,
	Dmitry Torokhov, Serge Hallyn, David S. Miller, Alexey Dobriyan,
	Subash Abhinov Kasiviswanathan, Arnaldo Carvalho de Melo,
	Al Viro, Mel Gorman, Kees Cook, Hugh Dickins,
	Daniel Bristot de Oliveira, Daniel Cashman, Arnd Bergmann,
	Jeff Layton, Trond Myklebust, Anna Schumaker

On Thu, Dec 15, 2016 at 03:24:20PM +0800, Jia He wrote:
> 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.

Did Alexey Debriyan agree that this dealt with his objections?

Also it'd be nice to have a sign-off from somebody that's actually
touched sysctl.c.  Then I could take it through the nfsd tree if that
doesn't cause anyone trouble.

--b.

> 
> Suggested-by: Pan Xinhui <xinhui@linux.vnet.ibm.com>
> Signed-off-by: Jia He <hejianet@gmail.com>
> ---
>  include/linux/sysctl.h |  2 ++
>  kernel/sysctl.c        | 41 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 43 insertions(+)
> 
> diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
> index adf4e51..255a9c7 100644
> --- a/include/linux/sysctl.h
> +++ b/include/linux/sysctl.h
> @@ -41,6 +41,8 @@ typedef int proc_handler (struct ctl_table *ctl, int write,
>  
>  extern int proc_dostring(struct ctl_table *, int,
>  			 void __user *, size_t *, loff_t *);
> +extern int proc_dobool(struct ctl_table *, int,
> +			void __user *, size_t *, loff_t *);
>  extern int proc_dointvec(struct ctl_table *, int,
>  			 void __user *, size_t *, loff_t *);
>  extern int proc_douintvec(struct ctl_table *, int,
> diff --git a/kernel/sysctl.c b/kernel/sysctl.c
> index 706309f..c4bec65 100644
> --- a/kernel/sysctl.c
> +++ b/kernel/sysctl.c
> @@ -2112,6 +2112,20 @@ static int proc_put_char(void __user **buf, size_t *size, char c)
>  	return 0;
>  }
>  
> +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;
> +	}
> +	return 0;
> +}
> +
>  static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
>  				 int *valp,
>  				 int write, void *data)
> @@ -2258,6 +2272,26 @@ static int do_proc_dointvec(struct ctl_table *table, int write,
>  }
>  
>  /**
> + * 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 __user *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
>   * @write: %TRUE if this is a write to the sysctl file
> @@ -2885,6 +2919,12 @@ int proc_dostring(struct ctl_table *table, int write,
>  	return -ENOSYS;
>  }
>  
> +int proc_dobool(struct ctl_table *table, int write,
> +                  void __user *buffer, size_t *lenp, loff_t *ppos)
> +{
> +        return -ENOSYS;
> +}
> +
>  int proc_dointvec(struct ctl_table *table, int write,
>  		  void __user *buffer, size_t *lenp, loff_t *ppos)
>  {
> @@ -2941,6 +2981,7 @@ int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
>   * 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);
> -- 
> 2.5.5

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool
  2017-01-04 21:09   ` J. Bruce Fields
@ 2017-01-05  2:45     ` hejianet
  0 siblings, 0 replies; 8+ messages in thread
From: hejianet @ 2017-01-05  2:45 UTC (permalink / raw)
  To: Alexey Dobriyan
  Cc: J. Bruce Fields, linux-nfs, linux-kernel, Eric W. Biederman,
	Andrew Morton, Dmitry Torokhov, Serge Hallyn, David S. Miller,
	Subash Abhinov Kasiviswanathan, Arnaldo Carvalho de Melo,
	Al Viro, Mel Gorman, Kees Cook, Hugh Dickins,
	Daniel Bristot de Oliveira, Daniel Cashman, Arnd Bergmann,
	Jeff Layton, Trond Myklebust, Anna Schumaker



On 05/01/2017 5:09 AM, J. Bruce Fields wrote:
> On Thu, Dec 15, 2016 at 03:24:20PM +0800, Jia He wrote:
>> 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.
> Did Alexey Debriyan agree that this dealt with his objections?
Hi Alexey, any thoughts? ;-)
Thanks

B.R.
Jia
> Also it'd be nice to have a sign-off from somebody that's actually
> touched sysctl.c.  Then I could take it through the nfsd tree if that
> doesn't cause anyone trouble.
>
> --b.
>
>> Suggested-by: Pan Xinhui <xinhui@linux.vnet.ibm.com>
>> Signed-off-by: Jia He <hejianet@gmail.com>
>> ---
>>   include/linux/sysctl.h |  2 ++
>>   kernel/sysctl.c        | 41 +++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 43 insertions(+)
>>
>> diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
>> index adf4e51..255a9c7 100644
>> --- a/include/linux/sysctl.h
>> +++ b/include/linux/sysctl.h
>> @@ -41,6 +41,8 @@ typedef int proc_handler (struct ctl_table *ctl, int write,
>>   
>>   extern int proc_dostring(struct ctl_table *, int,
>>   			 void __user *, size_t *, loff_t *);
>> +extern int proc_dobool(struct ctl_table *, int,
>> +			void __user *, size_t *, loff_t *);
>>   extern int proc_dointvec(struct ctl_table *, int,
>>   			 void __user *, size_t *, loff_t *);
>>   extern int proc_douintvec(struct ctl_table *, int,
>> diff --git a/kernel/sysctl.c b/kernel/sysctl.c
>> index 706309f..c4bec65 100644
>> --- a/kernel/sysctl.c
>> +++ b/kernel/sysctl.c
>> @@ -2112,6 +2112,20 @@ static int proc_put_char(void __user **buf, size_t *size, char c)
>>   	return 0;
>>   }
>>   
>> +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;
>> +	}
>> +	return 0;
>> +}
>> +
>>   static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
>>   				 int *valp,
>>   				 int write, void *data)
>> @@ -2258,6 +2272,26 @@ static int do_proc_dointvec(struct ctl_table *table, int write,
>>   }
>>   
>>   /**
>> + * 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 __user *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
>>    * @write: %TRUE if this is a write to the sysctl file
>> @@ -2885,6 +2919,12 @@ int proc_dostring(struct ctl_table *table, int write,
>>   	return -ENOSYS;
>>   }
>>   
>> +int proc_dobool(struct ctl_table *table, int write,
>> +                  void __user *buffer, size_t *lenp, loff_t *ppos)
>> +{
>> +        return -ENOSYS;
>> +}
>> +
>>   int proc_dointvec(struct ctl_table *table, int write,
>>   		  void __user *buffer, size_t *lenp, loff_t *ppos)
>>   {
>> @@ -2941,6 +2981,7 @@ int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
>>    * 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);
>> -- 
>> 2.5.5

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2017-01-05  2:46 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-15  7:24 [PATCH v5 0/2] change the proc handler for nsm_use_hostnames Jia He
2016-12-15  7:24 ` [PATCH v5 1/2] sysctl: introduce new proc handler proc_dobool Jia He
2016-12-15  8:13   ` Pan Xinhui
2017-01-04 21:09   ` J. Bruce Fields
2017-01-05  2:45     ` hejianet
2016-12-15  7:24 ` [PATCH v5 2/2] lockd: change the proc_handler for nsm_use_hostnames Jia He
2016-12-15  8:11   ` Pan Xinhui
2017-01-04  6:35 ` [PATCH v5 0/2] change the proc handler " hejianet

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).