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 changes the type definition of nsm_use_hostnames.
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 bool to int:
[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.
Jia He (1):
lockd: Change nsm_use_hostnames from bool to u32
fs/lockd/mon.c | 2 +-
fs/lockd/svc.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
--
2.5.5
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 changes the type definition of nsm_use_hostnames.
Signed-off-by: Jia He <[email protected]>
---
fs/lockd/mon.c | 2 +-
fs/lockd/svc.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c
index 19166d4..3e7ff4d 100644
--- a/fs/lockd/mon.c
+++ b/fs/lockd/mon.c
@@ -57,7 +57,7 @@ static DEFINE_SPINLOCK(nsm_lock);
* Local NSM state
*/
u32 __read_mostly nsm_local_state;
-bool __read_mostly nsm_use_hostnames;
+u32 __read_mostly nsm_use_hostnames;
static inline struct sockaddr *nsm_addr(const struct nsm_handle *nsm)
{
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
index fc4084e..308033d 100644
--- a/fs/lockd/svc.c
+++ b/fs/lockd/svc.c
@@ -658,7 +658,7 @@ module_param_call(nlm_udpport, param_set_port, param_get_int,
&nlm_udpport, 0644);
module_param_call(nlm_tcpport, param_set_port, param_get_int,
&nlm_tcpport, 0644);
-module_param(nsm_use_hostnames, bool, 0644);
+module_param(nsm_use_hostnames, u32, 0644);
module_param(nlm_max_connections, uint, 0644);
static int lockd_init_net(struct net *net)
--
2.5.5
Hi Jia,
[auto build test ERROR on nfsd/nfsd-next]
[also build test ERROR on v4.9-rc8 next-20161209]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Jia-He/lockd-Change-nsm_use_hostnames-from-bool-to-u32/20161211-225133
base: git://linux-nfs.org/~bfields/linux.git nfsd-next
config: i386-randconfig-x006-201650 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All error/warnings (new ones prefixed by >>):
In file included from include/linux/module.h:18:0,
from fs/lockd/svc.c:15:
>> include/linux/moduleparam.h:146:27: error: expected ')' before '&' token
param_check_##type(name, &(value)); \
^
>> include/linux/moduleparam.h:126:2: note: in expansion of macro 'module_param_named'
module_param_named(name, name, type, perm)
^~~~~~~~~~~~~~~~~~
>> fs/lockd/svc.c:661:1: note: in expansion of macro 'module_param'
module_param(nsm_use_hostnames, u32, 0644);
^~~~~~~~~~~~
>> include/linux/moduleparam.h:147:25: error: 'param_ops_u32' undeclared here (not in a function)
module_param_cb(name, ¶m_ops_##type, &value, perm); \
^
include/linux/moduleparam.h:224:39: note: in definition of macro '__module_param_call'
= { __param_str_##name, THIS_MODULE, ops, \
^~~
>> include/linux/moduleparam.h:147:2: note: in expansion of macro 'module_param_cb'
module_param_cb(name, ¶m_ops_##type, &value, perm); \
^~~~~~~~~~~~~~~
>> include/linux/moduleparam.h:126:2: note: in expansion of macro 'module_param_named'
module_param_named(name, name, type, perm)
^~~~~~~~~~~~~~~~~~
>> fs/lockd/svc.c:661:1: note: in expansion of macro 'module_param'
module_param(nsm_use_hostnames, u32, 0644);
^~~~~~~~~~~~
--
>> fs/lockd/mon.c:60:20: error: conflicting types for 'nsm_use_hostnames'
u32 __read_mostly nsm_use_hostnames;
^~~~~~~~~~~~~~~~~
In file included from fs/lockd/mon.c:18:0:
include/linux/lockd/lockd.h:199:15: note: previous declaration of 'nsm_use_hostnames' was here
extern bool nsm_use_hostnames;
^~~~~~~~~~~~~~~~~
vim +/nsm_use_hostnames +60 fs/lockd/mon.c
54 static DEFINE_SPINLOCK(nsm_lock);
55
56 /*
57 * Local NSM state
58 */
59 u32 __read_mostly nsm_local_state;
> 60 u32 __read_mostly nsm_use_hostnames;
61
62 static inline struct sockaddr *nsm_addr(const struct nsm_handle *nsm)
63 {
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation