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