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
zfs_vfs_held(zfsvfs_t * zfsvfs)72eda14cbcSMatt Macy zfs_vfs_held(zfsvfs_t *zfsvfs)
73eda14cbcSMatt Macy {
74eda14cbcSMatt Macy 	return (zfsvfs->z_sb != NULL);
75eda14cbcSMatt Macy }
76eda14cbcSMatt Macy 
77eda14cbcSMatt Macy int
zfs_vfs_ref(zfsvfs_t ** zfvp)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
zfs_vfs_rele(zfsvfs_t * zfsvfs)88eda14cbcSMatt Macy zfs_vfs_rele(zfsvfs_t *zfsvfs)
89eda14cbcSMatt Macy {
90eda14cbcSMatt Macy 	deactivate_super(zfsvfs->z_sb);
91eda14cbcSMatt Macy }
92eda14cbcSMatt Macy 
9316038816SMartin Matuska void
zfsdev_private_set_state(void * priv,zfsdev_state_t * zs)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 *
zfsdev_private_get_state(void * priv)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
zfsdev_open(struct inode * ino,struct file * filp)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
zfsdev_release(struct inode * ino,struct file * filp)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
zfsdev_ioctl(struct file * filp,unsigned cmd,unsigned long arg)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
zfs_ioc_userns_attach(zfs_cmd_t * zc)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
zfs_ioc_userns_detach(zfs_cmd_t * zc)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
zfs_max_nvlist_src_size_os(void)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
zfs_ioctl_update_mount_cache(const char * dsname)20716038816SMartin Matuska zfs_ioctl_update_mount_cache(const char *dsname)
20816038816SMartin Matuska {
20916038816SMartin Matuska }
21016038816SMartin Matuska 
211eda14cbcSMatt Macy void
zfs_ioctl_init_os(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
zfsdev_compat_ioctl(struct file * filp,unsigned cmd,unsigned long arg)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
zfsdev_attach(void)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
zfsdev_detach(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 
285*d411c1d6SMartin Matuska zidmap_t *zfs_init_idmap;
286*d411c1d6SMartin Matuska 
287716fd348SMartin Matuska static int
openzfs_init_os(void)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);
306eda14cbcSMatt Macy #ifndef CONFIG_FS_POSIX_ACL
307eda14cbcSMatt Macy 	printk(KERN_NOTICE "ZFS: Posix ACLs disabled by kernel\n");
308eda14cbcSMatt Macy #endif /* CONFIG_FS_POSIX_ACL */
309eda14cbcSMatt Macy 
310*d411c1d6SMartin Matuska 	zfs_init_idmap = (zidmap_t *)zfs_get_init_idmap();
311*d411c1d6SMartin Matuska 
312eda14cbcSMatt Macy 	return (0);
313eda14cbcSMatt Macy }
314eda14cbcSMatt Macy 
315716fd348SMartin Matuska static void
openzfs_fini_os(void)316716fd348SMartin Matuska openzfs_fini_os(void)
317eda14cbcSMatt Macy {
318eda14cbcSMatt Macy 	zfs_sysfs_fini();
319eda14cbcSMatt Macy 	zfs_kmod_fini();
320eda14cbcSMatt Macy 
321eda14cbcSMatt Macy 	printk(KERN_NOTICE "ZFS: Unloaded module v%s-%s%s\n",
322eda14cbcSMatt Macy 	    ZFS_META_VERSION, ZFS_META_RELEASE, ZFS_DEBUG_STR);
323eda14cbcSMatt Macy }
324eda14cbcSMatt Macy 
325716fd348SMartin Matuska 
326716fd348SMartin Matuska extern int __init zcommon_init(void);
327716fd348SMartin Matuska extern void zcommon_fini(void);
328716fd348SMartin Matuska 
329716fd348SMartin Matuska static int __init
openzfs_init(void)330716fd348SMartin Matuska openzfs_init(void)
331716fd348SMartin Matuska {
332716fd348SMartin Matuska 	int err;
333716fd348SMartin Matuska 	if ((err = zcommon_init()) != 0)
334716fd348SMartin Matuska 		goto zcommon_failed;
335716fd348SMartin Matuska 	if ((err = icp_init()) != 0)
336716fd348SMartin Matuska 		goto icp_failed;
337716fd348SMartin Matuska 	if ((err = zstd_init()) != 0)
338716fd348SMartin Matuska 		goto zstd_failed;
339716fd348SMartin Matuska 	if ((err = openzfs_init_os()) != 0)
340716fd348SMartin Matuska 		goto openzfs_os_failed;
341716fd348SMartin Matuska 	return (0);
342716fd348SMartin Matuska 
343716fd348SMartin Matuska openzfs_os_failed:
344716fd348SMartin Matuska 	zstd_fini();
345716fd348SMartin Matuska zstd_failed:
346716fd348SMartin Matuska 	icp_fini();
347716fd348SMartin Matuska icp_failed:
348716fd348SMartin Matuska 	zcommon_fini();
349716fd348SMartin Matuska zcommon_failed:
350716fd348SMartin Matuska 	return (err);
351716fd348SMartin Matuska }
352716fd348SMartin Matuska 
353716fd348SMartin Matuska static void __exit
openzfs_fini(void)354716fd348SMartin Matuska openzfs_fini(void)
355716fd348SMartin Matuska {
356716fd348SMartin Matuska 	openzfs_fini_os();
357716fd348SMartin Matuska 	zstd_fini();
358716fd348SMartin Matuska 	icp_fini();
359716fd348SMartin Matuska 	zcommon_fini();
360716fd348SMartin Matuska }
361716fd348SMartin Matuska 
362eda14cbcSMatt Macy #if defined(_KERNEL)
36316038816SMartin Matuska module_init(openzfs_init);
36416038816SMartin Matuska module_exit(openzfs_fini);
365eda14cbcSMatt Macy #endif
366eda14cbcSMatt Macy 
367716fd348SMartin Matuska MODULE_ALIAS("zavl");
368716fd348SMartin Matuska MODULE_ALIAS("icp");
369716fd348SMartin Matuska MODULE_ALIAS("zlua");
370716fd348SMartin Matuska MODULE_ALIAS("znvpair");
371716fd348SMartin Matuska MODULE_ALIAS("zunicode");
372716fd348SMartin Matuska MODULE_ALIAS("zcommon");
373716fd348SMartin Matuska MODULE_ALIAS("zzstd");
374716fd348SMartin Matuska MODULE_DESCRIPTION("ZFS");
375716fd348SMartin Matuska MODULE_AUTHOR(ZFS_META_AUTHOR);
376271171e0SMartin Matuska MODULE_LICENSE("Dual MIT/GPL"); /* lua */
377271171e0SMartin Matuska MODULE_LICENSE("Dual BSD/GPL"); /* zstd / misc */
378716fd348SMartin Matuska MODULE_LICENSE(ZFS_META_LICENSE);
379716fd348SMartin Matuska MODULE_VERSION(ZFS_META_VERSION "-" ZFS_META_RELEASE);
380