1eda14cbcSMatt Macy /* 2eda14cbcSMatt Macy * Copyright (c) 2020 iXsystems, Inc. 3eda14cbcSMatt Macy * All rights reserved. 4eda14cbcSMatt Macy * 5eda14cbcSMatt Macy * Redistribution and use in source and binary forms, with or without 6eda14cbcSMatt Macy * modification, are permitted provided that the following conditions 7eda14cbcSMatt Macy * are met: 8eda14cbcSMatt Macy * 1. Redistributions of source code must retain the above copyright 9eda14cbcSMatt Macy * notice, this list of conditions and the following disclaimer. 10eda14cbcSMatt Macy * 2. Redistributions in binary form must reproduce the above copyright 11eda14cbcSMatt Macy * notice, this list of conditions and the following disclaimer in the 12eda14cbcSMatt Macy * documentation and/or other materials provided with the distribution. 13eda14cbcSMatt Macy * 14eda14cbcSMatt Macy * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15eda14cbcSMatt Macy * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16eda14cbcSMatt Macy * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17eda14cbcSMatt Macy * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18eda14cbcSMatt Macy * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19eda14cbcSMatt Macy * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20eda14cbcSMatt Macy * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21eda14cbcSMatt Macy * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22eda14cbcSMatt Macy * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23eda14cbcSMatt Macy * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24eda14cbcSMatt Macy * SUCH DAMAGE. 25eda14cbcSMatt Macy * 26eda14cbcSMatt Macy */ 27eda14cbcSMatt Macy 28eda14cbcSMatt Macy #include <sys/types.h> 29eda14cbcSMatt Macy #include <sys/param.h> 30eda14cbcSMatt Macy #include <sys/systm.h> 31eda14cbcSMatt Macy #include <sys/conf.h> 32eda14cbcSMatt Macy #include <sys/kernel.h> 33eda14cbcSMatt Macy #include <sys/lock.h> 34eda14cbcSMatt Macy #include <sys/malloc.h> 35eda14cbcSMatt Macy #include <sys/mutex.h> 36eda14cbcSMatt Macy #include <sys/proc.h> 37eda14cbcSMatt Macy #include <sys/errno.h> 38eda14cbcSMatt Macy #include <sys/uio.h> 39eda14cbcSMatt Macy #include <sys/buf.h> 40eda14cbcSMatt Macy #include <sys/file.h> 41eda14cbcSMatt Macy #include <sys/kmem.h> 42eda14cbcSMatt Macy #include <sys/conf.h> 43eda14cbcSMatt Macy #include <sys/cmn_err.h> 44eda14cbcSMatt Macy #include <sys/stat.h> 45eda14cbcSMatt Macy #include <sys/zfs_ioctl.h> 46eda14cbcSMatt Macy #include <sys/zfs_vfsops.h> 47eda14cbcSMatt Macy #include <sys/zfs_znode.h> 48eda14cbcSMatt Macy #include <sys/zap.h> 49eda14cbcSMatt Macy #include <sys/spa.h> 50eda14cbcSMatt Macy #include <sys/spa_impl.h> 51eda14cbcSMatt Macy #include <sys/vdev.h> 52eda14cbcSMatt Macy #include <sys/vdev_impl.h> 53c7046f76SMartin Matuska #include <sys/arc_os.h> 54eda14cbcSMatt Macy #include <sys/dmu.h> 55eda14cbcSMatt Macy #include <sys/dsl_dir.h> 56eda14cbcSMatt Macy #include <sys/dsl_dataset.h> 57eda14cbcSMatt Macy #include <sys/dsl_prop.h> 58eda14cbcSMatt Macy #include <sys/dsl_deleg.h> 59eda14cbcSMatt Macy #include <sys/dmu_objset.h> 60eda14cbcSMatt Macy #include <sys/dmu_impl.h> 61eda14cbcSMatt Macy #include <sys/dmu_tx.h> 62eda14cbcSMatt Macy #include <sys/sunddi.h> 63eda14cbcSMatt Macy #include <sys/policy.h> 64eda14cbcSMatt Macy #include <sys/zone.h> 65eda14cbcSMatt Macy #include <sys/nvpair.h> 66eda14cbcSMatt Macy #include <sys/mount.h> 67eda14cbcSMatt Macy #include <sys/taskqueue.h> 68eda14cbcSMatt Macy #include <sys/sdt.h> 69eda14cbcSMatt Macy #include <sys/fs/zfs.h> 70eda14cbcSMatt Macy #include <sys/zfs_ctldir.h> 71eda14cbcSMatt Macy #include <sys/zfs_dir.h> 72eda14cbcSMatt Macy #include <sys/zfs_onexit.h> 73eda14cbcSMatt Macy #include <sys/zvol.h> 74eda14cbcSMatt Macy #include <sys/dsl_scan.h> 75eda14cbcSMatt Macy #include <sys/dmu_objset.h> 76eda14cbcSMatt Macy #include <sys/dmu_send.h> 77eda14cbcSMatt Macy #include <sys/dsl_destroy.h> 78eda14cbcSMatt Macy #include <sys/dsl_bookmark.h> 79eda14cbcSMatt Macy #include <sys/dsl_userhold.h> 80eda14cbcSMatt Macy #include <sys/zfeature.h> 81eda14cbcSMatt Macy #include <sys/zcp.h> 82eda14cbcSMatt Macy #include <sys/zio_checksum.h> 83eda14cbcSMatt Macy #include <sys/vdev_removal.h> 84eda14cbcSMatt Macy #include <sys/dsl_crypt.h> 85eda14cbcSMatt Macy 86eda14cbcSMatt Macy #include <sys/zfs_ioctl_compat.h> 87eda14cbcSMatt Macy #include <sys/zfs_context.h> 88eda14cbcSMatt Macy 89eda14cbcSMatt Macy #include <sys/arc_impl.h> 90eda14cbcSMatt Macy #include <sys/dsl_pool.h> 91eda14cbcSMatt Macy 92c7046f76SMartin Matuska #include <sys/vmmeter.h> 93eda14cbcSMatt Macy 94eda14cbcSMatt Macy SYSCTL_DECL(_vfs_zfs); 95c03c5b1cSMartin Matuska SYSCTL_NODE(_vfs_zfs, OID_AUTO, arc, CTLFLAG_RW, 0, 96c03c5b1cSMartin Matuska "ZFS adaptive replacement cache"); 972a58b312SMartin Matuska SYSCTL_NODE(_vfs_zfs, OID_AUTO, brt, CTLFLAG_RW, 0, 982a58b312SMartin Matuska "ZFS Block Reference Table"); 99eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, condense, CTLFLAG_RW, 0, "ZFS condense"); 100eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, dbuf, CTLFLAG_RW, 0, "ZFS disk buf cache"); 101c03c5b1cSMartin Matuska SYSCTL_NODE(_vfs_zfs, OID_AUTO, dbuf_cache, CTLFLAG_RW, 0, 102c03c5b1cSMartin Matuska "ZFS disk buf cache"); 103eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, deadman, CTLFLAG_RW, 0, "ZFS deadman"); 104eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, dedup, CTLFLAG_RW, 0, "ZFS dedup"); 105eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, l2arc, CTLFLAG_RW, 0, "ZFS l2arc"); 106eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, livelist, CTLFLAG_RW, 0, "ZFS livelist"); 107eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, lua, CTLFLAG_RW, 0, "ZFS lua"); 108eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, metaslab, CTLFLAG_RW, 0, "ZFS metaslab"); 109eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, mg, CTLFLAG_RW, 0, "ZFS metaslab group"); 110c03c5b1cSMartin Matuska SYSCTL_NODE(_vfs_zfs, OID_AUTO, multihost, CTLFLAG_RW, 0, 111c03c5b1cSMartin Matuska "ZFS multihost protection"); 112eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, prefetch, CTLFLAG_RW, 0, "ZFS prefetch"); 113eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, reconstruct, CTLFLAG_RW, 0, "ZFS reconstruct"); 114eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, recv, CTLFLAG_RW, 0, "ZFS receive"); 115eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, send, CTLFLAG_RW, 0, "ZFS send"); 116eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, spa, CTLFLAG_RW, 0, "ZFS space allocation"); 117eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, trim, CTLFLAG_RW, 0, "ZFS TRIM"); 118eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, txg, CTLFLAG_RW, 0, "ZFS transaction group"); 119eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, vdev, CTLFLAG_RW, 0, "ZFS VDEV"); 1207877fdebSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, vnops, CTLFLAG_RW, 0, "ZFS VNOPS"); 121eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, zevent, CTLFLAG_RW, 0, "ZFS event"); 122eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, zil, CTLFLAG_RW, 0, "ZFS ZIL"); 123eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, zio, CTLFLAG_RW, 0, "ZFS ZIO"); 124eda14cbcSMatt Macy 125eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs_livelist, OID_AUTO, condense, CTLFLAG_RW, 0, 126eda14cbcSMatt Macy "ZFS livelist condense"); 1272c48331dSMatt Macy SYSCTL_NODE(_vfs_zfs_vdev, OID_AUTO, file, CTLFLAG_RW, 0, "ZFS VDEV file"); 128eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs_vdev, OID_AUTO, mirror, CTLFLAG_RD, 0, 129eda14cbcSMatt Macy "ZFS VDEV mirror"); 130eda14cbcSMatt Macy 131eda14cbcSMatt Macy SYSCTL_DECL(_vfs_zfs_version); 132eda14cbcSMatt Macy SYSCTL_CONST_STRING(_vfs_zfs_version, OID_AUTO, module, CTLFLAG_RD, 133eda14cbcSMatt Macy (ZFS_META_VERSION "-" ZFS_META_RELEASE), "OpenZFS module version"); 134eda14cbcSMatt Macy 135eda14cbcSMatt Macy /* arc.c */ 136eda14cbcSMatt Macy 1372faf504dSMartin Matuska int 138dbd5678dSMartin Matuska param_set_arc_u64(SYSCTL_HANDLER_ARGS) 139eda14cbcSMatt Macy { 140eda14cbcSMatt Macy int err; 141eda14cbcSMatt Macy 142dbd5678dSMartin Matuska err = sysctl_handle_64(oidp, arg1, 0, req); 143eda14cbcSMatt Macy if (err != 0 || req->newptr == NULL) 144eda14cbcSMatt Macy return (err); 145eda14cbcSMatt Macy 146eda14cbcSMatt Macy arc_tuning_update(B_TRUE); 147eda14cbcSMatt Macy 148eda14cbcSMatt Macy return (0); 149eda14cbcSMatt Macy } 150eda14cbcSMatt Macy 151eda14cbcSMatt Macy int 152eda14cbcSMatt Macy param_set_arc_int(SYSCTL_HANDLER_ARGS) 153eda14cbcSMatt Macy { 154eda14cbcSMatt Macy int err; 155eda14cbcSMatt Macy 156eda14cbcSMatt Macy err = sysctl_handle_int(oidp, arg1, 0, req); 157eda14cbcSMatt Macy if (err != 0 || req->newptr == NULL) 158eda14cbcSMatt Macy return (err); 159eda14cbcSMatt Macy 160eda14cbcSMatt Macy arc_tuning_update(B_TRUE); 161eda14cbcSMatt Macy 162eda14cbcSMatt Macy return (0); 163eda14cbcSMatt Macy } 164eda14cbcSMatt Macy 165c7046f76SMartin Matuska int 166c7046f76SMartin Matuska param_set_arc_max(SYSCTL_HANDLER_ARGS) 167c7046f76SMartin Matuska { 168c7046f76SMartin Matuska unsigned long val; 169c7046f76SMartin Matuska int err; 170c7046f76SMartin Matuska 171c7046f76SMartin Matuska val = zfs_arc_max; 172dbd5678dSMartin Matuska err = sysctl_handle_64(oidp, &val, 0, req); 173c7046f76SMartin Matuska if (err != 0 || req->newptr == NULL) 174c7046f76SMartin Matuska return (SET_ERROR(err)); 175c7046f76SMartin Matuska 176c7046f76SMartin Matuska if (val != 0 && (val < MIN_ARC_MAX || val <= arc_c_min || 177c7046f76SMartin Matuska val >= arc_all_memory())) 178c7046f76SMartin Matuska return (SET_ERROR(EINVAL)); 179c7046f76SMartin Matuska 180c7046f76SMartin Matuska zfs_arc_max = val; 181c7046f76SMartin Matuska arc_tuning_update(B_TRUE); 182c7046f76SMartin Matuska 183c7046f76SMartin Matuska /* Update the sysctl to the tuned value */ 184c7046f76SMartin Matuska if (val != 0) 185c7046f76SMartin Matuska zfs_arc_max = arc_c_max; 186c7046f76SMartin Matuska 187c7046f76SMartin Matuska return (0); 188c7046f76SMartin Matuska } 189c7046f76SMartin Matuska 190c7046f76SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_max, 191c7046f76SMartin Matuska CTLTYPE_ULONG | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 192c7046f76SMartin Matuska NULL, 0, param_set_arc_max, "LU", 193c7046f76SMartin Matuska "Maximum ARC size in bytes (LEGACY)"); 194c7046f76SMartin Matuska 195c7046f76SMartin Matuska int 196c7046f76SMartin Matuska param_set_arc_min(SYSCTL_HANDLER_ARGS) 197c7046f76SMartin Matuska { 198c7046f76SMartin Matuska unsigned long val; 199c7046f76SMartin Matuska int err; 200c7046f76SMartin Matuska 201c7046f76SMartin Matuska val = zfs_arc_min; 202dbd5678dSMartin Matuska err = sysctl_handle_64(oidp, &val, 0, req); 203c7046f76SMartin Matuska if (err != 0 || req->newptr == NULL) 204c7046f76SMartin Matuska return (SET_ERROR(err)); 205c7046f76SMartin Matuska 206c7046f76SMartin Matuska if (val != 0 && (val < 2ULL << SPA_MAXBLOCKSHIFT || val > arc_c_max)) 207c7046f76SMartin Matuska return (SET_ERROR(EINVAL)); 208c7046f76SMartin Matuska 209c7046f76SMartin Matuska zfs_arc_min = val; 210c7046f76SMartin Matuska arc_tuning_update(B_TRUE); 211c7046f76SMartin Matuska 212c7046f76SMartin Matuska /* Update the sysctl to the tuned value */ 213c7046f76SMartin Matuska if (val != 0) 214c7046f76SMartin Matuska zfs_arc_min = arc_c_min; 215c7046f76SMartin Matuska 216c7046f76SMartin Matuska return (0); 217c7046f76SMartin Matuska } 218c7046f76SMartin Matuska 219c40487d4SMatt Macy SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_min, 220c40487d4SMatt Macy CTLTYPE_ULONG | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 221c7046f76SMartin Matuska NULL, 0, param_set_arc_min, "LU", 222c7046f76SMartin Matuska "Minimum ARC size in bytes (LEGACY)"); 223c7046f76SMartin Matuska 224c7046f76SMartin Matuska extern uint_t zfs_arc_free_target; 225c7046f76SMartin Matuska 226c7046f76SMartin Matuska int 227c7046f76SMartin Matuska param_set_arc_free_target(SYSCTL_HANDLER_ARGS) 228c7046f76SMartin Matuska { 229c7046f76SMartin Matuska uint_t val; 230c7046f76SMartin Matuska int err; 231c7046f76SMartin Matuska 232c7046f76SMartin Matuska val = zfs_arc_free_target; 233c7046f76SMartin Matuska err = sysctl_handle_int(oidp, &val, 0, req); 234c7046f76SMartin Matuska if (err != 0 || req->newptr == NULL) 235c7046f76SMartin Matuska return (err); 236c7046f76SMartin Matuska 237c7046f76SMartin Matuska if (val < minfree) 238c7046f76SMartin Matuska return (EINVAL); 239c7046f76SMartin Matuska if (val > vm_cnt.v_page_count) 240c7046f76SMartin Matuska return (EINVAL); 241c7046f76SMartin Matuska 242c7046f76SMartin Matuska zfs_arc_free_target = val; 243c7046f76SMartin Matuska 244c7046f76SMartin Matuska return (0); 245c7046f76SMartin Matuska } 246c7046f76SMartin Matuska 247c7046f76SMartin Matuska /* 248c7046f76SMartin Matuska * NOTE: This sysctl is CTLFLAG_RW not CTLFLAG_RWTUN due to its dependency on 249c7046f76SMartin Matuska * pagedaemon initialization. 250c7046f76SMartin Matuska */ 251c7046f76SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_free_target, 252c7046f76SMartin Matuska CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, 253c7046f76SMartin Matuska NULL, 0, param_set_arc_free_target, "IU", 254c7046f76SMartin Matuska "Desired number of free pages below which ARC triggers reclaim" 255c7046f76SMartin Matuska " (LEGACY)"); 256c7046f76SMartin Matuska 257c7046f76SMartin Matuska int 258c7046f76SMartin Matuska param_set_arc_no_grow_shift(SYSCTL_HANDLER_ARGS) 259c7046f76SMartin Matuska { 260c7046f76SMartin Matuska int err, val; 261c7046f76SMartin Matuska 262c7046f76SMartin Matuska val = arc_no_grow_shift; 263c7046f76SMartin Matuska err = sysctl_handle_int(oidp, &val, 0, req); 264c7046f76SMartin Matuska if (err != 0 || req->newptr == NULL) 265c7046f76SMartin Matuska return (err); 266c7046f76SMartin Matuska 267c7046f76SMartin Matuska if (val < 0 || val >= arc_shrink_shift) 268c7046f76SMartin Matuska return (EINVAL); 269c7046f76SMartin Matuska 270c7046f76SMartin Matuska arc_no_grow_shift = val; 271c7046f76SMartin Matuska 272c7046f76SMartin Matuska return (0); 273c7046f76SMartin Matuska } 274c7046f76SMartin Matuska 275c7046f76SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_no_grow_shift, 276c7046f76SMartin Matuska CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 277c7046f76SMartin Matuska NULL, 0, param_set_arc_no_grow_shift, "I", 278c7046f76SMartin Matuska "log2(fraction of ARC which must be free to allow growing) (LEGACY)"); 279c7046f76SMartin Matuska 280c7046f76SMartin Matuska extern uint64_t l2arc_write_max; 281c7046f76SMartin Matuska 282c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_write_max, 283c7046f76SMartin Matuska CTLFLAG_RWTUN, &l2arc_write_max, 0, 284c7046f76SMartin Matuska "Max write bytes per interval (LEGACY)"); 285c7046f76SMartin Matuska 286c7046f76SMartin Matuska extern uint64_t l2arc_write_boost; 287c7046f76SMartin Matuska 288c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_write_boost, 289c7046f76SMartin Matuska CTLFLAG_RWTUN, &l2arc_write_boost, 0, 290c7046f76SMartin Matuska "Extra write bytes during device warmup (LEGACY)"); 291c7046f76SMartin Matuska 292c7046f76SMartin Matuska extern uint64_t l2arc_headroom; 293c7046f76SMartin Matuska 294c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_headroom, 295c7046f76SMartin Matuska CTLFLAG_RWTUN, &l2arc_headroom, 0, 296c7046f76SMartin Matuska "Number of max device writes to precache (LEGACY)"); 297c7046f76SMartin Matuska 298c7046f76SMartin Matuska extern uint64_t l2arc_headroom_boost; 299c7046f76SMartin Matuska 300c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_headroom_boost, 301c7046f76SMartin Matuska CTLFLAG_RWTUN, &l2arc_headroom_boost, 0, 302c7046f76SMartin Matuska "Compressed l2arc_headroom multiplier (LEGACY)"); 303c7046f76SMartin Matuska 304c7046f76SMartin Matuska extern uint64_t l2arc_feed_secs; 305c7046f76SMartin Matuska 306c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_feed_secs, 307c7046f76SMartin Matuska CTLFLAG_RWTUN, &l2arc_feed_secs, 0, 308c7046f76SMartin Matuska "Seconds between L2ARC writing (LEGACY)"); 309c7046f76SMartin Matuska 310c7046f76SMartin Matuska extern uint64_t l2arc_feed_min_ms; 311c7046f76SMartin Matuska 312c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_feed_min_ms, 313c7046f76SMartin Matuska CTLFLAG_RWTUN, &l2arc_feed_min_ms, 0, 314c7046f76SMartin Matuska "Min feed interval in milliseconds (LEGACY)"); 315c7046f76SMartin Matuska 316c7046f76SMartin Matuska extern int l2arc_noprefetch; 317c7046f76SMartin Matuska 318c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs, OID_AUTO, l2arc_noprefetch, 319c7046f76SMartin Matuska CTLFLAG_RWTUN, &l2arc_noprefetch, 0, 320c7046f76SMartin Matuska "Skip caching prefetched buffers (LEGACY)"); 321c7046f76SMartin Matuska 322c7046f76SMartin Matuska extern int l2arc_feed_again; 323c7046f76SMartin Matuska 324c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs, OID_AUTO, l2arc_feed_again, 325c7046f76SMartin Matuska CTLFLAG_RWTUN, &l2arc_feed_again, 0, 326c7046f76SMartin Matuska "Turbo L2ARC warmup (LEGACY)"); 327c7046f76SMartin Matuska 328c7046f76SMartin Matuska extern int l2arc_norw; 329c7046f76SMartin Matuska 330c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs, OID_AUTO, l2arc_norw, 331c7046f76SMartin Matuska CTLFLAG_RWTUN, &l2arc_norw, 0, 332c7046f76SMartin Matuska "No reads during writes (LEGACY)"); 333c7046f76SMartin Matuska 3342a58b312SMartin Matuska static int 3352a58b312SMartin Matuska param_get_arc_state_size(SYSCTL_HANDLER_ARGS) 3362a58b312SMartin Matuska { 3372a58b312SMartin Matuska arc_state_t *state = (arc_state_t *)arg1; 3382a58b312SMartin Matuska int64_t val; 3392a58b312SMartin Matuska 3402a58b312SMartin Matuska val = zfs_refcount_count(&state->arcs_size[ARC_BUFC_DATA]) + 3412a58b312SMartin Matuska zfs_refcount_count(&state->arcs_size[ARC_BUFC_METADATA]); 3422a58b312SMartin Matuska return (sysctl_handle_64(oidp, &val, 0, req)); 3432a58b312SMartin Matuska } 3442a58b312SMartin Matuska 345c7046f76SMartin Matuska extern arc_state_t ARC_anon; 346c7046f76SMartin Matuska 3472a58b312SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, anon_size, 3482a58b312SMartin Matuska CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 3492a58b312SMartin Matuska &ARC_anon, 0, param_get_arc_state_size, "Q", 3502a58b312SMartin Matuska "size of anonymous state"); 351c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, anon_metadata_esize, CTLFLAG_RD, 352c7046f76SMartin Matuska &ARC_anon.arcs_esize[ARC_BUFC_METADATA].rc_count, 0, 3532a58b312SMartin Matuska "size of evictable metadata in anonymous state"); 354c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, anon_data_esize, CTLFLAG_RD, 355c7046f76SMartin Matuska &ARC_anon.arcs_esize[ARC_BUFC_DATA].rc_count, 0, 3562a58b312SMartin Matuska "size of evictable data in anonymous state"); 357c7046f76SMartin Matuska 358c7046f76SMartin Matuska extern arc_state_t ARC_mru; 359c7046f76SMartin Matuska 3602a58b312SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, mru_size, 3612a58b312SMartin Matuska CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 3622a58b312SMartin Matuska &ARC_mru, 0, param_get_arc_state_size, "Q", 3632a58b312SMartin Matuska "size of mru state"); 364c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mru_metadata_esize, CTLFLAG_RD, 365c7046f76SMartin Matuska &ARC_mru.arcs_esize[ARC_BUFC_METADATA].rc_count, 0, 3662a58b312SMartin Matuska "size of evictable metadata in mru state"); 367c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mru_data_esize, CTLFLAG_RD, 368c7046f76SMartin Matuska &ARC_mru.arcs_esize[ARC_BUFC_DATA].rc_count, 0, 3692a58b312SMartin Matuska "size of evictable data in mru state"); 370c7046f76SMartin Matuska 371c7046f76SMartin Matuska extern arc_state_t ARC_mru_ghost; 372c7046f76SMartin Matuska 3732a58b312SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, mru_ghost_size, 3742a58b312SMartin Matuska CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 3752a58b312SMartin Matuska &ARC_mru_ghost, 0, param_get_arc_state_size, "Q", 3762a58b312SMartin Matuska "size of mru ghost state"); 377c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mru_ghost_metadata_esize, CTLFLAG_RD, 378c7046f76SMartin Matuska &ARC_mru_ghost.arcs_esize[ARC_BUFC_METADATA].rc_count, 0, 3792a58b312SMartin Matuska "size of evictable metadata in mru ghost state"); 380c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mru_ghost_data_esize, CTLFLAG_RD, 381c7046f76SMartin Matuska &ARC_mru_ghost.arcs_esize[ARC_BUFC_DATA].rc_count, 0, 3822a58b312SMartin Matuska "size of evictable data in mru ghost state"); 383c7046f76SMartin Matuska 384c7046f76SMartin Matuska extern arc_state_t ARC_mfu; 385c7046f76SMartin Matuska 3862a58b312SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, mfu_size, 3872a58b312SMartin Matuska CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 3882a58b312SMartin Matuska &ARC_mfu, 0, param_get_arc_state_size, "Q", 3892a58b312SMartin Matuska "size of mfu state"); 390c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mfu_metadata_esize, CTLFLAG_RD, 391c7046f76SMartin Matuska &ARC_mfu.arcs_esize[ARC_BUFC_METADATA].rc_count, 0, 3922a58b312SMartin Matuska "size of evictable metadata in mfu state"); 393c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mfu_data_esize, CTLFLAG_RD, 394c7046f76SMartin Matuska &ARC_mfu.arcs_esize[ARC_BUFC_DATA].rc_count, 0, 3952a58b312SMartin Matuska "size of evictable data in mfu state"); 396c7046f76SMartin Matuska 397c7046f76SMartin Matuska extern arc_state_t ARC_mfu_ghost; 398c7046f76SMartin Matuska 3992a58b312SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, mfu_ghost_size, 4002a58b312SMartin Matuska CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 4012a58b312SMartin Matuska &ARC_mfu_ghost, 0, param_get_arc_state_size, "Q", 4022a58b312SMartin Matuska "size of mfu ghost state"); 403c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mfu_ghost_metadata_esize, CTLFLAG_RD, 404c7046f76SMartin Matuska &ARC_mfu_ghost.arcs_esize[ARC_BUFC_METADATA].rc_count, 0, 4052a58b312SMartin Matuska "size of evictable metadata in mfu ghost state"); 406c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mfu_ghost_data_esize, CTLFLAG_RD, 407c7046f76SMartin Matuska &ARC_mfu_ghost.arcs_esize[ARC_BUFC_DATA].rc_count, 0, 4082a58b312SMartin Matuska "size of evictable data in mfu ghost state"); 409c7046f76SMartin Matuska 41015f0b8c3SMartin Matuska extern arc_state_t ARC_uncached; 41115f0b8c3SMartin Matuska 4122a58b312SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, uncached_size, 4132a58b312SMartin Matuska CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 4142a58b312SMartin Matuska &ARC_uncached, 0, param_get_arc_state_size, "Q", 4152a58b312SMartin Matuska "size of uncached state"); 41615f0b8c3SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, uncached_metadata_esize, CTLFLAG_RD, 41715f0b8c3SMartin Matuska &ARC_uncached.arcs_esize[ARC_BUFC_METADATA].rc_count, 0, 4182a58b312SMartin Matuska "size of evictable metadata in uncached state"); 41915f0b8c3SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, uncached_data_esize, CTLFLAG_RD, 42015f0b8c3SMartin Matuska &ARC_uncached.arcs_esize[ARC_BUFC_DATA].rc_count, 0, 4212a58b312SMartin Matuska "size of evictable data in uncached state"); 42215f0b8c3SMartin Matuska 423c7046f76SMartin Matuska extern arc_state_t ARC_l2c_only; 424c7046f76SMartin Matuska 4252a58b312SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, l2c_only_size, 4262a58b312SMartin Matuska CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 4272a58b312SMartin Matuska &ARC_l2c_only, 0, param_get_arc_state_size, "Q", 4282a58b312SMartin Matuska "size of l2c_only state"); 429eda14cbcSMatt Macy 430eda14cbcSMatt Macy /* dbuf.c */ 431eda14cbcSMatt Macy 432eda14cbcSMatt Macy /* dmu.c */ 433eda14cbcSMatt Macy 434eda14cbcSMatt Macy /* dmu_zfetch.c */ 435c7046f76SMartin Matuska 436eda14cbcSMatt Macy SYSCTL_NODE(_vfs_zfs, OID_AUTO, zfetch, CTLFLAG_RW, 0, "ZFS ZFETCH (LEGACY)"); 437eda14cbcSMatt Macy 438eda14cbcSMatt Macy extern uint32_t zfetch_max_distance; 439eda14cbcSMatt Macy 440c7046f76SMartin Matuska SYSCTL_UINT(_vfs_zfs_zfetch, OID_AUTO, max_distance, 441c7046f76SMartin Matuska CTLFLAG_RWTUN, &zfetch_max_distance, 0, 442c7046f76SMartin Matuska "Max bytes to prefetch per stream (LEGACY)"); 443c7046f76SMartin Matuska 444c7046f76SMartin Matuska extern uint32_t zfetch_max_idistance; 445c7046f76SMartin Matuska 446c7046f76SMartin Matuska SYSCTL_UINT(_vfs_zfs_zfetch, OID_AUTO, max_idistance, 447c7046f76SMartin Matuska CTLFLAG_RWTUN, &zfetch_max_idistance, 0, 448180f8225SMatt Macy "Max bytes to prefetch indirects for per stream (LEGACY)"); 449eda14cbcSMatt Macy 450eda14cbcSMatt Macy /* dsl_pool.c */ 451eda14cbcSMatt Macy 452eda14cbcSMatt Macy /* dnode.c */ 453c7046f76SMartin Matuska 454eda14cbcSMatt Macy /* dsl_scan.c */ 455eda14cbcSMatt Macy 456eda14cbcSMatt Macy /* metaslab.c */ 457eda14cbcSMatt Macy 458*2ad756a6SMartin Matuska int 459*2ad756a6SMartin Matuska param_set_active_allocator(SYSCTL_HANDLER_ARGS) 460*2ad756a6SMartin Matuska { 461*2ad756a6SMartin Matuska char buf[16]; 462*2ad756a6SMartin Matuska int rc; 463*2ad756a6SMartin Matuska 464*2ad756a6SMartin Matuska if (req->newptr == NULL) 465*2ad756a6SMartin Matuska strlcpy(buf, zfs_active_allocator, sizeof (buf)); 466*2ad756a6SMartin Matuska 467*2ad756a6SMartin Matuska rc = sysctl_handle_string(oidp, buf, sizeof (buf), req); 468*2ad756a6SMartin Matuska if (rc || req->newptr == NULL) 469*2ad756a6SMartin Matuska return (rc); 470*2ad756a6SMartin Matuska if (strcmp(buf, zfs_active_allocator) == 0) 471*2ad756a6SMartin Matuska return (0); 472*2ad756a6SMartin Matuska 473*2ad756a6SMartin Matuska return (param_set_active_allocator_common(buf)); 474*2ad756a6SMartin Matuska } 475*2ad756a6SMartin Matuska 476eda14cbcSMatt Macy /* 477eda14cbcSMatt Macy * In pools where the log space map feature is not enabled we touch 478eda14cbcSMatt Macy * multiple metaslabs (and their respective space maps) with each 479eda14cbcSMatt Macy * transaction group. Thus, we benefit from having a small space map 480eda14cbcSMatt Macy * block size since it allows us to issue more I/O operations scattered 481eda14cbcSMatt Macy * around the disk. So a sane default for the space map block size 482eda14cbcSMatt Macy * is 8~16K. 483eda14cbcSMatt Macy */ 484eda14cbcSMatt Macy extern int zfs_metaslab_sm_blksz_no_log; 485c7046f76SMartin Matuska 486c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs_metaslab, OID_AUTO, sm_blksz_no_log, 487c7046f76SMartin Matuska CTLFLAG_RDTUN, &zfs_metaslab_sm_blksz_no_log, 0, 488eda14cbcSMatt Macy "Block size for space map in pools with log space map disabled. " 489c03c5b1cSMartin Matuska "Power of 2 greater than 4096."); 490eda14cbcSMatt Macy 491eda14cbcSMatt Macy /* 492eda14cbcSMatt Macy * When the log space map feature is enabled, we accumulate a lot of 493eda14cbcSMatt Macy * changes per metaslab that are flushed once in a while so we benefit 494eda14cbcSMatt Macy * from a bigger block size like 128K for the metaslab space maps. 495eda14cbcSMatt Macy */ 496eda14cbcSMatt Macy extern int zfs_metaslab_sm_blksz_with_log; 497c7046f76SMartin Matuska 498c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs_metaslab, OID_AUTO, sm_blksz_with_log, 499c7046f76SMartin Matuska CTLFLAG_RDTUN, &zfs_metaslab_sm_blksz_with_log, 0, 500eda14cbcSMatt Macy "Block size for space map in pools with log space map enabled. " 501c03c5b1cSMartin Matuska "Power of 2 greater than 4096."); 502eda14cbcSMatt Macy 503eda14cbcSMatt Macy /* 504eda14cbcSMatt Macy * The in-core space map representation is more compact than its on-disk form. 505eda14cbcSMatt Macy * The zfs_condense_pct determines how much more compact the in-core 506eda14cbcSMatt Macy * space map representation must be before we compact it on-disk. 507eda14cbcSMatt Macy * Values should be greater than or equal to 100. 508eda14cbcSMatt Macy */ 509be181ee2SMartin Matuska extern uint_t zfs_condense_pct; 510c7046f76SMartin Matuska 511be181ee2SMartin Matuska SYSCTL_UINT(_vfs_zfs, OID_AUTO, condense_pct, 512c7046f76SMartin Matuska CTLFLAG_RWTUN, &zfs_condense_pct, 0, 513eda14cbcSMatt Macy "Condense on-disk spacemap when it is more than this many percents" 514eda14cbcSMatt Macy " of in-memory counterpart"); 515eda14cbcSMatt Macy 516be181ee2SMartin Matuska extern uint_t zfs_remove_max_segment; 517c7046f76SMartin Matuska 518be181ee2SMartin Matuska SYSCTL_UINT(_vfs_zfs, OID_AUTO, remove_max_segment, 519c7046f76SMartin Matuska CTLFLAG_RWTUN, &zfs_remove_max_segment, 0, 520c7046f76SMartin Matuska "Largest contiguous segment ZFS will attempt to allocate when removing" 521c7046f76SMartin Matuska " a device"); 522eda14cbcSMatt Macy 523eda14cbcSMatt Macy extern int zfs_removal_suspend_progress; 524eda14cbcSMatt Macy 525c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs, OID_AUTO, removal_suspend_progress, 526c7046f76SMartin Matuska CTLFLAG_RWTUN, &zfs_removal_suspend_progress, 0, 527c7046f76SMartin Matuska "Ensures certain actions can happen while in the middle of a removal"); 528eda14cbcSMatt Macy 529eda14cbcSMatt Macy /* 530eda14cbcSMatt Macy * Minimum size which forces the dynamic allocator to change 531eda14cbcSMatt Macy * it's allocation strategy. Once the space map cannot satisfy 532eda14cbcSMatt Macy * an allocation of this size then it switches to using more 533eda14cbcSMatt Macy * aggressive strategy (i.e search by size rather than offset). 534eda14cbcSMatt Macy */ 535eda14cbcSMatt Macy extern uint64_t metaslab_df_alloc_threshold; 536c7046f76SMartin Matuska 537c7046f76SMartin Matuska SYSCTL_QUAD(_vfs_zfs_metaslab, OID_AUTO, df_alloc_threshold, 538c7046f76SMartin Matuska CTLFLAG_RWTUN, &metaslab_df_alloc_threshold, 0, 539c7046f76SMartin Matuska "Minimum size which forces the dynamic allocator to change its" 540c7046f76SMartin Matuska " allocation strategy"); 541eda14cbcSMatt Macy 542eda14cbcSMatt Macy /* 543eda14cbcSMatt Macy * The minimum free space, in percent, which must be available 544eda14cbcSMatt Macy * in a space map to continue allocations in a first-fit fashion. 545eda14cbcSMatt Macy * Once the space map's free space drops below this level we dynamically 546eda14cbcSMatt Macy * switch to using best-fit allocations. 547eda14cbcSMatt Macy */ 548be181ee2SMartin Matuska extern uint_t metaslab_df_free_pct; 549c7046f76SMartin Matuska 550be181ee2SMartin Matuska SYSCTL_UINT(_vfs_zfs_metaslab, OID_AUTO, df_free_pct, 551c7046f76SMartin Matuska CTLFLAG_RWTUN, &metaslab_df_free_pct, 0, 552eda14cbcSMatt Macy "The minimum free space, in percent, which must be available in a" 553eda14cbcSMatt Macy " space map to continue allocations in a first-fit fashion"); 554eda14cbcSMatt Macy 555c7046f76SMartin Matuska /* mmp.c */ 556c7046f76SMartin Matuska 557c7046f76SMartin Matuska int 558c7046f76SMartin Matuska param_set_multihost_interval(SYSCTL_HANDLER_ARGS) 559c7046f76SMartin Matuska { 560c7046f76SMartin Matuska int err; 561c7046f76SMartin Matuska 562dbd5678dSMartin Matuska err = sysctl_handle_64(oidp, &zfs_multihost_interval, 0, req); 563c7046f76SMartin Matuska if (err != 0 || req->newptr == NULL) 564c7046f76SMartin Matuska return (err); 565c7046f76SMartin Matuska 566c7046f76SMartin Matuska if (spa_mode_global != SPA_MODE_UNINIT) 567c7046f76SMartin Matuska mmp_signal_all_threads(); 568c7046f76SMartin Matuska 569c7046f76SMartin Matuska return (0); 570c7046f76SMartin Matuska } 571eda14cbcSMatt Macy 572eda14cbcSMatt Macy /* spa.c */ 573c7046f76SMartin Matuska 574eda14cbcSMatt Macy extern int zfs_ccw_retry_interval; 575c7046f76SMartin Matuska 576c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs, OID_AUTO, ccw_retry_interval, 577c7046f76SMartin Matuska CTLFLAG_RWTUN, &zfs_ccw_retry_interval, 0, 578c7046f76SMartin Matuska "Configuration cache file write, retry after failure, interval" 579c7046f76SMartin Matuska " (seconds)"); 580eda14cbcSMatt Macy 581eda14cbcSMatt Macy extern uint64_t zfs_max_missing_tvds_cachefile; 582c7046f76SMartin Matuska 583c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, max_missing_tvds_cachefile, 584c7046f76SMartin Matuska CTLFLAG_RWTUN, &zfs_max_missing_tvds_cachefile, 0, 585c7046f76SMartin Matuska "Allow importing pools with missing top-level vdevs in cache file"); 586eda14cbcSMatt Macy 587eda14cbcSMatt Macy extern uint64_t zfs_max_missing_tvds_scan; 588c7046f76SMartin Matuska 589c7046f76SMartin Matuska SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, max_missing_tvds_scan, 590c7046f76SMartin Matuska CTLFLAG_RWTUN, &zfs_max_missing_tvds_scan, 0, 591c7046f76SMartin Matuska "Allow importing pools with missing top-level vdevs during scan"); 592eda14cbcSMatt Macy 593eda14cbcSMatt Macy /* spa_misc.c */ 594c7046f76SMartin Matuska 595eda14cbcSMatt Macy extern int zfs_flags; 596c7046f76SMartin Matuska 597eda14cbcSMatt Macy static int 598eda14cbcSMatt Macy sysctl_vfs_zfs_debug_flags(SYSCTL_HANDLER_ARGS) 599eda14cbcSMatt Macy { 600eda14cbcSMatt Macy int err, val; 601eda14cbcSMatt Macy 602eda14cbcSMatt Macy val = zfs_flags; 603eda14cbcSMatt Macy err = sysctl_handle_int(oidp, &val, 0, req); 604eda14cbcSMatt Macy if (err != 0 || req->newptr == NULL) 605eda14cbcSMatt Macy return (err); 606eda14cbcSMatt Macy 607eda14cbcSMatt Macy /* 608eda14cbcSMatt Macy * ZFS_DEBUG_MODIFY must be enabled prior to boot so all 609eda14cbcSMatt Macy * arc buffers in the system have the necessary additional 610eda14cbcSMatt Macy * checksum data. However, it is safe to disable at any 611eda14cbcSMatt Macy * time. 612eda14cbcSMatt Macy */ 613eda14cbcSMatt Macy if (!(zfs_flags & ZFS_DEBUG_MODIFY)) 614eda14cbcSMatt Macy val &= ~ZFS_DEBUG_MODIFY; 615eda14cbcSMatt Macy zfs_flags = val; 616eda14cbcSMatt Macy 617eda14cbcSMatt Macy return (0); 618eda14cbcSMatt Macy } 619eda14cbcSMatt Macy 620eda14cbcSMatt Macy SYSCTL_PROC(_vfs_zfs, OID_AUTO, debugflags, 621eda14cbcSMatt Macy CTLTYPE_UINT | CTLFLAG_MPSAFE | CTLFLAG_RWTUN, NULL, 0, 622eda14cbcSMatt Macy sysctl_vfs_zfs_debug_flags, "IU", "Debug flags for ZFS testing."); 623eda14cbcSMatt Macy 624eda14cbcSMatt Macy int 625eda14cbcSMatt Macy param_set_deadman_synctime(SYSCTL_HANDLER_ARGS) 626eda14cbcSMatt Macy { 627eda14cbcSMatt Macy unsigned long val; 628eda14cbcSMatt Macy int err; 629eda14cbcSMatt Macy 630eda14cbcSMatt Macy val = zfs_deadman_synctime_ms; 631dbd5678dSMartin Matuska err = sysctl_handle_64(oidp, &val, 0, req); 632eda14cbcSMatt Macy if (err != 0 || req->newptr == NULL) 633eda14cbcSMatt Macy return (err); 634eda14cbcSMatt Macy zfs_deadman_synctime_ms = val; 635eda14cbcSMatt Macy 636eda14cbcSMatt Macy spa_set_deadman_synctime(MSEC2NSEC(zfs_deadman_synctime_ms)); 637eda14cbcSMatt Macy 638eda14cbcSMatt Macy return (0); 639eda14cbcSMatt Macy } 640eda14cbcSMatt Macy 641eda14cbcSMatt Macy int 642eda14cbcSMatt Macy param_set_deadman_ziotime(SYSCTL_HANDLER_ARGS) 643eda14cbcSMatt Macy { 644eda14cbcSMatt Macy unsigned long val; 645eda14cbcSMatt Macy int err; 646eda14cbcSMatt Macy 647eda14cbcSMatt Macy val = zfs_deadman_ziotime_ms; 648dbd5678dSMartin Matuska err = sysctl_handle_64(oidp, &val, 0, req); 649eda14cbcSMatt Macy if (err != 0 || req->newptr == NULL) 650eda14cbcSMatt Macy return (err); 651eda14cbcSMatt Macy zfs_deadman_ziotime_ms = val; 652eda14cbcSMatt Macy 653eda14cbcSMatt Macy spa_set_deadman_ziotime(MSEC2NSEC(zfs_deadman_synctime_ms)); 654eda14cbcSMatt Macy 655eda14cbcSMatt Macy return (0); 656eda14cbcSMatt Macy } 657eda14cbcSMatt Macy 658eda14cbcSMatt Macy int 659eda14cbcSMatt Macy param_set_deadman_failmode(SYSCTL_HANDLER_ARGS) 660eda14cbcSMatt Macy { 661eda14cbcSMatt Macy char buf[16]; 662eda14cbcSMatt Macy int rc; 663eda14cbcSMatt Macy 664eda14cbcSMatt Macy if (req->newptr == NULL) 665eda14cbcSMatt Macy strlcpy(buf, zfs_deadman_failmode, sizeof (buf)); 666eda14cbcSMatt Macy 667eda14cbcSMatt Macy rc = sysctl_handle_string(oidp, buf, sizeof (buf), req); 668eda14cbcSMatt Macy if (rc || req->newptr == NULL) 669eda14cbcSMatt Macy return (rc); 670eda14cbcSMatt Macy if (strcmp(buf, zfs_deadman_failmode) == 0) 671eda14cbcSMatt Macy return (0); 672c03c5b1cSMartin Matuska if (strcmp(buf, "wait") == 0) 673eda14cbcSMatt Macy zfs_deadman_failmode = "wait"; 674c03c5b1cSMartin Matuska if (strcmp(buf, "continue") == 0) 675eda14cbcSMatt Macy zfs_deadman_failmode = "continue"; 676c03c5b1cSMartin Matuska if (strcmp(buf, "panic") == 0) 677eda14cbcSMatt Macy zfs_deadman_failmode = "panic"; 678eda14cbcSMatt Macy 679eda14cbcSMatt Macy return (-param_set_deadman_failmode_common(buf)); 680eda14cbcSMatt Macy } 681eda14cbcSMatt Macy 682c7046f76SMartin Matuska int 683c7046f76SMartin Matuska param_set_slop_shift(SYSCTL_HANDLER_ARGS) 684c7046f76SMartin Matuska { 685c7046f76SMartin Matuska int val; 686c7046f76SMartin Matuska int err; 687c7046f76SMartin Matuska 688c7046f76SMartin Matuska val = spa_slop_shift; 689c7046f76SMartin Matuska err = sysctl_handle_int(oidp, &val, 0, req); 690c7046f76SMartin Matuska if (err != 0 || req->newptr == NULL) 691c7046f76SMartin Matuska return (err); 692c7046f76SMartin Matuska 693c7046f76SMartin Matuska if (val < 1 || val > 31) 694c7046f76SMartin Matuska return (EINVAL); 695c7046f76SMartin Matuska 696c7046f76SMartin Matuska spa_slop_shift = val; 697c7046f76SMartin Matuska 698c7046f76SMartin Matuska return (0); 699c7046f76SMartin Matuska } 700eda14cbcSMatt Macy 701eda14cbcSMatt Macy /* spacemap.c */ 702c7046f76SMartin Matuska 703eda14cbcSMatt Macy extern int space_map_ibs; 704c7046f76SMartin Matuska 705eda14cbcSMatt Macy SYSCTL_INT(_vfs_zfs, OID_AUTO, space_map_ibs, CTLFLAG_RWTUN, 706eda14cbcSMatt Macy &space_map_ibs, 0, "Space map indirect block shift"); 707eda14cbcSMatt Macy 708eda14cbcSMatt Macy 709eda14cbcSMatt Macy /* vdev.c */ 710c7046f76SMartin Matuska 711eda14cbcSMatt Macy int 712eda14cbcSMatt Macy param_set_min_auto_ashift(SYSCTL_HANDLER_ARGS) 713eda14cbcSMatt Macy { 714dbd5678dSMartin Matuska int val; 715eda14cbcSMatt Macy int err; 716eda14cbcSMatt Macy 717eda14cbcSMatt Macy val = zfs_vdev_min_auto_ashift; 718dbd5678dSMartin Matuska err = sysctl_handle_int(oidp, &val, 0, req); 719eda14cbcSMatt Macy if (err != 0 || req->newptr == NULL) 720eda14cbcSMatt Macy return (SET_ERROR(err)); 721eda14cbcSMatt Macy 722eda14cbcSMatt Macy if (val < ASHIFT_MIN || val > zfs_vdev_max_auto_ashift) 723eda14cbcSMatt Macy return (SET_ERROR(EINVAL)); 724eda14cbcSMatt Macy 725eda14cbcSMatt Macy zfs_vdev_min_auto_ashift = val; 726eda14cbcSMatt Macy 727eda14cbcSMatt Macy return (0); 728eda14cbcSMatt Macy } 729eda14cbcSMatt Macy 730c7046f76SMartin Matuska SYSCTL_PROC(_vfs_zfs, OID_AUTO, min_auto_ashift, 731dbd5678dSMartin Matuska CTLTYPE_UINT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 732c7046f76SMartin Matuska &zfs_vdev_min_auto_ashift, sizeof (zfs_vdev_min_auto_ashift), 733dbd5678dSMartin Matuska param_set_min_auto_ashift, "IU", 734c7046f76SMartin Matuska "Min ashift used when creating new top-level vdev. (LEGACY)"); 735c7046f76SMartin Matuska 736eda14cbcSMatt Macy int 737eda14cbcSMatt Macy param_set_max_auto_ashift(SYSCTL_HANDLER_ARGS) 738eda14cbcSMatt Macy { 739dbd5678dSMartin Matuska int val; 740eda14cbcSMatt Macy int err; 741eda14cbcSMatt Macy 742eda14cbcSMatt Macy val = zfs_vdev_max_auto_ashift; 743dbd5678dSMartin Matuska err = sysctl_handle_int(oidp, &val, 0, req); 744eda14cbcSMatt Macy if (err != 0 || req->newptr == NULL) 745eda14cbcSMatt Macy return (SET_ERROR(err)); 746eda14cbcSMatt Macy 747eda14cbcSMatt Macy if (val > ASHIFT_MAX || val < zfs_vdev_min_auto_ashift) 748eda14cbcSMatt Macy return (SET_ERROR(EINVAL)); 749eda14cbcSMatt Macy 750eda14cbcSMatt Macy zfs_vdev_max_auto_ashift = val; 751eda14cbcSMatt Macy 752eda14cbcSMatt Macy return (0); 753eda14cbcSMatt Macy } 754eda14cbcSMatt Macy 755c40487d4SMatt Macy SYSCTL_PROC(_vfs_zfs, OID_AUTO, max_auto_ashift, 756dbd5678dSMartin Matuska CTLTYPE_UINT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 757eda14cbcSMatt Macy &zfs_vdev_max_auto_ashift, sizeof (zfs_vdev_max_auto_ashift), 758dbd5678dSMartin Matuska param_set_max_auto_ashift, "IU", 759eda14cbcSMatt Macy "Max ashift used when optimizing for logical -> physical sector size on" 760eda14cbcSMatt Macy " new top-level vdevs. (LEGACY)"); 761eda14cbcSMatt Macy 762eda14cbcSMatt Macy /* 763eda14cbcSMatt Macy * Since the DTL space map of a vdev is not expected to have a lot of 764eda14cbcSMatt Macy * entries, we default its block size to 4K. 765eda14cbcSMatt Macy */ 766eda14cbcSMatt Macy extern int zfs_vdev_dtl_sm_blksz; 767c7046f76SMartin Matuska 768c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs, OID_AUTO, dtl_sm_blksz, 769c7046f76SMartin Matuska CTLFLAG_RDTUN, &zfs_vdev_dtl_sm_blksz, 0, 770c03c5b1cSMartin Matuska "Block size for DTL space map. Power of 2 greater than 4096."); 771eda14cbcSMatt Macy 772eda14cbcSMatt Macy /* 773eda14cbcSMatt Macy * vdev-wide space maps that have lots of entries written to them at 774eda14cbcSMatt Macy * the end of each transaction can benefit from a higher I/O bandwidth 775eda14cbcSMatt Macy * (e.g. vdev_obsolete_sm), thus we default their block size to 128K. 776eda14cbcSMatt Macy */ 777eda14cbcSMatt Macy extern int zfs_vdev_standard_sm_blksz; 778c7046f76SMartin Matuska 779c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs, OID_AUTO, standard_sm_blksz, 780c7046f76SMartin Matuska CTLFLAG_RDTUN, &zfs_vdev_standard_sm_blksz, 0, 781c03c5b1cSMartin Matuska "Block size for standard space map. Power of 2 greater than 4096."); 782eda14cbcSMatt Macy 783eda14cbcSMatt Macy extern int vdev_validate_skip; 784eda14cbcSMatt Macy 785c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs, OID_AUTO, validate_skip, 786c7046f76SMartin Matuska CTLFLAG_RDTUN, &vdev_validate_skip, 0, 787c7046f76SMartin Matuska "Enable to bypass vdev_validate()."); 788eda14cbcSMatt Macy 789eda14cbcSMatt Macy /* vdev_mirror.c */ 790eda14cbcSMatt Macy 791eda14cbcSMatt Macy /* vdev_queue.c */ 792c7046f76SMartin Matuska 793be181ee2SMartin Matuska extern uint_t zfs_vdev_max_active; 794c7046f76SMartin Matuska 795c7046f76SMartin Matuska SYSCTL_UINT(_vfs_zfs, OID_AUTO, top_maxinflight, 796c7046f76SMartin Matuska CTLFLAG_RWTUN, &zfs_vdev_max_active, 0, 797c03c5b1cSMartin Matuska "The maximum number of I/Os of all types active for each device." 798c03c5b1cSMartin Matuska " (LEGACY)"); 799eda14cbcSMatt Macy 800c7046f76SMartin Matuska /* zio.c */ 801eda14cbcSMatt Macy 802c7046f76SMartin Matuska SYSCTL_INT(_vfs_zfs_zio, OID_AUTO, exclude_metadata, 803c7046f76SMartin Matuska CTLFLAG_RDTUN, &zio_exclude_metadata, 0, 804c7046f76SMartin Matuska "Exclude metadata buffers from dumps as well"); 805