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 https://opensource.org/licenses/CDDL-1.0.
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.
40 * Copyright (c) 2021 Klara, Inc.
43 #include <sys/types.h>
44 #include <sys/param.h>
45 #include <sys/errno.h>
50 #include <sys/zfs_ioctl.h>
51 #include <sys/zfs_vfsops.h>
54 #include <sys/nvpair.h>
55 #include <sys/fs/zfs.h>
56 #include <sys/zfs_ctldir.h>
57 #include <sys/zfs_dir.h>
58 #include <sys/zfs_onexit.h>
60 #include <sys/fm/util.h>
61 #include <sys/dsl_crypt.h>
62 #include <sys/crypto/icp.h>
63 #include <sys/zstd/zstd.h>
65 #include <sys/zfs_ioctl_impl.h>
67 #include <sys/zfs_sysfs.h>
68 #include <linux/miscdevice.h>
69 #include <linux/slab.h>
72 zfs_vfs_held(zfsvfs_t
*zfsvfs
)
74 return (zfsvfs
->z_sb
!= NULL
);
78 zfs_vfs_ref(zfsvfs_t
**zfvp
)
80 if (*zfvp
== NULL
|| (*zfvp
)->z_sb
== NULL
||
81 !atomic_inc_not_zero(&((*zfvp
)->z_sb
->s_active
))) {
82 return (SET_ERROR(ESRCH
));
88 zfs_vfs_rele(zfsvfs_t
*zfsvfs
)
90 deactivate_super(zfsvfs
->z_sb
);
94 zfsdev_private_set_state(void *priv
, zfsdev_state_t
*zs
)
96 struct file
*filp
= priv
;
98 filp
->private_data
= zs
;
102 zfsdev_private_get_state(void *priv
)
104 struct file
*filp
= priv
;
106 return (filp
->private_data
);
110 zfsdev_open(struct inode
*ino
, struct file
*filp
)
114 mutex_enter(&zfsdev_state_lock
);
115 error
= zfsdev_state_init(filp
);
116 mutex_exit(&zfsdev_state_lock
);
122 zfsdev_release(struct inode
*ino
, struct file
*filp
)
124 zfsdev_state_destroy(filp
);
130 zfsdev_ioctl(struct file
*filp
, unsigned cmd
, unsigned long arg
)
136 vecnum
= cmd
- ZFS_IOC_FIRST
;
138 zc
= vmem_zalloc(sizeof (zfs_cmd_t
), KM_SLEEP
);
140 if (ddi_copyin((void *)(uintptr_t)arg
, zc
, sizeof (zfs_cmd_t
), 0)) {
141 error
= -SET_ERROR(EFAULT
);
144 error
= -zfsdev_ioctl_common(vecnum
, zc
, 0);
145 rc
= ddi_copyout(zc
, (void *)(uintptr_t)arg
, sizeof (zfs_cmd_t
), 0);
146 if (error
== 0 && rc
!= 0)
147 error
= -SET_ERROR(EFAULT
);
149 vmem_free(zc
, sizeof (zfs_cmd_t
));
155 zfs_ioc_userns_attach(zfs_cmd_t
*zc
)
160 return (SET_ERROR(EINVAL
));
162 error
= zone_dataset_attach(CRED(), zc
->zc_name
, zc
->zc_cleanup_fd
);
165 * Translate ENOTTY to ZFS_ERR_NOT_USER_NAMESPACE as we just arrived
166 * back from the SPL layer, which does not know about ZFS_ERR_* errors.
167 * See the comment at the user_ns_get() function in spl-zone.c for
171 error
= ZFS_ERR_NOT_USER_NAMESPACE
;
177 zfs_ioc_userns_detach(zfs_cmd_t
*zc
)
182 return (SET_ERROR(EINVAL
));
184 error
= zone_dataset_detach(CRED(), zc
->zc_name
, zc
->zc_cleanup_fd
);
187 * See the comment in zfs_ioc_userns_attach() for details on what is
191 error
= ZFS_ERR_NOT_USER_NAMESPACE
;
197 zfs_max_nvlist_src_size_os(void)
199 if (zfs_max_nvlist_src_size
!= 0)
200 return (zfs_max_nvlist_src_size
);
202 return (MIN(ptob(zfs_totalram_pages
) / 4, 128 * 1024 * 1024));
205 /* Update the VFS's cache of mountpoint properties */
207 zfs_ioctl_update_mount_cache(const char *dsname
)
212 zfs_ioctl_init_os(void)
214 zfs_ioctl_register_dataset_nolog(ZFS_IOC_USERNS_ATTACH
,
215 zfs_ioc_userns_attach
, zfs_secpolicy_config
, POOL_CHECK_NONE
);
216 zfs_ioctl_register_dataset_nolog(ZFS_IOC_USERNS_DETACH
,
217 zfs_ioc_userns_detach
, zfs_secpolicy_config
, POOL_CHECK_NONE
);
222 zfsdev_compat_ioctl(struct file
*filp
, unsigned cmd
, unsigned long arg
)
224 return (zfsdev_ioctl(filp
, cmd
, arg
));
227 #define zfsdev_compat_ioctl NULL
230 static const struct file_operations zfsdev_fops
= {
232 .release
= zfsdev_release
,
233 .unlocked_ioctl
= zfsdev_ioctl
,
234 .compat_ioctl
= zfsdev_compat_ioctl
,
235 .owner
= THIS_MODULE
,
238 static struct miscdevice zfs_misc
= {
239 .minor
= ZFS_DEVICE_MINOR
,
241 .fops
= &zfsdev_fops
,
244 MODULE_ALIAS_MISCDEV(ZFS_DEVICE_MINOR
);
245 MODULE_ALIAS("devname:zfs");
252 error
= misc_register(&zfs_misc
);
253 if (error
== -EBUSY
) {
255 * Fallback to dynamic minor allocation in the event of a
256 * collision with a reserved minor in linux/miscdevice.h.
257 * In this case the kernel modules must be manually loaded.
259 printk(KERN_INFO
"ZFS: misc_register() with static minor %d "
260 "failed %d, retrying with MISC_DYNAMIC_MINOR\n",
261 ZFS_DEVICE_MINOR
, error
);
263 zfs_misc
.minor
= MISC_DYNAMIC_MINOR
;
264 error
= misc_register(&zfs_misc
);
268 printk(KERN_INFO
"ZFS: misc_register() failed %d\n", error
);
276 misc_deregister(&zfs_misc
);
280 #define ZFS_DEBUG_STR " (DEBUG mode)"
282 #define ZFS_DEBUG_STR ""
285 zidmap_t
*zfs_init_idmap
;
288 openzfs_init_os(void)
292 if ((error
= zfs_kmod_init()) != 0) {
293 printk(KERN_NOTICE
"ZFS: Failed to Load ZFS Filesystem v%s-%s%s"
294 ", rc = %d\n", ZFS_META_VERSION
, ZFS_META_RELEASE
,
295 ZFS_DEBUG_STR
, error
);
302 printk(KERN_NOTICE
"ZFS: Loaded module v%s-%s%s, "
303 "ZFS pool version %s, ZFS filesystem version %s\n",
304 ZFS_META_VERSION
, ZFS_META_RELEASE
, ZFS_DEBUG_STR
,
305 SPA_VERSION_STRING
, ZPL_VERSION_STRING
);
306 #ifdef HAVE_LINUX_EXPERIMENTAL
307 printk(KERN_NOTICE
"ZFS: Using ZFS with kernel %s is EXPERIMENTAL and "
308 "SERIOUS DATA LOSS may occur!\n", utsname()->release
);
309 printk(KERN_NOTICE
"ZFS: Please report your results at: "
310 "https://github.com/openzfs/zfs/issues/new\n");
312 #ifndef CONFIG_FS_POSIX_ACL
313 printk(KERN_NOTICE
"ZFS: Posix ACLs disabled by kernel\n");
314 #endif /* CONFIG_FS_POSIX_ACL */
316 zfs_init_idmap
= (zidmap_t
*)zfs_get_init_idmap();
322 openzfs_fini_os(void)
327 printk(KERN_NOTICE
"ZFS: Unloaded module v%s-%s%s\n",
328 ZFS_META_VERSION
, ZFS_META_RELEASE
, ZFS_DEBUG_STR
);
332 extern int __init
zcommon_init(void);
333 extern void zcommon_fini(void);
339 if ((err
= zcommon_init()) != 0)
341 if ((err
= icp_init()) != 0)
343 if ((err
= zstd_init()) != 0)
345 if ((err
= openzfs_init_os()) != 0)
346 goto openzfs_os_failed
;
369 module_init(openzfs_init
);
370 module_exit(openzfs_fini
);
373 MODULE_ALIAS("zavl");
375 MODULE_ALIAS("zlua");
376 MODULE_ALIAS("znvpair");
377 MODULE_ALIAS("zunicode");
378 MODULE_ALIAS("zcommon");
379 MODULE_ALIAS("zzstd");
380 MODULE_DESCRIPTION("ZFS");
381 MODULE_AUTHOR(ZFS_META_AUTHOR
);
382 MODULE_LICENSE("Dual MIT/GPL"); /* lua */
383 MODULE_LICENSE("Dual BSD/GPL"); /* zstd / misc */
384 MODULE_LICENSE(ZFS_META_LICENSE
);
385 MODULE_VERSION(ZFS_META_VERSION
"-" ZFS_META_RELEASE
);