1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or https://opensource.org/licenses/CDDL-1.0.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (C) 2016 Gvozden Neskovic <neskovic@gmail.com>.
24  * Copyright (c) 2020 by Delphix. All rights reserved.
25  */
26 
27 #ifndef _MOD_COMPAT_H
28 #define	_MOD_COMPAT_H
29 
30 #include <linux/module.h>
31 #include <linux/moduleparam.h>
32 
33 /* Grsecurity kernel API change */
34 #ifdef MODULE_PARAM_CALL_CONST
35 typedef const struct kernel_param zfs_kernel_param_t;
36 #else
37 typedef struct kernel_param zfs_kernel_param_t;
38 #endif
39 
40 #define	ZMOD_RW 0644
41 #define	ZMOD_RD 0444
42 
43 #define	INT int
44 #define	LONG long
45 /* BEGIN CSTYLED */
46 #define	UINT uint
47 #define	ULONG ulong
48 /* END CSTYLED */
49 #define	STRING charp
50 
51 enum scope_prefix_types {
52 	zfs,
53 	zfs_arc,
54 	zfs_condense,
55 	zfs_dbuf,
56 	zfs_dbuf_cache,
57 	zfs_deadman,
58 	zfs_dedup,
59 	zfs_l2arc,
60 	zfs_livelist,
61 	zfs_livelist_condense,
62 	zfs_lua,
63 	zfs_metaslab,
64 	zfs_mg,
65 	zfs_multihost,
66 	zfs_prefetch,
67 	zfs_reconstruct,
68 	zfs_recv,
69 	zfs_send,
70 	zfs_spa,
71 	zfs_trim,
72 	zfs_txg,
73 	zfs_vdev,
74 	zfs_vdev_cache,
75 	zfs_vdev_file,
76 	zfs_vdev_mirror,
77 	zfs_vnops,
78 	zfs_zevent,
79 	zfs_zio,
80 	zfs_zil
81 };
82 
83 /*
84  * Declare a module parameter / sysctl node
85  *
86  * "scope_prefix" the part of the sysctl / sysfs tree the node resides under
87  *   (currently a no-op on Linux)
88  * "name_prefix" the part of the variable name that will be excluded from the
89  *   exported names on platforms with a hierarchical namespace
90  * "name" the part of the variable that will be exposed on platforms with a
91  *    hierarchical namespace, or as name_prefix ## name on Linux
92  * "type" the variable type
93  * "perm" the permissions (read/write or read only)
94  * "desc" a brief description of the option
95  *
96  * Examples:
97  * ZFS_MODULE_PARAM(zfs_vdev_mirror, zfs_vdev_mirror_, rotating_inc, UINT,
98  * 	ZMOD_RW, "Rotating media load increment for non-seeking I/O's");
99  * on FreeBSD:
100  *   vfs.zfs.vdev.mirror.rotating_inc
101  * on Linux:
102  *   zfs_vdev_mirror_rotating_inc
103  *
104  * ZFS_MODULE_PARAM(zfs, , dmu_prefetch_max, UINT, ZMOD_RW,
105  * 	"Limit one prefetch call to this size");
106  * on FreeBSD:
107  *   vfs.zfs.dmu_prefetch_max
108  * on Linux:
109  *   dmu_prefetch_max
110  */
111 #define	ZFS_MODULE_PARAM(scope_prefix, name_prefix, name, type, perm, desc) \
112 	_Static_assert( \
113 	    sizeof (scope_prefix) == sizeof (enum scope_prefix_types), \
114 	    "" #scope_prefix " size mismatch with enum scope_prefix_types"); \
115 	module_param(name_prefix ## name, type, perm); \
116 	MODULE_PARM_DESC(name_prefix ## name, desc)
117 
118 /*
119  * Declare a module parameter / sysctl node
120  *
121  * "scope_prefix" the part of the the sysctl / sysfs tree the node resides under
122  *   (currently a no-op on Linux)
123  * "name_prefix" the part of the variable name that will be excluded from the
124  *   exported names on platforms with a hierarchical namespace
125  * "name" the part of the variable that will be exposed on platforms with a
126  *    hierarchical namespace, or as name_prefix ## name on Linux
127  * "setfunc" setter function
128  * "getfunc" getter function
129  * "perm" the permissions (read/write or read only)
130  * "desc" a brief description of the option
131  *
132  * Examples:
133  * ZFS_MODULE_PARAM_CALL(zfs_spa, spa_, slop_shift, param_set_slop_shift,
134  * 	param_get_int, ZMOD_RW, "Reserved free space in pool");
135  * on FreeBSD:
136  *   vfs.zfs.spa_slop_shift
137  * on Linux:
138  *   spa_slop_shift
139  */
140 #define	ZFS_MODULE_PARAM_CALL( \
141     scope_prefix, name_prefix, name, setfunc, getfunc, perm, desc) \
142 	_Static_assert( \
143 	    sizeof (scope_prefix) == sizeof (enum scope_prefix_types), \
144 	    "" #scope_prefix " size mismatch with enum scope_prefix_types"); \
145 	module_param_call(name_prefix ## name, setfunc, getfunc, \
146 	    &name_prefix ## name, perm); \
147 	MODULE_PARM_DESC(name_prefix ## name, desc)
148 
149 /*
150  * As above, but there is no variable with the name name_prefix ## name,
151  * so NULL is passed to module_param_call instead.
152  */
153 #define	ZFS_MODULE_VIRTUAL_PARAM_CALL( \
154     scope_prefix, name_prefix, name, setfunc, getfunc, perm, desc) \
155 	_Static_assert( \
156 	    sizeof (scope_prefix) == sizeof (enum scope_prefix_types), \
157 	    "" #scope_prefix " size mismatch with enum scope_prefix_types"); \
158 	module_param_call(name_prefix ## name, setfunc, getfunc, NULL, perm); \
159 	MODULE_PARM_DESC(name_prefix ## name, desc)
160 
161 #define	ZFS_MODULE_PARAM_ARGS	const char *buf, zfs_kernel_param_t *kp
162 
163 #endif	/* _MOD_COMPAT_H */
164