1eda14cbcSMatt Macy /* 2eda14cbcSMatt Macy * CDDL HEADER START 3eda14cbcSMatt Macy * 4eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 6eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 7eda14cbcSMatt Macy * 8eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9271171e0SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0. 10eda14cbcSMatt Macy * See the License for the specific language governing permissions 11eda14cbcSMatt Macy * and limitations under the License. 12eda14cbcSMatt Macy * 13eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 14eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 16eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 17eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 18eda14cbcSMatt Macy * 19eda14cbcSMatt Macy * CDDL HEADER END 20eda14cbcSMatt Macy */ 21eda14cbcSMatt Macy 22eda14cbcSMatt Macy /* 23eda14cbcSMatt Macy * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 24eda14cbcSMatt Macy * Portions Copyright 2011 Martin Matuska 25eda14cbcSMatt Macy * Copyright 2015, OmniTI Computer Consulting, Inc. All rights reserved. 26eda14cbcSMatt Macy * Portions Copyright 2012 Pawel Jakub Dawidek <pawel@dawidek.net> 27eda14cbcSMatt Macy * Copyright (c) 2014, 2016 Joyent, Inc. All rights reserved. 28eda14cbcSMatt Macy * Copyright 2016 Nexenta Systems, Inc. All rights reserved. 29eda14cbcSMatt Macy * Copyright (c) 2014, Joyent, Inc. All rights reserved. 30eda14cbcSMatt Macy * Copyright (c) 2011, 2018 by Delphix. All rights reserved. 31eda14cbcSMatt Macy * Copyright (c) 2013 by Saso Kiselkov. All rights reserved. 32eda14cbcSMatt Macy * Copyright (c) 2013 Steven Hartland. All rights reserved. 33eda14cbcSMatt Macy * Copyright (c) 2014 Integros [integros.com] 34eda14cbcSMatt Macy * Copyright 2016 Toomas Soome <tsoome@me.com> 35eda14cbcSMatt Macy * Copyright (c) 2016 Actifio, Inc. All rights reserved. 36eda14cbcSMatt Macy * Copyright (c) 2018, loli10K <ezomori.nozomu@gmail.com>. All rights reserved. 37eda14cbcSMatt Macy * Copyright 2017 RackTop Systems. 38eda14cbcSMatt Macy * Copyright (c) 2017 Open-E, Inc. All Rights Reserved. 39eda14cbcSMatt Macy * Copyright (c) 2019 Datto Inc. 401f1e2261SMartin Matuska * Copyright (c) 2021 Klara, Inc. 41eda14cbcSMatt Macy */ 42eda14cbcSMatt Macy 43eda14cbcSMatt Macy #include <sys/types.h> 44eda14cbcSMatt Macy #include <sys/param.h> 45eda14cbcSMatt Macy #include <sys/errno.h> 46eda14cbcSMatt Macy #include <sys/uio.h> 47eda14cbcSMatt Macy #include <sys/file.h> 48eda14cbcSMatt Macy #include <sys/kmem.h> 49eda14cbcSMatt Macy #include <sys/stat.h> 50eda14cbcSMatt Macy #include <sys/zfs_ioctl.h> 51eda14cbcSMatt Macy #include <sys/zfs_vfsops.h> 52eda14cbcSMatt Macy #include <sys/zap.h> 53eda14cbcSMatt Macy #include <sys/spa.h> 54eda14cbcSMatt Macy #include <sys/nvpair.h> 55eda14cbcSMatt Macy #include <sys/fs/zfs.h> 56eda14cbcSMatt Macy #include <sys/zfs_ctldir.h> 57eda14cbcSMatt Macy #include <sys/zfs_dir.h> 58eda14cbcSMatt Macy #include <sys/zfs_onexit.h> 59eda14cbcSMatt Macy #include <sys/zvol.h> 60eda14cbcSMatt Macy #include <sys/fm/util.h> 61eda14cbcSMatt Macy #include <sys/dsl_crypt.h> 62716fd348SMartin Matuska #include <sys/crypto/icp.h> 63716fd348SMartin Matuska #include <sys/zstd/zstd.h> 64eda14cbcSMatt Macy 65eda14cbcSMatt Macy #include <sys/zfs_ioctl_impl.h> 66eda14cbcSMatt Macy 67eda14cbcSMatt Macy #include <sys/zfs_sysfs.h> 68eda14cbcSMatt Macy #include <linux/miscdevice.h> 69eda14cbcSMatt Macy #include <linux/slab.h> 70eda14cbcSMatt Macy 71eda14cbcSMatt Macy boolean_t 72eda14cbcSMatt Macy zfs_vfs_held(zfsvfs_t *zfsvfs) 73eda14cbcSMatt Macy { 74eda14cbcSMatt Macy return (zfsvfs->z_sb != NULL); 75eda14cbcSMatt Macy } 76eda14cbcSMatt Macy 77eda14cbcSMatt Macy int 78eda14cbcSMatt Macy zfs_vfs_ref(zfsvfs_t **zfvp) 79eda14cbcSMatt Macy { 80eda14cbcSMatt Macy if (*zfvp == NULL || (*zfvp)->z_sb == NULL || 81eda14cbcSMatt Macy !atomic_inc_not_zero(&((*zfvp)->z_sb->s_active))) { 82eda14cbcSMatt Macy return (SET_ERROR(ESRCH)); 83eda14cbcSMatt Macy } 84eda14cbcSMatt Macy return (0); 85eda14cbcSMatt Macy } 86eda14cbcSMatt Macy 87eda14cbcSMatt Macy void 88eda14cbcSMatt Macy zfs_vfs_rele(zfsvfs_t *zfsvfs) 89eda14cbcSMatt Macy { 90eda14cbcSMatt Macy deactivate_super(zfsvfs->z_sb); 91eda14cbcSMatt Macy } 92eda14cbcSMatt Macy 9316038816SMartin Matuska void 9416038816SMartin Matuska zfsdev_private_set_state(void *priv, zfsdev_state_t *zs) 95eda14cbcSMatt Macy { 9616038816SMartin Matuska struct file *filp = priv; 97eda14cbcSMatt Macy 98eda14cbcSMatt Macy filp->private_data = zs; 99eda14cbcSMatt Macy } 100eda14cbcSMatt Macy 10116038816SMartin Matuska zfsdev_state_t * 10216038816SMartin Matuska zfsdev_private_get_state(void *priv) 103eda14cbcSMatt Macy { 10416038816SMartin Matuska struct file *filp = priv; 105eda14cbcSMatt Macy 10616038816SMartin Matuska return (filp->private_data); 107eda14cbcSMatt Macy } 108eda14cbcSMatt Macy 109eda14cbcSMatt Macy static int 110eda14cbcSMatt Macy zfsdev_open(struct inode *ino, struct file *filp) 111eda14cbcSMatt Macy { 112eda14cbcSMatt Macy int error; 113eda14cbcSMatt Macy 114eda14cbcSMatt Macy mutex_enter(&zfsdev_state_lock); 115eda14cbcSMatt Macy error = zfsdev_state_init(filp); 116eda14cbcSMatt Macy mutex_exit(&zfsdev_state_lock); 117eda14cbcSMatt Macy 118eda14cbcSMatt Macy return (-error); 119eda14cbcSMatt Macy } 120eda14cbcSMatt Macy 121eda14cbcSMatt Macy static int 122eda14cbcSMatt Macy zfsdev_release(struct inode *ino, struct file *filp) 123eda14cbcSMatt Macy { 12416038816SMartin Matuska zfsdev_state_destroy(filp); 125eda14cbcSMatt Macy 12616038816SMartin Matuska return (0); 127eda14cbcSMatt Macy } 128eda14cbcSMatt Macy 129eda14cbcSMatt Macy static long 130eda14cbcSMatt Macy zfsdev_ioctl(struct file *filp, unsigned cmd, unsigned long arg) 131eda14cbcSMatt Macy { 132eda14cbcSMatt Macy uint_t vecnum; 133eda14cbcSMatt Macy zfs_cmd_t *zc; 134eda14cbcSMatt Macy int error, rc; 135eda14cbcSMatt Macy 136eda14cbcSMatt Macy vecnum = cmd - ZFS_IOC_FIRST; 137eda14cbcSMatt Macy 138c9539b89SMartin Matuska zc = vmem_zalloc(sizeof (zfs_cmd_t), KM_SLEEP); 139eda14cbcSMatt Macy 140eda14cbcSMatt Macy if (ddi_copyin((void *)(uintptr_t)arg, zc, sizeof (zfs_cmd_t), 0)) { 141eda14cbcSMatt Macy error = -SET_ERROR(EFAULT); 142eda14cbcSMatt Macy goto out; 143eda14cbcSMatt Macy } 144eda14cbcSMatt Macy error = -zfsdev_ioctl_common(vecnum, zc, 0); 145eda14cbcSMatt Macy rc = ddi_copyout(zc, (void *)(uintptr_t)arg, sizeof (zfs_cmd_t), 0); 146eda14cbcSMatt Macy if (error == 0 && rc != 0) 147eda14cbcSMatt Macy error = -SET_ERROR(EFAULT); 148eda14cbcSMatt Macy out: 149c9539b89SMartin Matuska vmem_free(zc, sizeof (zfs_cmd_t)); 150eda14cbcSMatt Macy return (error); 151eda14cbcSMatt Macy 152eda14cbcSMatt Macy } 153eda14cbcSMatt Macy 1541f1e2261SMartin Matuska static int 1551f1e2261SMartin Matuska zfs_ioc_userns_attach(zfs_cmd_t *zc) 1561f1e2261SMartin Matuska { 1571f1e2261SMartin Matuska int error; 1581f1e2261SMartin Matuska 1591f1e2261SMartin Matuska if (zc == NULL) 1601f1e2261SMartin Matuska return (SET_ERROR(EINVAL)); 1611f1e2261SMartin Matuska 1621f1e2261SMartin Matuska error = zone_dataset_attach(CRED(), zc->zc_name, zc->zc_cleanup_fd); 1631f1e2261SMartin Matuska 1641f1e2261SMartin Matuska /* 1651f1e2261SMartin Matuska * Translate ENOTTY to ZFS_ERR_NOT_USER_NAMESPACE as we just arrived 1661f1e2261SMartin Matuska * back from the SPL layer, which does not know about ZFS_ERR_* errors. 1671f1e2261SMartin Matuska * See the comment at the user_ns_get() function in spl-zone.c for 1681f1e2261SMartin Matuska * details. 1691f1e2261SMartin Matuska */ 1701f1e2261SMartin Matuska if (error == ENOTTY) 1711f1e2261SMartin Matuska error = ZFS_ERR_NOT_USER_NAMESPACE; 1721f1e2261SMartin Matuska 1731f1e2261SMartin Matuska return (error); 1741f1e2261SMartin Matuska } 1751f1e2261SMartin Matuska 1761f1e2261SMartin Matuska static int 1771f1e2261SMartin Matuska zfs_ioc_userns_detach(zfs_cmd_t *zc) 1781f1e2261SMartin Matuska { 1791f1e2261SMartin Matuska int error; 1801f1e2261SMartin Matuska 1811f1e2261SMartin Matuska if (zc == NULL) 1821f1e2261SMartin Matuska return (SET_ERROR(EINVAL)); 1831f1e2261SMartin Matuska 1841f1e2261SMartin Matuska error = zone_dataset_detach(CRED(), zc->zc_name, zc->zc_cleanup_fd); 1851f1e2261SMartin Matuska 1861f1e2261SMartin Matuska /* 1871f1e2261SMartin Matuska * See the comment in zfs_ioc_userns_attach() for details on what is 1881f1e2261SMartin Matuska * going on here. 1891f1e2261SMartin Matuska */ 1901f1e2261SMartin Matuska if (error == ENOTTY) 1911f1e2261SMartin Matuska error = ZFS_ERR_NOT_USER_NAMESPACE; 1921f1e2261SMartin Matuska 1931f1e2261SMartin Matuska return (error); 1941f1e2261SMartin Matuska } 1951f1e2261SMartin Matuska 196eda14cbcSMatt Macy uint64_t 197eda14cbcSMatt Macy zfs_max_nvlist_src_size_os(void) 198eda14cbcSMatt Macy { 199eda14cbcSMatt Macy if (zfs_max_nvlist_src_size != 0) 200eda14cbcSMatt Macy return (zfs_max_nvlist_src_size); 201eda14cbcSMatt Macy 202caed7b1cSMartin Matuska return (MIN(ptob(zfs_totalram_pages) / 4, 128 * 1024 * 1024)); 203eda14cbcSMatt Macy } 204eda14cbcSMatt Macy 20516038816SMartin Matuska /* Update the VFS's cache of mountpoint properties */ 20616038816SMartin Matuska void 20716038816SMartin Matuska zfs_ioctl_update_mount_cache(const char *dsname) 20816038816SMartin Matuska { 20916038816SMartin Matuska } 21016038816SMartin Matuska 211eda14cbcSMatt Macy void 212eda14cbcSMatt Macy zfs_ioctl_init_os(void) 213eda14cbcSMatt Macy { 2141f1e2261SMartin Matuska zfs_ioctl_register_dataset_nolog(ZFS_IOC_USERNS_ATTACH, 2151f1e2261SMartin Matuska zfs_ioc_userns_attach, zfs_secpolicy_config, POOL_CHECK_NONE); 2161f1e2261SMartin Matuska zfs_ioctl_register_dataset_nolog(ZFS_IOC_USERNS_DETACH, 2171f1e2261SMartin Matuska zfs_ioc_userns_detach, zfs_secpolicy_config, POOL_CHECK_NONE); 218eda14cbcSMatt Macy } 219eda14cbcSMatt Macy 220eda14cbcSMatt Macy #ifdef CONFIG_COMPAT 221eda14cbcSMatt Macy static long 222eda14cbcSMatt Macy zfsdev_compat_ioctl(struct file *filp, unsigned cmd, unsigned long arg) 223eda14cbcSMatt Macy { 224eda14cbcSMatt Macy return (zfsdev_ioctl(filp, cmd, arg)); 225eda14cbcSMatt Macy } 226eda14cbcSMatt Macy #else 227eda14cbcSMatt Macy #define zfsdev_compat_ioctl NULL 228eda14cbcSMatt Macy #endif 229eda14cbcSMatt Macy 230eda14cbcSMatt Macy static const struct file_operations zfsdev_fops = { 231eda14cbcSMatt Macy .open = zfsdev_open, 232eda14cbcSMatt Macy .release = zfsdev_release, 233eda14cbcSMatt Macy .unlocked_ioctl = zfsdev_ioctl, 234eda14cbcSMatt Macy .compat_ioctl = zfsdev_compat_ioctl, 235eda14cbcSMatt Macy .owner = THIS_MODULE, 236eda14cbcSMatt Macy }; 237eda14cbcSMatt Macy 238eda14cbcSMatt Macy static struct miscdevice zfs_misc = { 239eda14cbcSMatt Macy .minor = ZFS_DEVICE_MINOR, 240eda14cbcSMatt Macy .name = ZFS_DRIVER, 241eda14cbcSMatt Macy .fops = &zfsdev_fops, 242eda14cbcSMatt Macy }; 243eda14cbcSMatt Macy 244eda14cbcSMatt Macy MODULE_ALIAS_MISCDEV(ZFS_DEVICE_MINOR); 245eda14cbcSMatt Macy MODULE_ALIAS("devname:zfs"); 246eda14cbcSMatt Macy 247eda14cbcSMatt Macy int 248eda14cbcSMatt Macy zfsdev_attach(void) 249eda14cbcSMatt Macy { 250eda14cbcSMatt Macy int error; 251eda14cbcSMatt Macy 252eda14cbcSMatt Macy error = misc_register(&zfs_misc); 253eda14cbcSMatt Macy if (error == -EBUSY) { 254eda14cbcSMatt Macy /* 255eda14cbcSMatt Macy * Fallback to dynamic minor allocation in the event of a 256eda14cbcSMatt Macy * collision with a reserved minor in linux/miscdevice.h. 257eda14cbcSMatt Macy * In this case the kernel modules must be manually loaded. 258eda14cbcSMatt Macy */ 259eda14cbcSMatt Macy printk(KERN_INFO "ZFS: misc_register() with static minor %d " 260eda14cbcSMatt Macy "failed %d, retrying with MISC_DYNAMIC_MINOR\n", 261eda14cbcSMatt Macy ZFS_DEVICE_MINOR, error); 262eda14cbcSMatt Macy 263eda14cbcSMatt Macy zfs_misc.minor = MISC_DYNAMIC_MINOR; 264eda14cbcSMatt Macy error = misc_register(&zfs_misc); 265eda14cbcSMatt Macy } 266eda14cbcSMatt Macy 267eda14cbcSMatt Macy if (error) 268eda14cbcSMatt Macy printk(KERN_INFO "ZFS: misc_register() failed %d\n", error); 269eda14cbcSMatt Macy 270eda14cbcSMatt Macy return (error); 271eda14cbcSMatt Macy } 272eda14cbcSMatt Macy 273eda14cbcSMatt Macy void 274eda14cbcSMatt Macy zfsdev_detach(void) 275eda14cbcSMatt Macy { 276eda14cbcSMatt Macy misc_deregister(&zfs_misc); 277eda14cbcSMatt Macy } 278eda14cbcSMatt Macy 279eda14cbcSMatt Macy #ifdef ZFS_DEBUG 280eda14cbcSMatt Macy #define ZFS_DEBUG_STR " (DEBUG mode)" 281eda14cbcSMatt Macy #else 282eda14cbcSMatt Macy #define ZFS_DEBUG_STR "" 283eda14cbcSMatt Macy #endif 284eda14cbcSMatt Macy 285d411c1d6SMartin Matuska zidmap_t *zfs_init_idmap; 286d411c1d6SMartin Matuska 287716fd348SMartin Matuska static int 288716fd348SMartin Matuska openzfs_init_os(void) 289eda14cbcSMatt Macy { 290eda14cbcSMatt Macy int error; 291eda14cbcSMatt Macy 292eda14cbcSMatt Macy if ((error = zfs_kmod_init()) != 0) { 293eda14cbcSMatt Macy printk(KERN_NOTICE "ZFS: Failed to Load ZFS Filesystem v%s-%s%s" 294eda14cbcSMatt Macy ", rc = %d\n", ZFS_META_VERSION, ZFS_META_RELEASE, 295eda14cbcSMatt Macy ZFS_DEBUG_STR, error); 296eda14cbcSMatt Macy 297eda14cbcSMatt Macy return (-error); 298eda14cbcSMatt Macy } 299eda14cbcSMatt Macy 300eda14cbcSMatt Macy zfs_sysfs_init(); 301eda14cbcSMatt Macy 302eda14cbcSMatt Macy printk(KERN_NOTICE "ZFS: Loaded module v%s-%s%s, " 303eda14cbcSMatt Macy "ZFS pool version %s, ZFS filesystem version %s\n", 304eda14cbcSMatt Macy ZFS_META_VERSION, ZFS_META_RELEASE, ZFS_DEBUG_STR, 305eda14cbcSMatt Macy SPA_VERSION_STRING, ZPL_VERSION_STRING); 306*7a7741afSMartin Matuska #ifdef HAVE_LINUX_EXPERIMENTAL 307*7a7741afSMartin Matuska printk(KERN_NOTICE "ZFS: Using ZFS with kernel %s is EXPERIMENTAL and " 308*7a7741afSMartin Matuska "SERIOUS DATA LOSS may occur!\n", utsname()->release); 309*7a7741afSMartin Matuska printk(KERN_NOTICE "ZFS: Please report your results at: " 310*7a7741afSMartin Matuska "https://github.com/openzfs/zfs/issues/new\n"); 311*7a7741afSMartin Matuska #endif 312eda14cbcSMatt Macy #ifndef CONFIG_FS_POSIX_ACL 313eda14cbcSMatt Macy printk(KERN_NOTICE "ZFS: Posix ACLs disabled by kernel\n"); 314eda14cbcSMatt Macy #endif /* CONFIG_FS_POSIX_ACL */ 315eda14cbcSMatt Macy 316d411c1d6SMartin Matuska zfs_init_idmap = (zidmap_t *)zfs_get_init_idmap(); 317d411c1d6SMartin Matuska 318eda14cbcSMatt Macy return (0); 319eda14cbcSMatt Macy } 320eda14cbcSMatt Macy 321716fd348SMartin Matuska static void 322716fd348SMartin Matuska openzfs_fini_os(void) 323eda14cbcSMatt Macy { 324eda14cbcSMatt Macy zfs_sysfs_fini(); 325eda14cbcSMatt Macy zfs_kmod_fini(); 326eda14cbcSMatt Macy 327eda14cbcSMatt Macy printk(KERN_NOTICE "ZFS: Unloaded module v%s-%s%s\n", 328eda14cbcSMatt Macy ZFS_META_VERSION, ZFS_META_RELEASE, ZFS_DEBUG_STR); 329eda14cbcSMatt Macy } 330eda14cbcSMatt Macy 331716fd348SMartin Matuska 332716fd348SMartin Matuska extern int __init zcommon_init(void); 333716fd348SMartin Matuska extern void zcommon_fini(void); 334716fd348SMartin Matuska 335716fd348SMartin Matuska static int __init 336716fd348SMartin Matuska openzfs_init(void) 337716fd348SMartin Matuska { 338716fd348SMartin Matuska int err; 339716fd348SMartin Matuska if ((err = zcommon_init()) != 0) 340716fd348SMartin Matuska goto zcommon_failed; 341716fd348SMartin Matuska if ((err = icp_init()) != 0) 342716fd348SMartin Matuska goto icp_failed; 343716fd348SMartin Matuska if ((err = zstd_init()) != 0) 344716fd348SMartin Matuska goto zstd_failed; 345716fd348SMartin Matuska if ((err = openzfs_init_os()) != 0) 346716fd348SMartin Matuska goto openzfs_os_failed; 347716fd348SMartin Matuska return (0); 348716fd348SMartin Matuska 349716fd348SMartin Matuska openzfs_os_failed: 350716fd348SMartin Matuska zstd_fini(); 351716fd348SMartin Matuska zstd_failed: 352716fd348SMartin Matuska icp_fini(); 353716fd348SMartin Matuska icp_failed: 354716fd348SMartin Matuska zcommon_fini(); 355716fd348SMartin Matuska zcommon_failed: 356716fd348SMartin Matuska return (err); 357716fd348SMartin Matuska } 358716fd348SMartin Matuska 359716fd348SMartin Matuska static void __exit 360716fd348SMartin Matuska openzfs_fini(void) 361716fd348SMartin Matuska { 362716fd348SMartin Matuska openzfs_fini_os(); 363716fd348SMartin Matuska zstd_fini(); 364716fd348SMartin Matuska icp_fini(); 365716fd348SMartin Matuska zcommon_fini(); 366716fd348SMartin Matuska } 367716fd348SMartin Matuska 368eda14cbcSMatt Macy #if defined(_KERNEL) 36916038816SMartin Matuska module_init(openzfs_init); 37016038816SMartin Matuska module_exit(openzfs_fini); 371eda14cbcSMatt Macy #endif 372eda14cbcSMatt Macy 373716fd348SMartin Matuska MODULE_ALIAS("zavl"); 374716fd348SMartin Matuska MODULE_ALIAS("icp"); 375716fd348SMartin Matuska MODULE_ALIAS("zlua"); 376716fd348SMartin Matuska MODULE_ALIAS("znvpair"); 377716fd348SMartin Matuska MODULE_ALIAS("zunicode"); 378716fd348SMartin Matuska MODULE_ALIAS("zcommon"); 379716fd348SMartin Matuska MODULE_ALIAS("zzstd"); 380716fd348SMartin Matuska MODULE_DESCRIPTION("ZFS"); 381716fd348SMartin Matuska MODULE_AUTHOR(ZFS_META_AUTHOR); 382271171e0SMartin Matuska MODULE_LICENSE("Dual MIT/GPL"); /* lua */ 383271171e0SMartin Matuska MODULE_LICENSE("Dual BSD/GPL"); /* zstd / misc */ 384716fd348SMartin Matuska MODULE_LICENSE(ZFS_META_LICENSE); 385716fd348SMartin Matuska MODULE_VERSION(ZFS_META_VERSION "-" ZFS_META_RELEASE); 386