The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/module/os/freebsd/zfs/kmod_core.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 2020 iXsystems, Inc.
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  *
   26  */
   27 
   28 #include <sys/cdefs.h>
   29 __FBSDID("$FreeBSD$");
   30 
   31 #include <sys/param.h>
   32 #include <sys/buf.h>
   33 #include <sys/cmn_err.h>
   34 #include <sys/conf.h>
   35 #include <sys/dmu.h>
   36 #include <sys/dmu_impl.h>
   37 #include <sys/dmu_objset.h>
   38 #include <sys/dmu_send.h>
   39 #include <sys/dmu_tx.h>
   40 #include <sys/dsl_bookmark.h>
   41 #include <sys/dsl_crypt.h>
   42 #include <sys/dsl_dataset.h>
   43 #include <sys/dsl_deleg.h>
   44 #include <sys/dsl_destroy.h>
   45 #include <sys/dsl_dir.h>
   46 #include <sys/dsl_prop.h>
   47 #include <sys/dsl_scan.h>
   48 #include <sys/dsl_userhold.h>
   49 #include <sys/errno.h>
   50 #include <sys/eventhandler.h>
   51 #include <sys/file.h>
   52 #include <sys/fm/util.h>
   53 #include <sys/fs/zfs.h>
   54 #include <sys/kernel.h>
   55 #include <sys/kmem.h>
   56 #include <sys/lock.h>
   57 #include <sys/malloc.h>
   58 #include <sys/mount.h>
   59 #include <sys/mutex.h>
   60 #include <sys/nvpair.h>
   61 #include <sys/policy.h>
   62 #include <sys/proc.h>
   63 #include <sys/sdt.h>
   64 #include <sys/spa.h>
   65 #include <sys/spa_impl.h>
   66 #include <sys/stat.h>
   67 #include <sys/sunddi.h>
   68 #include <sys/systm.h>
   69 #include <sys/taskqueue.h>
   70 #include <sys/uio.h>
   71 #include <sys/vdev.h>
   72 #include <sys/vdev_removal.h>
   73 #include <sys/zap.h>
   74 #include <sys/zcp.h>
   75 #include <sys/zfeature.h>
   76 #include <sys/zfs_context.h>
   77 #include <sys/zfs_ctldir.h>
   78 #include <sys/zfs_dir.h>
   79 #include <sys/zfs_ioctl.h>
   80 #include <sys/zfs_ioctl_compat.h>
   81 #include <sys/zfs_ioctl_impl.h>
   82 #include <sys/zfs_onexit.h>
   83 #include <sys/zfs_vfsops.h>
   84 #include <sys/zfs_znode.h>
   85 #include <sys/zio_checksum.h>
   86 #include <sys/zone.h>
   87 #include <sys/zvol.h>
   88 
   89 #include "zfs_comutil.h"
   90 #include "zfs_deleg.h"
   91 #include "zfs_namecheck.h"
   92 #include "zfs_prop.h"
   93 
   94 SYSCTL_DECL(_vfs_zfs);
   95 SYSCTL_DECL(_vfs_zfs_vdev);
   96 
   97 extern uint_t rrw_tsd_key;
   98 static int zfs_version_ioctl = ZFS_IOCVER_OZFS;
   99 SYSCTL_DECL(_vfs_zfs_version);
  100 SYSCTL_INT(_vfs_zfs_version, OID_AUTO, ioctl, CTLFLAG_RD, &zfs_version_ioctl,
  101     0, "ZFS_IOCTL_VERSION");
  102 
  103 static struct cdev *zfsdev;
  104 
  105 static struct root_hold_token *zfs_root_token;
  106 
  107 extern uint_t rrw_tsd_key;
  108 extern uint_t zfs_allow_log_key;
  109 extern uint_t zfs_geom_probe_vdev_key;
  110 
  111 static int zfs__init(void);
  112 static int zfs__fini(void);
  113 static void zfs_shutdown(void *, int);
  114 
  115 static eventhandler_tag zfs_shutdown_event_tag;
  116 
  117 #define ZFS_MIN_KSTACK_PAGES 4
  118 
  119 static int
  120 zfsdev_ioctl(struct cdev *dev, ulong_t zcmd, caddr_t arg, int flag,
  121     struct thread *td)
  122 {
  123         uint_t len;
  124         int vecnum;
  125         zfs_iocparm_t *zp;
  126         zfs_cmd_t *zc;
  127 #ifdef ZFS_LEGACY_SUPPORT
  128         zfs_cmd_legacy_t *zcl;
  129 #endif
  130         int rc, error;
  131         void *uaddr;
  132 
  133         len = IOCPARM_LEN(zcmd);
  134         vecnum = zcmd & 0xff;
  135         zp = (void *)arg;
  136         error = 0;
  137 #ifdef ZFS_LEGACY_SUPPORT
  138         zcl = NULL;
  139 #endif
  140 
  141         if (len != sizeof (zfs_iocparm_t))
  142                 return (EINVAL);
  143 
  144         uaddr = (void *)(uintptr_t)zp->zfs_cmd;
  145         zc = kmem_zalloc(sizeof (zfs_cmd_t), KM_SLEEP);
  146 #ifdef ZFS_LEGACY_SUPPORT
  147         /*
  148          * Remap ioctl code for legacy user binaries
  149          */
  150         if (zp->zfs_ioctl_version == ZFS_IOCVER_LEGACY) {
  151                 vecnum = zfs_ioctl_legacy_to_ozfs(vecnum);
  152                 if (vecnum < 0) {
  153                         kmem_free(zc, sizeof (zfs_cmd_t));
  154                         return (ENOTSUP);
  155                 }
  156                 zcl = kmem_zalloc(sizeof (zfs_cmd_legacy_t), KM_SLEEP);
  157                 if (copyin(uaddr, zcl, sizeof (zfs_cmd_legacy_t))) {
  158                         error = SET_ERROR(EFAULT);
  159                         goto out;
  160                 }
  161                 zfs_cmd_legacy_to_ozfs(zcl, zc);
  162         } else
  163 #endif
  164         if (copyin(uaddr, zc, sizeof (zfs_cmd_t))) {
  165                 error = SET_ERROR(EFAULT);
  166                 goto out;
  167         }
  168         error = zfsdev_ioctl_common(vecnum, zc, 0);
  169 #ifdef ZFS_LEGACY_SUPPORT
  170         if (zcl) {
  171                 zfs_cmd_ozfs_to_legacy(zc, zcl);
  172                 rc = copyout(zcl, uaddr, sizeof (*zcl));
  173         } else
  174 #endif
  175         {
  176                 rc = copyout(zc, uaddr, sizeof (*zc));
  177         }
  178         if (error == 0 && rc != 0)
  179                 error = SET_ERROR(EFAULT);
  180 out:
  181 #ifdef ZFS_LEGACY_SUPPORT
  182         if (zcl)
  183                 kmem_free(zcl, sizeof (zfs_cmd_legacy_t));
  184 #endif
  185         kmem_free(zc, sizeof (zfs_cmd_t));
  186         MPASS(tsd_get(rrw_tsd_key) == NULL);
  187         return (error);
  188 }
  189 
  190 static void
  191 zfsdev_close(void *data)
  192 {
  193         zfsdev_state_destroy(data);
  194 }
  195 
  196 void
  197 zfsdev_private_set_state(void *priv __unused, zfsdev_state_t *zs)
  198 {
  199         devfs_set_cdevpriv(zs, zfsdev_close);
  200 }
  201 
  202 zfsdev_state_t *
  203 zfsdev_private_get_state(void *priv)
  204 {
  205         return (priv);
  206 }
  207 
  208 static int
  209 zfsdev_open(struct cdev *devp __unused, int flag __unused, int mode __unused,
  210     struct thread *td __unused)
  211 {
  212         int error;
  213 
  214         mutex_enter(&zfsdev_state_lock);
  215         error = zfsdev_state_init(NULL);
  216         mutex_exit(&zfsdev_state_lock);
  217 
  218         return (error);
  219 }
  220 
  221 static struct cdevsw zfs_cdevsw = {
  222         .d_version =    D_VERSION,
  223         .d_open =       zfsdev_open,
  224         .d_ioctl =      zfsdev_ioctl,
  225         .d_name =       ZFS_DRIVER
  226 };
  227 
  228 int
  229 zfsdev_attach(void)
  230 {
  231         struct make_dev_args args;
  232 
  233         make_dev_args_init(&args);
  234         args.mda_flags = MAKEDEV_CHECKNAME | MAKEDEV_WAITOK;
  235         args.mda_devsw = &zfs_cdevsw;
  236         args.mda_cr = NULL;
  237         args.mda_uid = UID_ROOT;
  238         args.mda_gid = GID_OPERATOR;
  239         args.mda_mode = 0666;
  240         return (make_dev_s(&args, &zfsdev, ZFS_DRIVER));
  241 }
  242 
  243 void
  244 zfsdev_detach(void)
  245 {
  246         if (zfsdev != NULL)
  247                 destroy_dev(zfsdev);
  248 }
  249 
  250 int
  251 zfs__init(void)
  252 {
  253         int error;
  254 
  255 #if KSTACK_PAGES < ZFS_MIN_KSTACK_PAGES
  256         printf("ZFS NOTICE: KSTACK_PAGES is %d which could result in stack "
  257             "overflow panic!\nPlease consider adding "
  258             "'options KSTACK_PAGES=%d' to your kernel config\n", KSTACK_PAGES,
  259             ZFS_MIN_KSTACK_PAGES);
  260 #endif
  261         zfs_root_token = root_mount_hold("ZFS");
  262         if ((error = zfs_kmod_init()) != 0) {
  263                 printf("ZFS: Failed to Load ZFS Filesystem"
  264                     ", rc = %d\n", error);
  265                 root_mount_rel(zfs_root_token);
  266                 return (error);
  267         }
  268 
  269 
  270         tsd_create(&zfs_geom_probe_vdev_key, NULL);
  271 
  272         printf("ZFS storage pool version: features support ("
  273             SPA_VERSION_STRING ")\n");
  274         root_mount_rel(zfs_root_token);
  275         ddi_sysevent_init();
  276         return (0);
  277 }
  278 
  279 int
  280 zfs__fini(void)
  281 {
  282         if (zfs_busy() || zvol_busy() ||
  283             zio_injection_enabled) {
  284                 return (EBUSY);
  285         }
  286         zfs_kmod_fini();
  287         tsd_destroy(&zfs_geom_probe_vdev_key);
  288         return (0);
  289 }
  290 
  291 static void
  292 zfs_shutdown(void *arg __unused, int howto __unused)
  293 {
  294 
  295         /*
  296          * ZFS fini routines can not properly work in a panic-ed system.
  297          */
  298         if (panicstr == NULL)
  299                 zfs__fini();
  300 }
  301 
  302 static int
  303 zfs_modevent(module_t mod, int type, void *unused __unused)
  304 {
  305         int err;
  306 
  307         switch (type) {
  308         case MOD_LOAD:
  309                 err = zfs__init();
  310                 if (err == 0)
  311                         zfs_shutdown_event_tag = EVENTHANDLER_REGISTER(
  312                             shutdown_post_sync, zfs_shutdown, NULL,
  313                             SHUTDOWN_PRI_FIRST);
  314                 return (err);
  315         case MOD_UNLOAD:
  316                 err = zfs__fini();
  317                 if (err == 0 && zfs_shutdown_event_tag != NULL)
  318                         EVENTHANDLER_DEREGISTER(shutdown_post_sync,
  319                             zfs_shutdown_event_tag);
  320                 return (err);
  321         case MOD_SHUTDOWN:
  322                 return (0);
  323         default:
  324                 break;
  325         }
  326         return (EOPNOTSUPP);
  327 }
  328 
  329 static moduledata_t zfs_mod = {
  330         "zfsctrl",
  331         zfs_modevent,
  332         0
  333 };
  334 
  335 #ifdef _KERNEL
  336 EVENTHANDLER_DEFINE(mountroot, spa_boot_init, NULL, 0);
  337 #endif
  338 
  339 DECLARE_MODULE(zfsctrl, zfs_mod, SI_SUB_CLOCKS, SI_ORDER_ANY);
  340 MODULE_VERSION(zfsctrl, 1);
  341 #if __FreeBSD_version > 1300092
  342 MODULE_DEPEND(zfsctrl, xdr, 1, 1, 1);
  343 #else
  344 MODULE_DEPEND(zfsctrl, krpc, 1, 1, 1);
  345 #endif
  346 MODULE_DEPEND(zfsctrl, acl_nfs4, 1, 1, 1);
  347 MODULE_DEPEND(zfsctrl, crypto, 1, 1, 1);
  348 MODULE_DEPEND(zfsctrl, zlib, 1, 1, 1);

Cache object: 190689e60be30ebc4584e95663c61c2c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.