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.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
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]
23 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Portions Copyright 2011 Martin Matuska
25 * Copyright 2015, OmniTI Computer Consulting, Inc. All rights reserved.
26 * Portions Copyright 2012 Pawel Jakub Dawidek <pawel@dawidek.net>
27 * Copyright (c) 2014, 2016 Joyent, Inc. All rights reserved.
28 * Copyright 2016 Nexenta Systems, Inc. All rights reserved.
29 * Copyright (c) 2014, Joyent, Inc. All rights reserved.
30 * Copyright (c) 2011, 2018 by Delphix. All rights reserved.
31 * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
32 * Copyright (c) 2013 Steven Hartland. All rights reserved.
33 * Copyright (c) 2014 Integros [integros.com]
34 * Copyright 2016 Toomas Soome <tsoome@me.com>
35 * Copyright (c) 2016 Actifio, Inc. All rights reserved.
36 * Copyright (c) 2018, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
37 * Copyright 2017 RackTop Systems.
38 * Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
39 * Copyright (c) 2019 Datto Inc.
42 #include <sys/types.h>
43 #include <sys/param.h>
44 #include <sys/errno.h>
49 #include <sys/zfs_ioctl.h>
50 #include <sys/zfs_vfsops.h>
53 #include <sys/nvpair.h>
54 #include <sys/fs/zfs.h>
55 #include <sys/zfs_ctldir.h>
56 #include <sys/zfs_dir.h>
57 #include <sys/zfs_onexit.h>
59 #include <sys/fm/util.h>
60 #include <sys/dsl_crypt.h>
61 #include <sys/crypto/icp.h>
62 #include <sys/zstd/zstd.h>
64 #include <sys/zfs_ioctl_impl.h>
66 #include <sys/zfs_sysfs.h>
67 #include <linux/miscdevice.h>
68 #include <linux/slab.h>
71 zfs_vfs_held(zfsvfs_t
*zfsvfs
)
73 return (zfsvfs
->z_sb
!= NULL
);
77 zfs_vfs_ref(zfsvfs_t
**zfvp
)
79 if (*zfvp
== NULL
|| (*zfvp
)->z_sb
== NULL
||
80 !atomic_inc_not_zero(&((*zfvp
)->z_sb
->s_active
))) {
81 return (SET_ERROR(ESRCH
));
87 zfs_vfs_rele(zfsvfs_t
*zfsvfs
)
89 deactivate_super(zfsvfs
->z_sb
);
93 zfsdev_private_set_state(void *priv
, zfsdev_state_t
*zs
)
95 struct file
*filp
= priv
;
97 filp
->private_data
= zs
;
101 zfsdev_private_get_state(void *priv
)
103 struct file
*filp
= priv
;
105 return (filp
->private_data
);
109 zfsdev_open(struct inode
*ino
, struct file
*filp
)
113 mutex_enter(&zfsdev_state_lock
);
114 error
= zfsdev_state_init(filp
);
115 mutex_exit(&zfsdev_state_lock
);
121 zfsdev_release(struct inode
*ino
, struct file
*filp
)
123 zfsdev_state_destroy(filp
);
129 zfsdev_ioctl(struct file
*filp
, unsigned cmd
, unsigned long arg
)
135 vecnum
= cmd
- ZFS_IOC_FIRST
;
137 zc
= kmem_zalloc(sizeof (zfs_cmd_t
), KM_SLEEP
);
139 if (ddi_copyin((void *)(uintptr_t)arg
, zc
, sizeof (zfs_cmd_t
), 0)) {
140 error
= -SET_ERROR(EFAULT
);
143 error
= -zfsdev_ioctl_common(vecnum
, zc
, 0);
144 rc
= ddi_copyout(zc
, (void *)(uintptr_t)arg
, sizeof (zfs_cmd_t
), 0);
145 if (error
== 0 && rc
!= 0)
146 error
= -SET_ERROR(EFAULT
);
148 kmem_free(zc
, sizeof (zfs_cmd_t
));
154 zfs_max_nvlist_src_size_os(void)
156 if (zfs_max_nvlist_src_size
!= 0)
157 return (zfs_max_nvlist_src_size
);
159 return (MIN(ptob(zfs_totalram_pages
) / 4, 128 * 1024 * 1024));
162 /* Update the VFS's cache of mountpoint properties */
164 zfs_ioctl_update_mount_cache(const char *dsname
)
169 zfs_ioctl_init_os(void)
175 zfsdev_compat_ioctl(struct file
*filp
, unsigned cmd
, unsigned long arg
)
177 return (zfsdev_ioctl(filp
, cmd
, arg
));
180 #define zfsdev_compat_ioctl NULL
183 static const struct file_operations zfsdev_fops
= {
185 .release
= zfsdev_release
,
186 .unlocked_ioctl
= zfsdev_ioctl
,
187 .compat_ioctl
= zfsdev_compat_ioctl
,
188 .owner
= THIS_MODULE
,
191 static struct miscdevice zfs_misc
= {
192 .minor
= ZFS_DEVICE_MINOR
,
194 .fops
= &zfsdev_fops
,
197 MODULE_ALIAS_MISCDEV(ZFS_DEVICE_MINOR
);
198 MODULE_ALIAS("devname:zfs");
205 error
= misc_register(&zfs_misc
);
206 if (error
== -EBUSY
) {
208 * Fallback to dynamic minor allocation in the event of a
209 * collision with a reserved minor in linux/miscdevice.h.
210 * In this case the kernel modules must be manually loaded.
212 printk(KERN_INFO
"ZFS: misc_register() with static minor %d "
213 "failed %d, retrying with MISC_DYNAMIC_MINOR\n",
214 ZFS_DEVICE_MINOR
, error
);
216 zfs_misc
.minor
= MISC_DYNAMIC_MINOR
;
217 error
= misc_register(&zfs_misc
);
221 printk(KERN_INFO
"ZFS: misc_register() failed %d\n", error
);
229 misc_deregister(&zfs_misc
);
233 #define ZFS_DEBUG_STR " (DEBUG mode)"
235 #define ZFS_DEBUG_STR ""
239 openzfs_init_os(void)
243 if ((error
= zfs_kmod_init()) != 0) {
244 printk(KERN_NOTICE
"ZFS: Failed to Load ZFS Filesystem v%s-%s%s"
245 ", rc = %d\n", ZFS_META_VERSION
, ZFS_META_RELEASE
,
246 ZFS_DEBUG_STR
, error
);
253 printk(KERN_NOTICE
"ZFS: Loaded module v%s-%s%s, "
254 "ZFS pool version %s, ZFS filesystem version %s\n",
255 ZFS_META_VERSION
, ZFS_META_RELEASE
, ZFS_DEBUG_STR
,
256 SPA_VERSION_STRING
, ZPL_VERSION_STRING
);
257 #ifndef CONFIG_FS_POSIX_ACL
258 printk(KERN_NOTICE
"ZFS: Posix ACLs disabled by kernel\n");
259 #endif /* CONFIG_FS_POSIX_ACL */
265 openzfs_fini_os(void)
270 printk(KERN_NOTICE
"ZFS: Unloaded module v%s-%s%s\n",
271 ZFS_META_VERSION
, ZFS_META_RELEASE
, ZFS_DEBUG_STR
);
275 extern int __init
zcommon_init(void);
276 extern void zcommon_fini(void);
282 if ((err
= zcommon_init()) != 0)
284 if ((err
= icp_init()) != 0)
286 if ((err
= zstd_init()) != 0)
288 if ((err
= openzfs_init_os()) != 0)
289 goto openzfs_os_failed
;
312 module_init(openzfs_init
);
313 module_exit(openzfs_fini
);
316 MODULE_ALIAS("zavl");
318 MODULE_ALIAS("zlua");
319 MODULE_ALIAS("znvpair");
320 MODULE_ALIAS("zunicode");
321 MODULE_ALIAS("zcommon");
322 MODULE_ALIAS("zzstd");
323 MODULE_DESCRIPTION("ZFS");
324 MODULE_AUTHOR(ZFS_META_AUTHOR
);
325 MODULE_LICENSE("Lua: MIT");
326 MODULE_LICENSE("zstd: Dual BSD/GPL");
327 MODULE_LICENSE("Dual BSD/GPL");
328 MODULE_LICENSE(ZFS_META_LICENSE
);
329 MODULE_VERSION(ZFS_META_VERSION
"-" ZFS_META_RELEASE
);