]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
MFC r296519: MFV r296518: 5027 zfs large block support (add copyright)
[FreeBSD/stable/10.git] / sys / cddl / contrib / opensolaris / uts / common / fs / zfs / zfs_ioctl.c
1 /*
2  * CDDL HEADER START
3  *
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.
7  *
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.
12  *
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]
18  *
19  * CDDL HEADER END
20  */
21
22 /*
23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Copyright (c) 2011-2012 Pawel Jakub Dawidek <pawel@dawidek.net>.
25  * All rights reserved.
26  * Copyright 2013 Martin Matuska <mm@FreeBSD.org>. All rights reserved.
27  * Copyright 2014 Xin Li <delphij@FreeBSD.org>. All rights reserved.
28  * Copyright 2015, OmniTI Computer Consulting, Inc. All rights reserved.
29  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
30  * Copyright (c) 2014, Joyent, Inc. All rights reserved.
31  * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
32  * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
33  * Copyright (c) 2013 Steven Hartland. All rights reserved.
34  * Copyright (c) 2014 Integros [integros.com]
35  */
36
37 /*
38  * ZFS ioctls.
39  *
40  * This file handles the ioctls to /dev/zfs, used for configuring ZFS storage
41  * pools and filesystems, e.g. with /sbin/zfs and /sbin/zpool.
42  *
43  * There are two ways that we handle ioctls: the legacy way where almost
44  * all of the logic is in the ioctl callback, and the new way where most
45  * of the marshalling is handled in the common entry point, zfsdev_ioctl().
46  *
47  * Non-legacy ioctls should be registered by calling
48  * zfs_ioctl_register() from zfs_ioctl_init().  The ioctl is invoked
49  * from userland by lzc_ioctl().
50  *
51  * The registration arguments are as follows:
52  *
53  * const char *name
54  *   The name of the ioctl.  This is used for history logging.  If the
55  *   ioctl returns successfully (the callback returns 0), and allow_log
56  *   is true, then a history log entry will be recorded with the input &
57  *   output nvlists.  The log entry can be printed with "zpool history -i".
58  *
59  * zfs_ioc_t ioc
60  *   The ioctl request number, which userland will pass to ioctl(2).
61  *   The ioctl numbers can change from release to release, because
62  *   the caller (libzfs) must be matched to the kernel.
63  *
64  * zfs_secpolicy_func_t *secpolicy
65  *   This function will be called before the zfs_ioc_func_t, to
66  *   determine if this operation is permitted.  It should return EPERM
67  *   on failure, and 0 on success.  Checks include determining if the
68  *   dataset is visible in this zone, and if the user has either all
69  *   zfs privileges in the zone (SYS_MOUNT), or has been granted permission
70  *   to do this operation on this dataset with "zfs allow".
71  *
72  * zfs_ioc_namecheck_t namecheck
73  *   This specifies what to expect in the zfs_cmd_t:zc_name -- a pool
74  *   name, a dataset name, or nothing.  If the name is not well-formed,
75  *   the ioctl will fail and the callback will not be called.
76  *   Therefore, the callback can assume that the name is well-formed
77  *   (e.g. is null-terminated, doesn't have more than one '@' character,
78  *   doesn't have invalid characters).
79  *
80  * zfs_ioc_poolcheck_t pool_check
81  *   This specifies requirements on the pool state.  If the pool does
82  *   not meet them (is suspended or is readonly), the ioctl will fail
83  *   and the callback will not be called.  If any checks are specified
84  *   (i.e. it is not POOL_CHECK_NONE), namecheck must not be NO_NAME.
85  *   Multiple checks can be or-ed together (e.g. POOL_CHECK_SUSPENDED |
86  *   POOL_CHECK_READONLY).
87  *
88  * boolean_t smush_outnvlist
89  *   If smush_outnvlist is true, then the output is presumed to be a
90  *   list of errors, and it will be "smushed" down to fit into the
91  *   caller's buffer, by removing some entries and replacing them with a
92  *   single "N_MORE_ERRORS" entry indicating how many were removed.  See
93  *   nvlist_smush() for details.  If smush_outnvlist is false, and the
94  *   outnvlist does not fit into the userland-provided buffer, then the
95  *   ioctl will fail with ENOMEM.
96  *
97  * zfs_ioc_func_t *func
98  *   The callback function that will perform the operation.
99  *
100  *   The callback should return 0 on success, or an error number on
101  *   failure.  If the function fails, the userland ioctl will return -1,
102  *   and errno will be set to the callback's return value.  The callback
103  *   will be called with the following arguments:
104  *
105  *   const char *name
106  *     The name of the pool or dataset to operate on, from
107  *     zfs_cmd_t:zc_name.  The 'namecheck' argument specifies the
108  *     expected type (pool, dataset, or none).
109  *
110  *   nvlist_t *innvl
111  *     The input nvlist, deserialized from zfs_cmd_t:zc_nvlist_src.  Or
112  *     NULL if no input nvlist was provided.  Changes to this nvlist are
113  *     ignored.  If the input nvlist could not be deserialized, the
114  *     ioctl will fail and the callback will not be called.
115  *
116  *   nvlist_t *outnvl
117  *     The output nvlist, initially empty.  The callback can fill it in,
118  *     and it will be returned to userland by serializing it into
119  *     zfs_cmd_t:zc_nvlist_dst.  If it is non-empty, and serialization
120  *     fails (e.g. because the caller didn't supply a large enough
121  *     buffer), then the overall ioctl will fail.  See the
122  *     'smush_nvlist' argument above for additional behaviors.
123  *
124  *     There are two typical uses of the output nvlist:
125  *       - To return state, e.g. property values.  In this case,
126  *         smush_outnvlist should be false.  If the buffer was not large
127  *         enough, the caller will reallocate a larger buffer and try
128  *         the ioctl again.
129  *
130  *       - To return multiple errors from an ioctl which makes on-disk
131  *         changes.  In this case, smush_outnvlist should be true.
132  *         Ioctls which make on-disk modifications should generally not
133  *         use the outnvl if they succeed, because the caller can not
134  *         distinguish between the operation failing, and
135  *         deserialization failing.
136  */
137 #ifdef __FreeBSD__
138 #include "opt_kstack_pages.h"
139 #endif
140
141 #include <sys/types.h>
142 #include <sys/param.h>
143 #include <sys/systm.h>
144 #include <sys/conf.h>
145 #include <sys/kernel.h>
146 #include <sys/lock.h>
147 #include <sys/malloc.h>
148 #include <sys/mutex.h>
149 #include <sys/proc.h>
150 #include <sys/errno.h>
151 #include <sys/uio.h>
152 #include <sys/buf.h>
153 #include <sys/file.h>
154 #include <sys/kmem.h>
155 #include <sys/conf.h>
156 #include <sys/cmn_err.h>
157 #include <sys/stat.h>
158 #include <sys/zfs_ioctl.h>
159 #include <sys/zfs_vfsops.h>
160 #include <sys/zfs_znode.h>
161 #include <sys/zap.h>
162 #include <sys/spa.h>
163 #include <sys/spa_impl.h>
164 #include <sys/vdev.h>
165 #include <sys/dmu.h>
166 #include <sys/dsl_dir.h>
167 #include <sys/dsl_dataset.h>
168 #include <sys/dsl_prop.h>
169 #include <sys/dsl_deleg.h>
170 #include <sys/dmu_objset.h>
171 #include <sys/dmu_impl.h>
172 #include <sys/dmu_tx.h>
173 #include <sys/sunddi.h>
174 #include <sys/policy.h>
175 #include <sys/zone.h>
176 #include <sys/nvpair.h>
177 #include <sys/mount.h>
178 #include <sys/taskqueue.h>
179 #include <sys/sdt.h>
180 #include <sys/varargs.h>
181 #include <sys/fs/zfs.h>
182 #include <sys/zfs_ctldir.h>
183 #include <sys/zfs_dir.h>
184 #include <sys/zfs_onexit.h>
185 #include <sys/zvol.h>
186 #include <sys/dsl_scan.h>
187 #include <sys/dmu_objset.h>
188 #include <sys/dmu_send.h>
189 #include <sys/dsl_destroy.h>
190 #include <sys/dsl_bookmark.h>
191 #include <sys/dsl_userhold.h>
192 #include <sys/zfeature.h>
193 #include <sys/zio_checksum.h>
194
195 #include "zfs_namecheck.h"
196 #include "zfs_prop.h"
197 #include "zfs_deleg.h"
198 #include "zfs_comutil.h"
199 #include "zfs_ioctl_compat.h"
200
201 CTASSERT(sizeof(zfs_cmd_t) < IOCPARM_MAX);
202
203 static struct cdev *zfsdev;
204
205 extern void zfs_init(void);
206 extern void zfs_fini(void);
207
208 uint_t zfs_fsyncer_key;
209 extern uint_t rrw_tsd_key;
210 static uint_t zfs_allow_log_key;
211
212 typedef int zfs_ioc_legacy_func_t(zfs_cmd_t *);
213 typedef int zfs_ioc_func_t(const char *, nvlist_t *, nvlist_t *);
214 typedef int zfs_secpolicy_func_t(zfs_cmd_t *, nvlist_t *, cred_t *);
215
216 typedef enum {
217         NO_NAME,
218         POOL_NAME,
219         DATASET_NAME
220 } zfs_ioc_namecheck_t;
221
222 typedef enum {
223         POOL_CHECK_NONE         = 1 << 0,
224         POOL_CHECK_SUSPENDED    = 1 << 1,
225         POOL_CHECK_READONLY     = 1 << 2,
226 } zfs_ioc_poolcheck_t;
227
228 typedef struct zfs_ioc_vec {
229         zfs_ioc_legacy_func_t   *zvec_legacy_func;
230         zfs_ioc_func_t          *zvec_func;
231         zfs_secpolicy_func_t    *zvec_secpolicy;
232         zfs_ioc_namecheck_t     zvec_namecheck;
233         boolean_t               zvec_allow_log;
234         zfs_ioc_poolcheck_t     zvec_pool_check;
235         boolean_t               zvec_smush_outnvlist;
236         const char              *zvec_name;
237 } zfs_ioc_vec_t;
238
239 /* This array is indexed by zfs_userquota_prop_t */
240 static const char *userquota_perms[] = {
241         ZFS_DELEG_PERM_USERUSED,
242         ZFS_DELEG_PERM_USERQUOTA,
243         ZFS_DELEG_PERM_GROUPUSED,
244         ZFS_DELEG_PERM_GROUPQUOTA,
245 };
246
247 static int zfs_ioc_userspace_upgrade(zfs_cmd_t *zc);
248 static int zfs_check_settable(const char *name, nvpair_t *property,
249     cred_t *cr);
250 static int zfs_check_clearable(char *dataset, nvlist_t *props,
251     nvlist_t **errors);
252 static int zfs_fill_zplprops_root(uint64_t, nvlist_t *, nvlist_t *,
253     boolean_t *);
254 int zfs_set_prop_nvlist(const char *, zprop_source_t, nvlist_t *, nvlist_t *);
255 static int get_nvlist(uint64_t nvl, uint64_t size, int iflag, nvlist_t **nvp);
256  
257 static void zfsdev_close(void *data);
258
259 static int zfs_prop_activate_feature(spa_t *spa, spa_feature_t feature);
260
261 /* _NOTE(PRINTFLIKE(4)) - this is printf-like, but lint is too whiney */
262 void
263 __dprintf(const char *file, const char *func, int line, const char *fmt, ...)
264 {
265         const char *newfile;
266         char buf[512];
267         va_list adx;
268
269         /*
270          * Get rid of annoying "../common/" prefix to filename.
271          */
272         newfile = strrchr(file, '/');
273         if (newfile != NULL) {
274                 newfile = newfile + 1; /* Get rid of leading / */
275         } else {
276                 newfile = file;
277         }
278
279         va_start(adx, fmt);
280         (void) vsnprintf(buf, sizeof (buf), fmt, adx);
281         va_end(adx);
282
283         /*
284          * To get this data, use the zfs-dprintf probe as so:
285          * dtrace -q -n 'zfs-dprintf \
286          *      /stringof(arg0) == "dbuf.c"/ \
287          *      {printf("%s: %s", stringof(arg1), stringof(arg3))}'
288          * arg0 = file name
289          * arg1 = function name
290          * arg2 = line number
291          * arg3 = message
292          */
293         DTRACE_PROBE4(zfs__dprintf,
294             char *, newfile, char *, func, int, line, char *, buf);
295 }
296
297 static void
298 history_str_free(char *buf)
299 {
300         kmem_free(buf, HIS_MAX_RECORD_LEN);
301 }
302
303 static char *
304 history_str_get(zfs_cmd_t *zc)
305 {
306         char *buf;
307
308         if (zc->zc_history == 0)
309                 return (NULL);
310
311         buf = kmem_alloc(HIS_MAX_RECORD_LEN, KM_SLEEP);
312         if (copyinstr((void *)(uintptr_t)zc->zc_history,
313             buf, HIS_MAX_RECORD_LEN, NULL) != 0) {
314                 history_str_free(buf);
315                 return (NULL);
316         }
317
318         buf[HIS_MAX_RECORD_LEN -1] = '\0';
319
320         return (buf);
321 }
322
323 /*
324  * Check to see if the named dataset is currently defined as bootable
325  */
326 static boolean_t
327 zfs_is_bootfs(const char *name)
328 {
329         objset_t *os;
330
331         if (dmu_objset_hold(name, FTAG, &os) == 0) {
332                 boolean_t ret;
333                 ret = (dmu_objset_id(os) == spa_bootfs(dmu_objset_spa(os)));
334                 dmu_objset_rele(os, FTAG);
335                 return (ret);
336         }
337         return (B_FALSE);
338 }
339
340 /*
341  * Return non-zero if the spa version is less than requested version.
342  */
343 static int
344 zfs_earlier_version(const char *name, int version)
345 {
346         spa_t *spa;
347
348         if (spa_open(name, &spa, FTAG) == 0) {
349                 if (spa_version(spa) < version) {
350                         spa_close(spa, FTAG);
351                         return (1);
352                 }
353                 spa_close(spa, FTAG);
354         }
355         return (0);
356 }
357
358 /*
359  * Return TRUE if the ZPL version is less than requested version.
360  */
361 static boolean_t
362 zpl_earlier_version(const char *name, int version)
363 {
364         objset_t *os;
365         boolean_t rc = B_TRUE;
366
367         if (dmu_objset_hold(name, FTAG, &os) == 0) {
368                 uint64_t zplversion;
369
370                 if (dmu_objset_type(os) != DMU_OST_ZFS) {
371                         dmu_objset_rele(os, FTAG);
372                         return (B_TRUE);
373                 }
374                 /* XXX reading from non-owned objset */
375                 if (zfs_get_zplprop(os, ZFS_PROP_VERSION, &zplversion) == 0)
376                         rc = zplversion < version;
377                 dmu_objset_rele(os, FTAG);
378         }
379         return (rc);
380 }
381
382 static void
383 zfs_log_history(zfs_cmd_t *zc)
384 {
385         spa_t *spa;
386         char *buf;
387
388         if ((buf = history_str_get(zc)) == NULL)
389                 return;
390
391         if (spa_open(zc->zc_name, &spa, FTAG) == 0) {
392                 if (spa_version(spa) >= SPA_VERSION_ZPOOL_HISTORY)
393                         (void) spa_history_log(spa, buf);
394                 spa_close(spa, FTAG);
395         }
396         history_str_free(buf);
397 }
398
399 /*
400  * Policy for top-level read operations (list pools).  Requires no privileges,
401  * and can be used in the local zone, as there is no associated dataset.
402  */
403 /* ARGSUSED */
404 static int
405 zfs_secpolicy_none(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
406 {
407         return (0);
408 }
409
410 /*
411  * Policy for dataset read operations (list children, get statistics).  Requires
412  * no privileges, but must be visible in the local zone.
413  */
414 /* ARGSUSED */
415 static int
416 zfs_secpolicy_read(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
417 {
418         if (INGLOBALZONE(curthread) ||
419             zone_dataset_visible(zc->zc_name, NULL))
420                 return (0);
421
422         return (SET_ERROR(ENOENT));
423 }
424
425 static int
426 zfs_dozonecheck_impl(const char *dataset, uint64_t zoned, cred_t *cr)
427 {
428         int writable = 1;
429
430         /*
431          * The dataset must be visible by this zone -- check this first
432          * so they don't see EPERM on something they shouldn't know about.
433          */
434         if (!INGLOBALZONE(curthread) &&
435             !zone_dataset_visible(dataset, &writable))
436                 return (SET_ERROR(ENOENT));
437
438         if (INGLOBALZONE(curthread)) {
439                 /*
440                  * If the fs is zoned, only root can access it from the
441                  * global zone.
442                  */
443                 if (secpolicy_zfs(cr) && zoned)
444                         return (SET_ERROR(EPERM));
445         } else {
446                 /*
447                  * If we are in a local zone, the 'zoned' property must be set.
448                  */
449                 if (!zoned)
450                         return (SET_ERROR(EPERM));
451
452                 /* must be writable by this zone */
453                 if (!writable)
454                         return (SET_ERROR(EPERM));
455         }
456         return (0);
457 }
458
459 static int
460 zfs_dozonecheck(const char *dataset, cred_t *cr)
461 {
462         uint64_t zoned;
463
464         if (dsl_prop_get_integer(dataset, "jailed", &zoned, NULL))
465                 return (SET_ERROR(ENOENT));
466
467         return (zfs_dozonecheck_impl(dataset, zoned, cr));
468 }
469
470 static int
471 zfs_dozonecheck_ds(const char *dataset, dsl_dataset_t *ds, cred_t *cr)
472 {
473         uint64_t zoned;
474
475         if (dsl_prop_get_int_ds(ds, "jailed", &zoned))
476                 return (SET_ERROR(ENOENT));
477
478         return (zfs_dozonecheck_impl(dataset, zoned, cr));
479 }
480
481 static int
482 zfs_secpolicy_write_perms_ds(const char *name, dsl_dataset_t *ds,
483     const char *perm, cred_t *cr)
484 {
485         int error;
486
487         error = zfs_dozonecheck_ds(name, ds, cr);
488         if (error == 0) {
489                 error = secpolicy_zfs(cr);
490                 if (error != 0)
491                         error = dsl_deleg_access_impl(ds, perm, cr);
492         }
493         return (error);
494 }
495
496 static int
497 zfs_secpolicy_write_perms(const char *name, const char *perm, cred_t *cr)
498 {
499         int error;
500         dsl_dataset_t *ds;
501         dsl_pool_t *dp;
502
503         error = dsl_pool_hold(name, FTAG, &dp);
504         if (error != 0)
505                 return (error);
506
507         error = dsl_dataset_hold(dp, name, FTAG, &ds);
508         if (error != 0) {
509                 dsl_pool_rele(dp, FTAG);
510                 return (error);
511         }
512
513         error = zfs_secpolicy_write_perms_ds(name, ds, perm, cr);
514
515         dsl_dataset_rele(ds, FTAG);
516         dsl_pool_rele(dp, FTAG);
517         return (error);
518 }
519
520 #ifdef SECLABEL
521 /*
522  * Policy for setting the security label property.
523  *
524  * Returns 0 for success, non-zero for access and other errors.
525  */
526 static int
527 zfs_set_slabel_policy(const char *name, char *strval, cred_t *cr)
528 {
529         char            ds_hexsl[MAXNAMELEN];
530         bslabel_t       ds_sl, new_sl;
531         boolean_t       new_default = FALSE;
532         uint64_t        zoned;
533         int             needed_priv = -1;
534         int             error;
535
536         /* First get the existing dataset label. */
537         error = dsl_prop_get(name, zfs_prop_to_name(ZFS_PROP_MLSLABEL),
538             1, sizeof (ds_hexsl), &ds_hexsl, NULL);
539         if (error != 0)
540                 return (SET_ERROR(EPERM));
541
542         if (strcasecmp(strval, ZFS_MLSLABEL_DEFAULT) == 0)
543                 new_default = TRUE;
544
545         /* The label must be translatable */
546         if (!new_default && (hexstr_to_label(strval, &new_sl) != 0))
547                 return (SET_ERROR(EINVAL));
548
549         /*
550          * In a non-global zone, disallow attempts to set a label that
551          * doesn't match that of the zone; otherwise no other checks
552          * are needed.
553          */
554         if (!INGLOBALZONE(curproc)) {
555                 if (new_default || !blequal(&new_sl, CR_SL(CRED())))
556                         return (SET_ERROR(EPERM));
557                 return (0);
558         }
559
560         /*
561          * For global-zone datasets (i.e., those whose zoned property is
562          * "off", verify that the specified new label is valid for the
563          * global zone.
564          */
565         if (dsl_prop_get_integer(name,
566             zfs_prop_to_name(ZFS_PROP_ZONED), &zoned, NULL))
567                 return (SET_ERROR(EPERM));
568         if (!zoned) {
569                 if (zfs_check_global_label(name, strval) != 0)
570                         return (SET_ERROR(EPERM));
571         }
572
573         /*
574          * If the existing dataset label is nondefault, check if the
575          * dataset is mounted (label cannot be changed while mounted).
576          * Get the zfsvfs; if there isn't one, then the dataset isn't
577          * mounted (or isn't a dataset, doesn't exist, ...).
578          */
579         if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) != 0) {
580                 objset_t *os;
581                 static char *setsl_tag = "setsl_tag";
582
583                 /*
584                  * Try to own the dataset; abort if there is any error,
585                  * (e.g., already mounted, in use, or other error).
586                  */
587                 error = dmu_objset_own(name, DMU_OST_ZFS, B_TRUE,
588                     setsl_tag, &os);
589                 if (error != 0)
590                         return (SET_ERROR(EPERM));
591
592                 dmu_objset_disown(os, setsl_tag);
593
594                 if (new_default) {
595                         needed_priv = PRIV_FILE_DOWNGRADE_SL;
596                         goto out_check;
597                 }
598
599                 if (hexstr_to_label(strval, &new_sl) != 0)
600                         return (SET_ERROR(EPERM));
601
602                 if (blstrictdom(&ds_sl, &new_sl))
603                         needed_priv = PRIV_FILE_DOWNGRADE_SL;
604                 else if (blstrictdom(&new_sl, &ds_sl))
605                         needed_priv = PRIV_FILE_UPGRADE_SL;
606         } else {
607                 /* dataset currently has a default label */
608                 if (!new_default)
609                         needed_priv = PRIV_FILE_UPGRADE_SL;
610         }
611
612 out_check:
613         if (needed_priv != -1)
614                 return (PRIV_POLICY(cr, needed_priv, B_FALSE, EPERM, NULL));
615         return (0);
616 }
617 #endif  /* SECLABEL */
618
619 static int
620 zfs_secpolicy_setprop(const char *dsname, zfs_prop_t prop, nvpair_t *propval,
621     cred_t *cr)
622 {
623         char *strval;
624
625         /*
626          * Check permissions for special properties.
627          */
628         switch (prop) {
629         case ZFS_PROP_ZONED:
630                 /*
631                  * Disallow setting of 'zoned' from within a local zone.
632                  */
633                 if (!INGLOBALZONE(curthread))
634                         return (SET_ERROR(EPERM));
635                 break;
636
637         case ZFS_PROP_QUOTA:
638         case ZFS_PROP_FILESYSTEM_LIMIT:
639         case ZFS_PROP_SNAPSHOT_LIMIT:
640                 if (!INGLOBALZONE(curthread)) {
641                         uint64_t zoned;
642                         char setpoint[MAXNAMELEN];
643                         /*
644                          * Unprivileged users are allowed to modify the
645                          * limit on things *under* (ie. contained by)
646                          * the thing they own.
647                          */
648                         if (dsl_prop_get_integer(dsname, "jailed", &zoned,
649                             setpoint))
650                                 return (SET_ERROR(EPERM));
651                         if (!zoned || strlen(dsname) <= strlen(setpoint))
652                                 return (SET_ERROR(EPERM));
653                 }
654                 break;
655
656         case ZFS_PROP_MLSLABEL:
657 #ifdef SECLABEL
658                 if (!is_system_labeled())
659                         return (SET_ERROR(EPERM));
660
661                 if (nvpair_value_string(propval, &strval) == 0) {
662                         int err;
663
664                         err = zfs_set_slabel_policy(dsname, strval, CRED());
665                         if (err != 0)
666                                 return (err);
667                 }
668 #else
669                 return (EOPNOTSUPP);
670 #endif
671                 break;
672         }
673
674         return (zfs_secpolicy_write_perms(dsname, zfs_prop_to_name(prop), cr));
675 }
676
677 /* ARGSUSED */
678 static int
679 zfs_secpolicy_set_fsacl(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
680 {
681         int error;
682
683         error = zfs_dozonecheck(zc->zc_name, cr);
684         if (error != 0)
685                 return (error);
686
687         /*
688          * permission to set permissions will be evaluated later in
689          * dsl_deleg_can_allow()
690          */
691         return (0);
692 }
693
694 /* ARGSUSED */
695 static int
696 zfs_secpolicy_rollback(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
697 {
698         return (zfs_secpolicy_write_perms(zc->zc_name,
699             ZFS_DELEG_PERM_ROLLBACK, cr));
700 }
701
702 /* ARGSUSED */
703 static int
704 zfs_secpolicy_send(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
705 {
706         dsl_pool_t *dp;
707         dsl_dataset_t *ds;
708         char *cp;
709         int error;
710
711         /*
712          * Generate the current snapshot name from the given objsetid, then
713          * use that name for the secpolicy/zone checks.
714          */
715         cp = strchr(zc->zc_name, '@');
716         if (cp == NULL)
717                 return (SET_ERROR(EINVAL));
718         error = dsl_pool_hold(zc->zc_name, FTAG, &dp);
719         if (error != 0)
720                 return (error);
721
722         error = dsl_dataset_hold_obj(dp, zc->zc_sendobj, FTAG, &ds);
723         if (error != 0) {
724                 dsl_pool_rele(dp, FTAG);
725                 return (error);
726         }
727
728         dsl_dataset_name(ds, zc->zc_name);
729
730         error = zfs_secpolicy_write_perms_ds(zc->zc_name, ds,
731             ZFS_DELEG_PERM_SEND, cr);
732         dsl_dataset_rele(ds, FTAG);
733         dsl_pool_rele(dp, FTAG);
734
735         return (error);
736 }
737
738 /* ARGSUSED */
739 static int
740 zfs_secpolicy_send_new(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
741 {
742         return (zfs_secpolicy_write_perms(zc->zc_name,
743             ZFS_DELEG_PERM_SEND, cr));
744 }
745
746 /* ARGSUSED */
747 static int
748 zfs_secpolicy_deleg_share(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
749 {
750         vnode_t *vp;
751         int error;
752
753         if ((error = lookupname(zc->zc_value, UIO_SYSSPACE,
754             NO_FOLLOW, NULL, &vp)) != 0)
755                 return (error);
756
757         /* Now make sure mntpnt and dataset are ZFS */
758
759         if (strcmp(vp->v_vfsp->mnt_stat.f_fstypename, "zfs") != 0 ||
760             (strcmp((char *)refstr_value(vp->v_vfsp->vfs_resource),
761             zc->zc_name) != 0)) {
762                 VN_RELE(vp);
763                 return (SET_ERROR(EPERM));
764         }
765
766         VN_RELE(vp);
767         return (dsl_deleg_access(zc->zc_name,
768             ZFS_DELEG_PERM_SHARE, cr));
769 }
770
771 int
772 zfs_secpolicy_share(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
773 {
774         if (!INGLOBALZONE(curthread))
775                 return (SET_ERROR(EPERM));
776
777         if (secpolicy_nfs(cr) == 0) {
778                 return (0);
779         } else {
780                 return (zfs_secpolicy_deleg_share(zc, innvl, cr));
781         }
782 }
783
784 int
785 zfs_secpolicy_smb_acl(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
786 {
787         if (!INGLOBALZONE(curthread))
788                 return (SET_ERROR(EPERM));
789
790         if (secpolicy_smb(cr) == 0) {
791                 return (0);
792         } else {
793                 return (zfs_secpolicy_deleg_share(zc, innvl, cr));
794         }
795 }
796
797 static int
798 zfs_get_parent(const char *datasetname, char *parent, int parentsize)
799 {
800         char *cp;
801
802         /*
803          * Remove the @bla or /bla from the end of the name to get the parent.
804          */
805         (void) strncpy(parent, datasetname, parentsize);
806         cp = strrchr(parent, '@');
807         if (cp != NULL) {
808                 cp[0] = '\0';
809         } else {
810                 cp = strrchr(parent, '/');
811                 if (cp == NULL)
812                         return (SET_ERROR(ENOENT));
813                 cp[0] = '\0';
814         }
815
816         return (0);
817 }
818
819 int
820 zfs_secpolicy_destroy_perms(const char *name, cred_t *cr)
821 {
822         int error;
823
824         if ((error = zfs_secpolicy_write_perms(name,
825             ZFS_DELEG_PERM_MOUNT, cr)) != 0)
826                 return (error);
827
828         return (zfs_secpolicy_write_perms(name, ZFS_DELEG_PERM_DESTROY, cr));
829 }
830
831 /* ARGSUSED */
832 static int
833 zfs_secpolicy_destroy(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
834 {
835         return (zfs_secpolicy_destroy_perms(zc->zc_name, cr));
836 }
837
838 /*
839  * Destroying snapshots with delegated permissions requires
840  * descendant mount and destroy permissions.
841  */
842 /* ARGSUSED */
843 static int
844 zfs_secpolicy_destroy_snaps(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
845 {
846         nvlist_t *snaps;
847         nvpair_t *pair, *nextpair;
848         int error = 0;
849
850         if (nvlist_lookup_nvlist(innvl, "snaps", &snaps) != 0)
851                 return (SET_ERROR(EINVAL));
852         for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL;
853             pair = nextpair) {
854                 nextpair = nvlist_next_nvpair(snaps, pair);
855                 error = zfs_secpolicy_destroy_perms(nvpair_name(pair), cr);
856                 if (error == ENOENT) {
857                         /*
858                          * Ignore any snapshots that don't exist (we consider
859                          * them "already destroyed").  Remove the name from the
860                          * nvl here in case the snapshot is created between
861                          * now and when we try to destroy it (in which case
862                          * we don't want to destroy it since we haven't
863                          * checked for permission).
864                          */
865                         fnvlist_remove_nvpair(snaps, pair);
866                         error = 0;
867                 }
868                 if (error != 0)
869                         break;
870         }
871
872         return (error);
873 }
874
875 int
876 zfs_secpolicy_rename_perms(const char *from, const char *to, cred_t *cr)
877 {
878         char    parentname[MAXNAMELEN];
879         int     error;
880
881         if ((error = zfs_secpolicy_write_perms(from,
882             ZFS_DELEG_PERM_RENAME, cr)) != 0)
883                 return (error);
884
885         if ((error = zfs_secpolicy_write_perms(from,
886             ZFS_DELEG_PERM_MOUNT, cr)) != 0)
887                 return (error);
888
889         if ((error = zfs_get_parent(to, parentname,
890             sizeof (parentname))) != 0)
891                 return (error);
892
893         if ((error = zfs_secpolicy_write_perms(parentname,
894             ZFS_DELEG_PERM_CREATE, cr)) != 0)
895                 return (error);
896
897         if ((error = zfs_secpolicy_write_perms(parentname,
898             ZFS_DELEG_PERM_MOUNT, cr)) != 0)
899                 return (error);
900
901         return (error);
902 }
903
904 /* ARGSUSED */
905 static int
906 zfs_secpolicy_rename(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
907 {
908         char *at = NULL;
909         int error;
910
911         if ((zc->zc_cookie & 1) != 0) {
912                 /*
913                  * This is recursive rename, so the starting snapshot might
914                  * not exist. Check file system or volume permission instead.
915                  */
916                 at = strchr(zc->zc_name, '@');
917                 if (at == NULL)
918                         return (EINVAL);
919                 *at = '\0';
920         }
921
922         error = zfs_secpolicy_rename_perms(zc->zc_name, zc->zc_value, cr);
923
924         if (at != NULL)
925                 *at = '@';
926
927         return (error);
928 }
929
930 /* ARGSUSED */
931 static int
932 zfs_secpolicy_promote(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
933 {
934         dsl_pool_t *dp;
935         dsl_dataset_t *clone;
936         int error;
937
938         error = zfs_secpolicy_write_perms(zc->zc_name,
939             ZFS_DELEG_PERM_PROMOTE, cr);
940         if (error != 0)
941                 return (error);
942
943         error = dsl_pool_hold(zc->zc_name, FTAG, &dp);
944         if (error != 0)
945                 return (error);
946
947         error = dsl_dataset_hold(dp, zc->zc_name, FTAG, &clone);
948
949         if (error == 0) {
950                 char parentname[MAXNAMELEN];
951                 dsl_dataset_t *origin = NULL;
952                 dsl_dir_t *dd;
953                 dd = clone->ds_dir;
954
955                 error = dsl_dataset_hold_obj(dd->dd_pool,
956                     dsl_dir_phys(dd)->dd_origin_obj, FTAG, &origin);
957                 if (error != 0) {
958                         dsl_dataset_rele(clone, FTAG);
959                         dsl_pool_rele(dp, FTAG);
960                         return (error);
961                 }
962
963                 error = zfs_secpolicy_write_perms_ds(zc->zc_name, clone,
964                     ZFS_DELEG_PERM_MOUNT, cr);
965
966                 dsl_dataset_name(origin, parentname);
967                 if (error == 0) {
968                         error = zfs_secpolicy_write_perms_ds(parentname, origin,
969                             ZFS_DELEG_PERM_PROMOTE, cr);
970                 }
971                 dsl_dataset_rele(clone, FTAG);
972                 dsl_dataset_rele(origin, FTAG);
973         }
974         dsl_pool_rele(dp, FTAG);
975         return (error);
976 }
977
978 /* ARGSUSED */
979 static int
980 zfs_secpolicy_recv(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
981 {
982         int error;
983
984         if ((error = zfs_secpolicy_write_perms(zc->zc_name,
985             ZFS_DELEG_PERM_RECEIVE, cr)) != 0)
986                 return (error);
987
988         if ((error = zfs_secpolicy_write_perms(zc->zc_name,
989             ZFS_DELEG_PERM_MOUNT, cr)) != 0)
990                 return (error);
991
992         return (zfs_secpolicy_write_perms(zc->zc_name,
993             ZFS_DELEG_PERM_CREATE, cr));
994 }
995
996 int
997 zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr)
998 {
999         return (zfs_secpolicy_write_perms(name,
1000             ZFS_DELEG_PERM_SNAPSHOT, cr));
1001 }
1002
1003 /*
1004  * Check for permission to create each snapshot in the nvlist.
1005  */
1006 /* ARGSUSED */
1007 static int
1008 zfs_secpolicy_snapshot(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1009 {
1010         nvlist_t *snaps;
1011         int error;
1012         nvpair_t *pair;
1013
1014         if (nvlist_lookup_nvlist(innvl, "snaps", &snaps) != 0)
1015                 return (SET_ERROR(EINVAL));
1016         for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL;
1017             pair = nvlist_next_nvpair(snaps, pair)) {
1018                 char *name = nvpair_name(pair);
1019                 char *atp = strchr(name, '@');
1020
1021                 if (atp == NULL) {
1022                         error = SET_ERROR(EINVAL);
1023                         break;
1024                 }
1025                 *atp = '\0';
1026                 error = zfs_secpolicy_snapshot_perms(name, cr);
1027                 *atp = '@';
1028                 if (error != 0)
1029                         break;
1030         }
1031         return (error);
1032 }
1033
1034 /*
1035  * Check for permission to create each snapshot in the nvlist.
1036  */
1037 /* ARGSUSED */
1038 static int
1039 zfs_secpolicy_bookmark(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1040 {
1041         int error = 0;
1042
1043         for (nvpair_t *pair = nvlist_next_nvpair(innvl, NULL);
1044             pair != NULL; pair = nvlist_next_nvpair(innvl, pair)) {
1045                 char *name = nvpair_name(pair);
1046                 char *hashp = strchr(name, '#');
1047
1048                 if (hashp == NULL) {
1049                         error = SET_ERROR(EINVAL);
1050                         break;
1051                 }
1052                 *hashp = '\0';
1053                 error = zfs_secpolicy_write_perms(name,
1054                     ZFS_DELEG_PERM_BOOKMARK, cr);
1055                 *hashp = '#';
1056                 if (error != 0)
1057                         break;
1058         }
1059         return (error);
1060 }
1061
1062 /* ARGSUSED */
1063 static int
1064 zfs_secpolicy_destroy_bookmarks(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1065 {
1066         nvpair_t *pair, *nextpair;
1067         int error = 0;
1068
1069         for (pair = nvlist_next_nvpair(innvl, NULL); pair != NULL;
1070             pair = nextpair) {
1071                 char *name = nvpair_name(pair);
1072                 char *hashp = strchr(name, '#');
1073                 nextpair = nvlist_next_nvpair(innvl, pair);
1074
1075                 if (hashp == NULL) {
1076                         error = SET_ERROR(EINVAL);
1077                         break;
1078                 }
1079
1080                 *hashp = '\0';
1081                 error = zfs_secpolicy_write_perms(name,
1082                     ZFS_DELEG_PERM_DESTROY, cr);
1083                 *hashp = '#';
1084                 if (error == ENOENT) {
1085                         /*
1086                          * Ignore any filesystems that don't exist (we consider
1087                          * their bookmarks "already destroyed").  Remove
1088                          * the name from the nvl here in case the filesystem
1089                          * is created between now and when we try to destroy
1090                          * the bookmark (in which case we don't want to
1091                          * destroy it since we haven't checked for permission).
1092                          */
1093                         fnvlist_remove_nvpair(innvl, pair);
1094                         error = 0;
1095                 }
1096                 if (error != 0)
1097                         break;
1098         }
1099
1100         return (error);
1101 }
1102
1103 /* ARGSUSED */
1104 static int
1105 zfs_secpolicy_log_history(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1106 {
1107         /*
1108          * Even root must have a proper TSD so that we know what pool
1109          * to log to.
1110          */
1111         if (tsd_get(zfs_allow_log_key) == NULL)
1112                 return (SET_ERROR(EPERM));
1113         return (0);
1114 }
1115
1116 static int
1117 zfs_secpolicy_create_clone(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1118 {
1119         char    parentname[MAXNAMELEN];
1120         int     error;
1121         char    *origin;
1122
1123         if ((error = zfs_get_parent(zc->zc_name, parentname,
1124             sizeof (parentname))) != 0)
1125                 return (error);
1126
1127         if (nvlist_lookup_string(innvl, "origin", &origin) == 0 &&
1128             (error = zfs_secpolicy_write_perms(origin,
1129             ZFS_DELEG_PERM_CLONE, cr)) != 0)
1130                 return (error);
1131
1132         if ((error = zfs_secpolicy_write_perms(parentname,
1133             ZFS_DELEG_PERM_CREATE, cr)) != 0)
1134                 return (error);
1135
1136         return (zfs_secpolicy_write_perms(parentname,
1137             ZFS_DELEG_PERM_MOUNT, cr));
1138 }
1139
1140 /*
1141  * Policy for pool operations - create/destroy pools, add vdevs, etc.  Requires
1142  * SYS_CONFIG privilege, which is not available in a local zone.
1143  */
1144 /* ARGSUSED */
1145 static int
1146 zfs_secpolicy_config(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1147 {
1148         if (secpolicy_sys_config(cr, B_FALSE) != 0)
1149                 return (SET_ERROR(EPERM));
1150
1151         return (0);
1152 }
1153
1154 /*
1155  * Policy for object to name lookups.
1156  */
1157 /* ARGSUSED */
1158 static int
1159 zfs_secpolicy_diff(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1160 {
1161         int error;
1162
1163         if ((error = secpolicy_sys_config(cr, B_FALSE)) == 0)
1164                 return (0);
1165
1166         error = zfs_secpolicy_write_perms(zc->zc_name, ZFS_DELEG_PERM_DIFF, cr);
1167         return (error);
1168 }
1169
1170 /*
1171  * Policy for fault injection.  Requires all privileges.
1172  */
1173 /* ARGSUSED */
1174 static int
1175 zfs_secpolicy_inject(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1176 {
1177         return (secpolicy_zinject(cr));
1178 }
1179
1180 /* ARGSUSED */
1181 static int
1182 zfs_secpolicy_inherit_prop(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1183 {
1184         zfs_prop_t prop = zfs_name_to_prop(zc->zc_value);
1185
1186         if (prop == ZPROP_INVAL) {
1187                 if (!zfs_prop_user(zc->zc_value))
1188                         return (SET_ERROR(EINVAL));
1189                 return (zfs_secpolicy_write_perms(zc->zc_name,
1190                     ZFS_DELEG_PERM_USERPROP, cr));
1191         } else {
1192                 return (zfs_secpolicy_setprop(zc->zc_name, prop,
1193                     NULL, cr));
1194         }
1195 }
1196
1197 static int
1198 zfs_secpolicy_userspace_one(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1199 {
1200         int err = zfs_secpolicy_read(zc, innvl, cr);
1201         if (err)
1202                 return (err);
1203
1204         if (zc->zc_objset_type >= ZFS_NUM_USERQUOTA_PROPS)
1205                 return (SET_ERROR(EINVAL));
1206
1207         if (zc->zc_value[0] == 0) {
1208                 /*
1209                  * They are asking about a posix uid/gid.  If it's
1210                  * themself, allow it.
1211                  */
1212                 if (zc->zc_objset_type == ZFS_PROP_USERUSED ||
1213                     zc->zc_objset_type == ZFS_PROP_USERQUOTA) {
1214                         if (zc->zc_guid == crgetuid(cr))
1215                                 return (0);
1216                 } else {
1217                         if (groupmember(zc->zc_guid, cr))
1218                                 return (0);
1219                 }
1220         }
1221
1222         return (zfs_secpolicy_write_perms(zc->zc_name,
1223             userquota_perms[zc->zc_objset_type], cr));
1224 }
1225
1226 static int
1227 zfs_secpolicy_userspace_many(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1228 {
1229         int err = zfs_secpolicy_read(zc, innvl, cr);
1230         if (err)
1231                 return (err);
1232
1233         if (zc->zc_objset_type >= ZFS_NUM_USERQUOTA_PROPS)
1234                 return (SET_ERROR(EINVAL));
1235
1236         return (zfs_secpolicy_write_perms(zc->zc_name,
1237             userquota_perms[zc->zc_objset_type], cr));
1238 }
1239
1240 /* ARGSUSED */
1241 static int
1242 zfs_secpolicy_userspace_upgrade(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1243 {
1244         return (zfs_secpolicy_setprop(zc->zc_name, ZFS_PROP_VERSION,
1245             NULL, cr));
1246 }
1247
1248 /* ARGSUSED */
1249 static int
1250 zfs_secpolicy_hold(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1251 {
1252         nvpair_t *pair;
1253         nvlist_t *holds;
1254         int error;
1255
1256         error = nvlist_lookup_nvlist(innvl, "holds", &holds);
1257         if (error != 0)
1258                 return (SET_ERROR(EINVAL));
1259
1260         for (pair = nvlist_next_nvpair(holds, NULL); pair != NULL;
1261             pair = nvlist_next_nvpair(holds, pair)) {
1262                 char fsname[MAXNAMELEN];
1263                 error = dmu_fsname(nvpair_name(pair), fsname);
1264                 if (error != 0)
1265                         return (error);
1266                 error = zfs_secpolicy_write_perms(fsname,
1267                     ZFS_DELEG_PERM_HOLD, cr);
1268                 if (error != 0)
1269                         return (error);
1270         }
1271         return (0);
1272 }
1273
1274 /* ARGSUSED */
1275 static int
1276 zfs_secpolicy_release(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1277 {
1278         nvpair_t *pair;
1279         int error;
1280
1281         for (pair = nvlist_next_nvpair(innvl, NULL); pair != NULL;
1282             pair = nvlist_next_nvpair(innvl, pair)) {
1283                 char fsname[MAXNAMELEN];
1284                 error = dmu_fsname(nvpair_name(pair), fsname);
1285                 if (error != 0)
1286                         return (error);
1287                 error = zfs_secpolicy_write_perms(fsname,
1288                     ZFS_DELEG_PERM_RELEASE, cr);
1289                 if (error != 0)
1290                         return (error);
1291         }
1292         return (0);
1293 }
1294
1295 /*
1296  * Policy for allowing temporary snapshots to be taken or released
1297  */
1298 static int
1299 zfs_secpolicy_tmp_snapshot(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
1300 {
1301         /*
1302          * A temporary snapshot is the same as a snapshot,
1303          * hold, destroy and release all rolled into one.
1304          * Delegated diff alone is sufficient that we allow this.
1305          */
1306         int error;
1307
1308         if ((error = zfs_secpolicy_write_perms(zc->zc_name,
1309             ZFS_DELEG_PERM_DIFF, cr)) == 0)
1310                 return (0);
1311
1312         error = zfs_secpolicy_snapshot_perms(zc->zc_name, cr);
1313         if (error == 0)
1314                 error = zfs_secpolicy_hold(zc, innvl, cr);
1315         if (error == 0)
1316                 error = zfs_secpolicy_release(zc, innvl, cr);
1317         if (error == 0)
1318                 error = zfs_secpolicy_destroy(zc, innvl, cr);
1319         return (error);
1320 }
1321
1322 /*
1323  * Returns the nvlist as specified by the user in the zfs_cmd_t.
1324  */
1325 static int
1326 get_nvlist(uint64_t nvl, uint64_t size, int iflag, nvlist_t **nvp)
1327 {
1328         char *packed;
1329         int error;
1330         nvlist_t *list = NULL;
1331
1332         /*
1333          * Read in and unpack the user-supplied nvlist.
1334          */
1335         if (size == 0)
1336                 return (SET_ERROR(EINVAL));
1337
1338         packed = kmem_alloc(size, KM_SLEEP);
1339
1340         if ((error = ddi_copyin((void *)(uintptr_t)nvl, packed, size,
1341             iflag)) != 0) {
1342                 kmem_free(packed, size);
1343                 return (SET_ERROR(EFAULT));
1344         }
1345
1346         if ((error = nvlist_unpack(packed, size, &list, 0)) != 0) {
1347                 kmem_free(packed, size);
1348                 return (error);
1349         }
1350
1351         kmem_free(packed, size);
1352
1353         *nvp = list;
1354         return (0);
1355 }
1356
1357 /*
1358  * Reduce the size of this nvlist until it can be serialized in 'max' bytes.
1359  * Entries will be removed from the end of the nvlist, and one int32 entry
1360  * named "N_MORE_ERRORS" will be added indicating how many entries were
1361  * removed.
1362  */
1363 static int
1364 nvlist_smush(nvlist_t *errors, size_t max)
1365 {
1366         size_t size;
1367
1368         size = fnvlist_size(errors);
1369
1370         if (size > max) {
1371                 nvpair_t *more_errors;
1372                 int n = 0;
1373
1374                 if (max < 1024)
1375                         return (SET_ERROR(ENOMEM));
1376
1377                 fnvlist_add_int32(errors, ZPROP_N_MORE_ERRORS, 0);
1378                 more_errors = nvlist_prev_nvpair(errors, NULL);
1379
1380                 do {
1381                         nvpair_t *pair = nvlist_prev_nvpair(errors,
1382                             more_errors);
1383                         fnvlist_remove_nvpair(errors, pair);
1384                         n++;
1385                         size = fnvlist_size(errors);
1386                 } while (size > max);
1387
1388                 fnvlist_remove_nvpair(errors, more_errors);
1389                 fnvlist_add_int32(errors, ZPROP_N_MORE_ERRORS, n);
1390                 ASSERT3U(fnvlist_size(errors), <=, max);
1391         }
1392
1393         return (0);
1394 }
1395
1396 static int
1397 put_nvlist(zfs_cmd_t *zc, nvlist_t *nvl)
1398 {
1399         char *packed = NULL;
1400         int error = 0;
1401         size_t size;
1402
1403         size = fnvlist_size(nvl);
1404
1405         if (size > zc->zc_nvlist_dst_size) {
1406                 /*
1407                  * Solaris returns ENOMEM here, because even if an error is
1408                  * returned from an ioctl(2), new zc_nvlist_dst_size will be
1409                  * passed to the userland. This is not the case for FreeBSD.
1410                  * We need to return 0, so the kernel will copy the
1411                  * zc_nvlist_dst_size back and the userland can discover that a
1412                  * bigger buffer is needed.
1413                  */
1414                 error = 0;
1415         } else {
1416                 packed = fnvlist_pack(nvl, &size);
1417                 if (ddi_copyout(packed, (void *)(uintptr_t)zc->zc_nvlist_dst,
1418                     size, zc->zc_iflags) != 0)
1419                         error = SET_ERROR(EFAULT);
1420                 fnvlist_pack_free(packed, size);
1421         }
1422
1423         zc->zc_nvlist_dst_size = size;
1424         zc->zc_nvlist_dst_filled = B_TRUE;
1425         return (error);
1426 }
1427
1428 static int
1429 getzfsvfs(const char *dsname, zfsvfs_t **zfvp)
1430 {
1431         objset_t *os;
1432         int error;
1433
1434         error = dmu_objset_hold(dsname, FTAG, &os);
1435         if (error != 0)
1436                 return (error);
1437         if (dmu_objset_type(os) != DMU_OST_ZFS) {
1438                 dmu_objset_rele(os, FTAG);
1439                 return (SET_ERROR(EINVAL));
1440         }
1441
1442         mutex_enter(&os->os_user_ptr_lock);
1443         *zfvp = dmu_objset_get_user(os);
1444         if (*zfvp) {
1445                 VFS_HOLD((*zfvp)->z_vfs);
1446         } else {
1447                 error = SET_ERROR(ESRCH);
1448         }
1449         mutex_exit(&os->os_user_ptr_lock);
1450         dmu_objset_rele(os, FTAG);
1451         return (error);
1452 }
1453
1454 /*
1455  * Find a zfsvfs_t for a mounted filesystem, or create our own, in which
1456  * case its z_vfs will be NULL, and it will be opened as the owner.
1457  * If 'writer' is set, the z_teardown_lock will be held for RW_WRITER,
1458  * which prevents all vnode ops from running.
1459  */
1460 static int
1461 zfsvfs_hold(const char *name, void *tag, zfsvfs_t **zfvp, boolean_t writer)
1462 {
1463         int error = 0;
1464
1465         if (getzfsvfs(name, zfvp) != 0)
1466                 error = zfsvfs_create(name, zfvp);
1467         if (error == 0) {
1468                 rrm_enter(&(*zfvp)->z_teardown_lock, (writer) ? RW_WRITER :
1469                     RW_READER, tag);
1470                 if ((*zfvp)->z_unmounted) {
1471                         /*
1472                          * XXX we could probably try again, since the unmounting
1473                          * thread should be just about to disassociate the
1474                          * objset from the zfsvfs.
1475                          */
1476                         rrm_exit(&(*zfvp)->z_teardown_lock, tag);
1477                         return (SET_ERROR(EBUSY));
1478                 }
1479         }
1480         return (error);
1481 }
1482
1483 static void
1484 zfsvfs_rele(zfsvfs_t *zfsvfs, void *tag)
1485 {
1486         rrm_exit(&zfsvfs->z_teardown_lock, tag);
1487
1488         if (zfsvfs->z_vfs) {
1489                 VFS_RELE(zfsvfs->z_vfs);
1490         } else {
1491                 dmu_objset_disown(zfsvfs->z_os, zfsvfs);
1492                 zfsvfs_free(zfsvfs);
1493         }
1494 }
1495
1496 static int
1497 zfs_ioc_pool_create(zfs_cmd_t *zc)
1498 {
1499         int error;
1500         nvlist_t *config, *props = NULL;
1501         nvlist_t *rootprops = NULL;
1502         nvlist_t *zplprops = NULL;
1503
1504         if (error = get_nvlist(zc->zc_nvlist_conf, zc->zc_nvlist_conf_size,
1505             zc->zc_iflags, &config))
1506                 return (error);
1507
1508         if (zc->zc_nvlist_src_size != 0 && (error =
1509             get_nvlist(zc->zc_nvlist_src, zc->zc_nvlist_src_size,
1510             zc->zc_iflags, &props))) {
1511                 nvlist_free(config);
1512                 return (error);
1513         }
1514
1515         if (props) {
1516                 nvlist_t *nvl = NULL;
1517                 uint64_t version = SPA_VERSION;
1518
1519                 (void) nvlist_lookup_uint64(props,
1520                     zpool_prop_to_name(ZPOOL_PROP_VERSION), &version);
1521                 if (!SPA_VERSION_IS_SUPPORTED(version)) {
1522                         error = SET_ERROR(EINVAL);
1523                         goto pool_props_bad;
1524                 }
1525                 (void) nvlist_lookup_nvlist(props, ZPOOL_ROOTFS_PROPS, &nvl);
1526                 if (nvl) {
1527                         error = nvlist_dup(nvl, &rootprops, KM_SLEEP);
1528                         if (error != 0) {
1529                                 nvlist_free(config);
1530                                 nvlist_free(props);
1531                                 return (error);
1532                         }
1533                         (void) nvlist_remove_all(props, ZPOOL_ROOTFS_PROPS);
1534                 }
1535                 VERIFY(nvlist_alloc(&zplprops, NV_UNIQUE_NAME, KM_SLEEP) == 0);
1536                 error = zfs_fill_zplprops_root(version, rootprops,
1537                     zplprops, NULL);
1538                 if (error != 0)
1539                         goto pool_props_bad;
1540         }
1541
1542         error = spa_create(zc->zc_name, config, props, zplprops);
1543
1544         /*
1545          * Set the remaining root properties
1546          */
1547         if (!error && (error = zfs_set_prop_nvlist(zc->zc_name,
1548             ZPROP_SRC_LOCAL, rootprops, NULL)) != 0)
1549                 (void) spa_destroy(zc->zc_name);
1550
1551 pool_props_bad:
1552         nvlist_free(rootprops);
1553         nvlist_free(zplprops);
1554         nvlist_free(config);
1555         nvlist_free(props);
1556
1557         return (error);
1558 }
1559
1560 static int
1561 zfs_ioc_pool_destroy(zfs_cmd_t *zc)
1562 {
1563         int error;
1564         zfs_log_history(zc);
1565         error = spa_destroy(zc->zc_name);
1566         if (error == 0)
1567                 zvol_remove_minors(zc->zc_name);
1568         return (error);
1569 }
1570
1571 static int
1572 zfs_ioc_pool_import(zfs_cmd_t *zc)
1573 {
1574         nvlist_t *config, *props = NULL;
1575         uint64_t guid;
1576         int error;
1577
1578         if ((error = get_nvlist(zc->zc_nvlist_conf, zc->zc_nvlist_conf_size,
1579             zc->zc_iflags, &config)) != 0)
1580                 return (error);
1581
1582         if (zc->zc_nvlist_src_size != 0 && (error =
1583             get_nvlist(zc->zc_nvlist_src, zc->zc_nvlist_src_size,
1584             zc->zc_iflags, &props))) {
1585                 nvlist_free(config);
1586                 return (error);
1587         }
1588
1589         if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &guid) != 0 ||
1590             guid != zc->zc_guid)
1591                 error = SET_ERROR(EINVAL);
1592         else
1593                 error = spa_import(zc->zc_name, config, props, zc->zc_cookie);
1594
1595         if (zc->zc_nvlist_dst != 0) {
1596                 int err;
1597
1598                 if ((err = put_nvlist(zc, config)) != 0)
1599                         error = err;
1600         }
1601
1602         nvlist_free(config);
1603
1604         if (props)
1605                 nvlist_free(props);
1606
1607         return (error);
1608 }
1609
1610 static int
1611 zfs_ioc_pool_export(zfs_cmd_t *zc)
1612 {
1613         int error;
1614         boolean_t force = (boolean_t)zc->zc_cookie;
1615         boolean_t hardforce = (boolean_t)zc->zc_guid;
1616
1617         zfs_log_history(zc);
1618         error = spa_export(zc->zc_name, NULL, force, hardforce);
1619         if (error == 0)
1620                 zvol_remove_minors(zc->zc_name);
1621         return (error);
1622 }
1623
1624 static int
1625 zfs_ioc_pool_configs(zfs_cmd_t *zc)
1626 {
1627         nvlist_t *configs;
1628         int error;
1629
1630         if ((configs = spa_all_configs(&zc->zc_cookie)) == NULL)
1631                 return (SET_ERROR(EEXIST));
1632
1633         error = put_nvlist(zc, configs);
1634
1635         nvlist_free(configs);
1636
1637         return (error);
1638 }
1639
1640 /*
1641  * inputs:
1642  * zc_name              name of the pool
1643  *
1644  * outputs:
1645  * zc_cookie            real errno
1646  * zc_nvlist_dst        config nvlist
1647  * zc_nvlist_dst_size   size of config nvlist
1648  */
1649 static int
1650 zfs_ioc_pool_stats(zfs_cmd_t *zc)
1651 {
1652         nvlist_t *config;
1653         int error;
1654         int ret = 0;
1655
1656         error = spa_get_stats(zc->zc_name, &config, zc->zc_value,
1657             sizeof (zc->zc_value));
1658
1659         if (config != NULL) {
1660                 ret = put_nvlist(zc, config);
1661                 nvlist_free(config);
1662
1663                 /*
1664                  * The config may be present even if 'error' is non-zero.
1665                  * In this case we return success, and preserve the real errno
1666                  * in 'zc_cookie'.
1667                  */
1668                 zc->zc_cookie = error;
1669         } else {
1670                 ret = error;
1671         }
1672
1673         return (ret);
1674 }
1675
1676 /*
1677  * Try to import the given pool, returning pool stats as appropriate so that
1678  * user land knows which devices are available and overall pool health.
1679  */
1680 static int
1681 zfs_ioc_pool_tryimport(zfs_cmd_t *zc)
1682 {
1683         nvlist_t *tryconfig, *config;
1684         int error;
1685
1686         if ((error = get_nvlist(zc->zc_nvlist_conf, zc->zc_nvlist_conf_size,
1687             zc->zc_iflags, &tryconfig)) != 0)
1688                 return (error);
1689
1690         config = spa_tryimport(tryconfig);
1691
1692         nvlist_free(tryconfig);
1693
1694         if (config == NULL)
1695                 return (SET_ERROR(EINVAL));
1696
1697         error = put_nvlist(zc, config);
1698         nvlist_free(config);
1699
1700         return (error);
1701 }
1702
1703 /*
1704  * inputs:
1705  * zc_name              name of the pool
1706  * zc_cookie            scan func (pool_scan_func_t)
1707  */
1708 static int
1709 zfs_ioc_pool_scan(zfs_cmd_t *zc)
1710 {
1711         spa_t *spa;
1712         int error;
1713
1714         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
1715                 return (error);
1716
1717         if (zc->zc_cookie == POOL_SCAN_NONE)
1718                 error = spa_scan_stop(spa);
1719         else
1720                 error = spa_scan(spa, zc->zc_cookie);
1721
1722         spa_close(spa, FTAG);
1723
1724         return (error);
1725 }
1726
1727 static int
1728 zfs_ioc_pool_freeze(zfs_cmd_t *zc)
1729 {
1730         spa_t *spa;
1731         int error;
1732
1733         error = spa_open(zc->zc_name, &spa, FTAG);
1734         if (error == 0) {
1735                 spa_freeze(spa);
1736                 spa_close(spa, FTAG);
1737         }
1738         return (error);
1739 }
1740
1741 static int
1742 zfs_ioc_pool_upgrade(zfs_cmd_t *zc)
1743 {
1744         spa_t *spa;
1745         int error;
1746
1747         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
1748                 return (error);
1749
1750         if (zc->zc_cookie < spa_version(spa) ||
1751             !SPA_VERSION_IS_SUPPORTED(zc->zc_cookie)) {
1752                 spa_close(spa, FTAG);
1753                 return (SET_ERROR(EINVAL));
1754         }
1755
1756         spa_upgrade(spa, zc->zc_cookie);
1757         spa_close(spa, FTAG);
1758
1759         return (error);
1760 }
1761
1762 static int
1763 zfs_ioc_pool_get_history(zfs_cmd_t *zc)
1764 {
1765         spa_t *spa;
1766         char *hist_buf;
1767         uint64_t size;
1768         int error;
1769
1770         if ((size = zc->zc_history_len) == 0)
1771                 return (SET_ERROR(EINVAL));
1772
1773         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
1774                 return (error);
1775
1776         if (spa_version(spa) < SPA_VERSION_ZPOOL_HISTORY) {
1777                 spa_close(spa, FTAG);
1778                 return (SET_ERROR(ENOTSUP));
1779         }
1780
1781         hist_buf = kmem_alloc(size, KM_SLEEP);
1782         if ((error = spa_history_get(spa, &zc->zc_history_offset,
1783             &zc->zc_history_len, hist_buf)) == 0) {
1784                 error = ddi_copyout(hist_buf,
1785                     (void *)(uintptr_t)zc->zc_history,
1786                     zc->zc_history_len, zc->zc_iflags);
1787         }
1788
1789         spa_close(spa, FTAG);
1790         kmem_free(hist_buf, size);
1791         return (error);
1792 }
1793
1794 static int
1795 zfs_ioc_pool_reguid(zfs_cmd_t *zc)
1796 {
1797         spa_t *spa;
1798         int error;
1799
1800         error = spa_open(zc->zc_name, &spa, FTAG);
1801         if (error == 0) {
1802                 error = spa_change_guid(spa);
1803                 spa_close(spa, FTAG);
1804         }
1805         return (error);
1806 }
1807
1808 static int
1809 zfs_ioc_dsobj_to_dsname(zfs_cmd_t *zc)
1810 {
1811         return (dsl_dsobj_to_dsname(zc->zc_name, zc->zc_obj, zc->zc_value));
1812 }
1813
1814 /*
1815  * inputs:
1816  * zc_name              name of filesystem
1817  * zc_obj               object to find
1818  *
1819  * outputs:
1820  * zc_value             name of object
1821  */
1822 static int
1823 zfs_ioc_obj_to_path(zfs_cmd_t *zc)
1824 {
1825         objset_t *os;
1826         int error;
1827
1828         /* XXX reading from objset not owned */
1829         if ((error = dmu_objset_hold(zc->zc_name, FTAG, &os)) != 0)
1830                 return (error);
1831         if (dmu_objset_type(os) != DMU_OST_ZFS) {
1832                 dmu_objset_rele(os, FTAG);
1833                 return (SET_ERROR(EINVAL));
1834         }
1835         error = zfs_obj_to_path(os, zc->zc_obj, zc->zc_value,
1836             sizeof (zc->zc_value));
1837         dmu_objset_rele(os, FTAG);
1838
1839         return (error);
1840 }
1841
1842 /*
1843  * inputs:
1844  * zc_name              name of filesystem
1845  * zc_obj               object to find
1846  *
1847  * outputs:
1848  * zc_stat              stats on object
1849  * zc_value             path to object
1850  */
1851 static int
1852 zfs_ioc_obj_to_stats(zfs_cmd_t *zc)
1853 {
1854         objset_t *os;
1855         int error;
1856
1857         /* XXX reading from objset not owned */
1858         if ((error = dmu_objset_hold(zc->zc_name, FTAG, &os)) != 0)
1859                 return (error);
1860         if (dmu_objset_type(os) != DMU_OST_ZFS) {
1861                 dmu_objset_rele(os, FTAG);
1862                 return (SET_ERROR(EINVAL));
1863         }
1864         error = zfs_obj_to_stats(os, zc->zc_obj, &zc->zc_stat, zc->zc_value,
1865             sizeof (zc->zc_value));
1866         dmu_objset_rele(os, FTAG);
1867
1868         return (error);
1869 }
1870
1871 static int
1872 zfs_ioc_vdev_add(zfs_cmd_t *zc)
1873 {
1874         spa_t *spa;
1875         int error;
1876         nvlist_t *config, **l2cache, **spares;
1877         uint_t nl2cache = 0, nspares = 0;
1878
1879         error = spa_open(zc->zc_name, &spa, FTAG);
1880         if (error != 0)
1881                 return (error);
1882
1883         error = get_nvlist(zc->zc_nvlist_conf, zc->zc_nvlist_conf_size,
1884             zc->zc_iflags, &config);
1885         (void) nvlist_lookup_nvlist_array(config, ZPOOL_CONFIG_L2CACHE,
1886             &l2cache, &nl2cache);
1887
1888         (void) nvlist_lookup_nvlist_array(config, ZPOOL_CONFIG_SPARES,
1889             &spares, &nspares);
1890
1891 #ifdef illumos
1892         /*
1893          * A root pool with concatenated devices is not supported.
1894          * Thus, can not add a device to a root pool.
1895          *
1896          * Intent log device can not be added to a rootpool because
1897          * during mountroot, zil is replayed, a seperated log device
1898          * can not be accessed during the mountroot time.
1899          *
1900          * l2cache and spare devices are ok to be added to a rootpool.
1901          */
1902         if (spa_bootfs(spa) != 0 && nl2cache == 0 && nspares == 0) {
1903                 nvlist_free(config);
1904                 spa_close(spa, FTAG);
1905                 return (SET_ERROR(EDOM));
1906         }
1907 #endif /* illumos */
1908
1909         if (error == 0) {
1910                 error = spa_vdev_add(spa, config);
1911                 nvlist_free(config);
1912         }
1913         spa_close(spa, FTAG);
1914         return (error);
1915 }
1916
1917 /*
1918  * inputs:
1919  * zc_name              name of the pool
1920  * zc_nvlist_conf       nvlist of devices to remove
1921  * zc_cookie            to stop the remove?
1922  */
1923 static int
1924 zfs_ioc_vdev_remove(zfs_cmd_t *zc)
1925 {
1926         spa_t *spa;
1927         int error;
1928
1929         error = spa_open(zc->zc_name, &spa, FTAG);
1930         if (error != 0)
1931                 return (error);
1932         error = spa_vdev_remove(spa, zc->zc_guid, B_FALSE);
1933         spa_close(spa, FTAG);
1934         return (error);
1935 }
1936
1937 static int
1938 zfs_ioc_vdev_set_state(zfs_cmd_t *zc)
1939 {
1940         spa_t *spa;
1941         int error;
1942         vdev_state_t newstate = VDEV_STATE_UNKNOWN;
1943
1944         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
1945                 return (error);
1946         switch (zc->zc_cookie) {
1947         case VDEV_STATE_ONLINE:
1948                 error = vdev_online(spa, zc->zc_guid, zc->zc_obj, &newstate);
1949                 break;
1950
1951         case VDEV_STATE_OFFLINE:
1952                 error = vdev_offline(spa, zc->zc_guid, zc->zc_obj);
1953                 break;
1954
1955         case VDEV_STATE_FAULTED:
1956                 if (zc->zc_obj != VDEV_AUX_ERR_EXCEEDED &&
1957                     zc->zc_obj != VDEV_AUX_EXTERNAL)
1958                         zc->zc_obj = VDEV_AUX_ERR_EXCEEDED;
1959
1960                 error = vdev_fault(spa, zc->zc_guid, zc->zc_obj);
1961                 break;
1962
1963         case VDEV_STATE_DEGRADED:
1964                 if (zc->zc_obj != VDEV_AUX_ERR_EXCEEDED &&
1965                     zc->zc_obj != VDEV_AUX_EXTERNAL)
1966                         zc->zc_obj = VDEV_AUX_ERR_EXCEEDED;
1967
1968                 error = vdev_degrade(spa, zc->zc_guid, zc->zc_obj);
1969                 break;
1970
1971         default:
1972                 error = SET_ERROR(EINVAL);
1973         }
1974         zc->zc_cookie = newstate;
1975         spa_close(spa, FTAG);
1976         return (error);
1977 }
1978
1979 static int
1980 zfs_ioc_vdev_attach(zfs_cmd_t *zc)
1981 {
1982         spa_t *spa;
1983         int replacing = zc->zc_cookie;
1984         nvlist_t *config;
1985         int error;
1986
1987         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
1988                 return (error);
1989
1990         if ((error = get_nvlist(zc->zc_nvlist_conf, zc->zc_nvlist_conf_size,
1991             zc->zc_iflags, &config)) == 0) {
1992                 error = spa_vdev_attach(spa, zc->zc_guid, config, replacing);
1993                 nvlist_free(config);
1994         }
1995
1996         spa_close(spa, FTAG);
1997         return (error);
1998 }
1999
2000 static int
2001 zfs_ioc_vdev_detach(zfs_cmd_t *zc)
2002 {
2003         spa_t *spa;
2004         int error;
2005
2006         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
2007                 return (error);
2008
2009         error = spa_vdev_detach(spa, zc->zc_guid, 0, B_FALSE);
2010
2011         spa_close(spa, FTAG);
2012         return (error);
2013 }
2014
2015 static int
2016 zfs_ioc_vdev_split(zfs_cmd_t *zc)
2017 {
2018         spa_t *spa;
2019         nvlist_t *config, *props = NULL;
2020         int error;
2021         boolean_t exp = !!(zc->zc_cookie & ZPOOL_EXPORT_AFTER_SPLIT);
2022
2023         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
2024                 return (error);
2025
2026         if (error = get_nvlist(zc->zc_nvlist_conf, zc->zc_nvlist_conf_size,
2027             zc->zc_iflags, &config)) {
2028                 spa_close(spa, FTAG);
2029                 return (error);
2030         }
2031
2032         if (zc->zc_nvlist_src_size != 0 && (error =
2033             get_nvlist(zc->zc_nvlist_src, zc->zc_nvlist_src_size,
2034             zc->zc_iflags, &props))) {
2035                 spa_close(spa, FTAG);
2036                 nvlist_free(config);
2037                 return (error);
2038         }
2039
2040         error = spa_vdev_split_mirror(spa, zc->zc_string, config, props, exp);
2041
2042         spa_close(spa, FTAG);
2043
2044         nvlist_free(config);
2045         nvlist_free(props);
2046
2047         return (error);
2048 }
2049
2050 static int
2051 zfs_ioc_vdev_setpath(zfs_cmd_t *zc)
2052 {
2053         spa_t *spa;
2054         char *path = zc->zc_value;
2055         uint64_t guid = zc->zc_guid;
2056         int error;
2057
2058         error = spa_open(zc->zc_name, &spa, FTAG);
2059         if (error != 0)
2060                 return (error);
2061
2062         error = spa_vdev_setpath(spa, guid, path);
2063         spa_close(spa, FTAG);
2064         return (error);
2065 }
2066
2067 static int
2068 zfs_ioc_vdev_setfru(zfs_cmd_t *zc)
2069 {
2070         spa_t *spa;
2071         char *fru = zc->zc_value;
2072         uint64_t guid = zc->zc_guid;
2073         int error;
2074
2075         error = spa_open(zc->zc_name, &spa, FTAG);
2076         if (error != 0)
2077                 return (error);
2078
2079         error = spa_vdev_setfru(spa, guid, fru);
2080         spa_close(spa, FTAG);
2081         return (error);
2082 }
2083
2084 static int
2085 zfs_ioc_objset_stats_impl(zfs_cmd_t *zc, objset_t *os)
2086 {
2087         int error = 0;
2088         nvlist_t *nv;
2089
2090         dmu_objset_fast_stat(os, &zc->zc_objset_stats);
2091
2092         if (zc->zc_nvlist_dst != 0 &&
2093             (error = dsl_prop_get_all(os, &nv)) == 0) {
2094                 dmu_objset_stats(os, nv);
2095                 /*
2096                  * NB: zvol_get_stats() will read the objset contents,
2097                  * which we aren't supposed to do with a
2098                  * DS_MODE_USER hold, because it could be
2099                  * inconsistent.  So this is a bit of a workaround...
2100                  * XXX reading with out owning
2101                  */
2102                 if (!zc->zc_objset_stats.dds_inconsistent &&
2103                     dmu_objset_type(os) == DMU_OST_ZVOL) {
2104                         error = zvol_get_stats(os, nv);
2105                         if (error == EIO)
2106                                 return (error);
2107                         VERIFY0(error);
2108                 }
2109                 error = put_nvlist(zc, nv);
2110                 nvlist_free(nv);
2111         }
2112
2113         return (error);
2114 }
2115
2116 /*
2117  * inputs:
2118  * zc_name              name of filesystem
2119  * zc_nvlist_dst_size   size of buffer for property nvlist
2120  *
2121  * outputs:
2122  * zc_objset_stats      stats
2123  * zc_nvlist_dst        property nvlist
2124  * zc_nvlist_dst_size   size of property nvlist
2125  */
2126 static int
2127 zfs_ioc_objset_stats(zfs_cmd_t *zc)
2128 {
2129         objset_t *os;
2130         int error;
2131
2132         error = dmu_objset_hold(zc->zc_name, FTAG, &os);
2133         if (error == 0) {
2134                 error = zfs_ioc_objset_stats_impl(zc, os);
2135                 dmu_objset_rele(os, FTAG);
2136         }
2137
2138         if (error == ENOMEM)
2139                 error = 0;
2140         return (error);
2141 }
2142
2143 /*
2144  * inputs:
2145  * zc_name              name of filesystem
2146  * zc_nvlist_dst_size   size of buffer for property nvlist
2147  *
2148  * outputs:
2149  * zc_nvlist_dst        received property nvlist
2150  * zc_nvlist_dst_size   size of received property nvlist
2151  *
2152  * Gets received properties (distinct from local properties on or after
2153  * SPA_VERSION_RECVD_PROPS) for callers who want to differentiate received from
2154  * local property values.
2155  */
2156 static int
2157 zfs_ioc_objset_recvd_props(zfs_cmd_t *zc)
2158 {
2159         int error = 0;
2160         nvlist_t *nv;
2161
2162         /*
2163          * Without this check, we would return local property values if the
2164          * caller has not already received properties on or after
2165          * SPA_VERSION_RECVD_PROPS.
2166          */
2167         if (!dsl_prop_get_hasrecvd(zc->zc_name))
2168                 return (SET_ERROR(ENOTSUP));
2169
2170         if (zc->zc_nvlist_dst != 0 &&
2171             (error = dsl_prop_get_received(zc->zc_name, &nv)) == 0) {
2172                 error = put_nvlist(zc, nv);
2173                 nvlist_free(nv);
2174         }
2175
2176         return (error);
2177 }
2178
2179 static int
2180 nvl_add_zplprop(objset_t *os, nvlist_t *props, zfs_prop_t prop)
2181 {
2182         uint64_t value;
2183         int error;
2184
2185         /*
2186          * zfs_get_zplprop() will either find a value or give us
2187          * the default value (if there is one).
2188          */
2189         if ((error = zfs_get_zplprop(os, prop, &value)) != 0)
2190                 return (error);
2191         VERIFY(nvlist_add_uint64(props, zfs_prop_to_name(prop), value) == 0);
2192         return (0);
2193 }
2194
2195 /*
2196  * inputs:
2197  * zc_name              name of filesystem
2198  * zc_nvlist_dst_size   size of buffer for zpl property nvlist
2199  *
2200  * outputs:
2201  * zc_nvlist_dst        zpl property nvlist
2202  * zc_nvlist_dst_size   size of zpl property nvlist
2203  */
2204 static int
2205 zfs_ioc_objset_zplprops(zfs_cmd_t *zc)
2206 {
2207         objset_t *os;
2208         int err;
2209
2210         /* XXX reading without owning */
2211         if (err = dmu_objset_hold(zc->zc_name, FTAG, &os))
2212                 return (err);
2213
2214         dmu_objset_fast_stat(os, &zc->zc_objset_stats);
2215
2216         /*
2217          * NB: nvl_add_zplprop() will read the objset contents,
2218          * which we aren't supposed to do with a DS_MODE_USER
2219          * hold, because it could be inconsistent.
2220          */
2221         if (zc->zc_nvlist_dst != 0 &&
2222             !zc->zc_objset_stats.dds_inconsistent &&
2223             dmu_objset_type(os) == DMU_OST_ZFS) {
2224                 nvlist_t *nv;
2225
2226                 VERIFY(nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_SLEEP) == 0);
2227                 if ((err = nvl_add_zplprop(os, nv, ZFS_PROP_VERSION)) == 0 &&
2228                     (err = nvl_add_zplprop(os, nv, ZFS_PROP_NORMALIZE)) == 0 &&
2229                     (err = nvl_add_zplprop(os, nv, ZFS_PROP_UTF8ONLY)) == 0 &&
2230                     (err = nvl_add_zplprop(os, nv, ZFS_PROP_CASE)) == 0)
2231                         err = put_nvlist(zc, nv);
2232                 nvlist_free(nv);
2233         } else {
2234                 err = SET_ERROR(ENOENT);
2235         }
2236         dmu_objset_rele(os, FTAG);
2237         return (err);
2238 }
2239
2240 boolean_t
2241 dataset_name_hidden(const char *name)
2242 {
2243         /*
2244          * Skip over datasets that are not visible in this zone,
2245          * internal datasets (which have a $ in their name), and
2246          * temporary datasets (which have a % in their name).
2247          */
2248         if (strchr(name, '$') != NULL)
2249                 return (B_TRUE);
2250         if (strchr(name, '%') != NULL)
2251                 return (B_TRUE);
2252         if (!INGLOBALZONE(curthread) && !zone_dataset_visible(name, NULL))
2253                 return (B_TRUE);
2254         return (B_FALSE);
2255 }
2256
2257 /*
2258  * inputs:
2259  * zc_name              name of filesystem
2260  * zc_cookie            zap cursor
2261  * zc_nvlist_dst_size   size of buffer for property nvlist
2262  *
2263  * outputs:
2264  * zc_name              name of next filesystem
2265  * zc_cookie            zap cursor
2266  * zc_objset_stats      stats
2267  * zc_nvlist_dst        property nvlist
2268  * zc_nvlist_dst_size   size of property nvlist
2269  */
2270 static int
2271 zfs_ioc_dataset_list_next(zfs_cmd_t *zc)
2272 {
2273         objset_t *os;
2274         int error;
2275         char *p;
2276         size_t orig_len = strlen(zc->zc_name);
2277
2278 top:
2279         if (error = dmu_objset_hold(zc->zc_name, FTAG, &os)) {
2280                 if (error == ENOENT)
2281                         error = SET_ERROR(ESRCH);
2282                 return (error);
2283         }
2284
2285         p = strrchr(zc->zc_name, '/');
2286         if (p == NULL || p[1] != '\0')
2287                 (void) strlcat(zc->zc_name, "/", sizeof (zc->zc_name));
2288         p = zc->zc_name + strlen(zc->zc_name);
2289
2290         do {
2291                 error = dmu_dir_list_next(os,
2292                     sizeof (zc->zc_name) - (p - zc->zc_name), p,
2293                     NULL, &zc->zc_cookie);
2294                 if (error == ENOENT)
2295                         error = SET_ERROR(ESRCH);
2296         } while (error == 0 && dataset_name_hidden(zc->zc_name));
2297         dmu_objset_rele(os, FTAG);
2298
2299         /*
2300          * If it's an internal dataset (ie. with a '$' in its name),
2301          * don't try to get stats for it, otherwise we'll return ENOENT.
2302          */
2303         if (error == 0 && strchr(zc->zc_name, '$') == NULL) {
2304                 error = zfs_ioc_objset_stats(zc); /* fill in the stats */
2305                 if (error == ENOENT) {
2306                         /* We lost a race with destroy, get the next one. */
2307                         zc->zc_name[orig_len] = '\0';
2308                         goto top;
2309                 }
2310         }
2311         return (error);
2312 }
2313
2314 /*
2315  * inputs:
2316  * zc_name              name of filesystem
2317  * zc_cookie            zap cursor
2318  * zc_nvlist_dst_size   size of buffer for property nvlist
2319  * zc_simple            when set, only name is requested
2320  *
2321  * outputs:
2322  * zc_name              name of next snapshot
2323  * zc_objset_stats      stats
2324  * zc_nvlist_dst        property nvlist
2325  * zc_nvlist_dst_size   size of property nvlist
2326  */
2327 static int
2328 zfs_ioc_snapshot_list_next(zfs_cmd_t *zc)
2329 {
2330         objset_t *os;
2331         int error;
2332
2333         error = dmu_objset_hold(zc->zc_name, FTAG, &os);
2334         if (error != 0) {
2335                 return (error == ENOENT ? ESRCH : error);
2336         }
2337
2338         /*
2339          * A dataset name of maximum length cannot have any snapshots,
2340          * so exit immediately.
2341          */
2342         if (strlcat(zc->zc_name, "@", sizeof (zc->zc_name)) >= MAXNAMELEN) {
2343                 dmu_objset_rele(os, FTAG);
2344                 return (SET_ERROR(ESRCH));
2345         }
2346
2347         error = dmu_snapshot_list_next(os,
2348             sizeof (zc->zc_name) - strlen(zc->zc_name),
2349             zc->zc_name + strlen(zc->zc_name), &zc->zc_obj, &zc->zc_cookie,
2350             NULL);
2351
2352         if (error == 0 && !zc->zc_simple) {
2353                 dsl_dataset_t *ds;
2354                 dsl_pool_t *dp = os->os_dsl_dataset->ds_dir->dd_pool;
2355
2356                 error = dsl_dataset_hold_obj(dp, zc->zc_obj, FTAG, &ds);
2357                 if (error == 0) {
2358                         objset_t *ossnap;
2359
2360                         error = dmu_objset_from_ds(ds, &ossnap);
2361                         if (error == 0)
2362                                 error = zfs_ioc_objset_stats_impl(zc, ossnap);
2363                         dsl_dataset_rele(ds, FTAG);
2364                 }
2365         } else if (error == ENOENT) {
2366                 error = SET_ERROR(ESRCH);
2367         }
2368
2369         dmu_objset_rele(os, FTAG);
2370         /* if we failed, undo the @ that we tacked on to zc_name */
2371         if (error != 0)
2372                 *strchr(zc->zc_name, '@') = '\0';
2373         return (error);
2374 }
2375
2376 static int
2377 zfs_prop_set_userquota(const char *dsname, nvpair_t *pair)
2378 {
2379         const char *propname = nvpair_name(pair);
2380         uint64_t *valary;
2381         unsigned int vallen;
2382         const char *domain;
2383         char *dash;
2384         zfs_userquota_prop_t type;
2385         uint64_t rid;
2386         uint64_t quota;
2387         zfsvfs_t *zfsvfs;
2388         int err;
2389
2390         if (nvpair_type(pair) == DATA_TYPE_NVLIST) {
2391                 nvlist_t *attrs;
2392                 VERIFY(nvpair_value_nvlist(pair, &attrs) == 0);
2393                 if (nvlist_lookup_nvpair(attrs, ZPROP_VALUE,
2394                     &pair) != 0)
2395                         return (SET_ERROR(EINVAL));
2396         }
2397
2398         /*
2399          * A correctly constructed propname is encoded as
2400          * userquota@<rid>-<domain>.
2401          */
2402         if ((dash = strchr(propname, '-')) == NULL ||
2403             nvpair_value_uint64_array(pair, &valary, &vallen) != 0 ||
2404             vallen != 3)
2405                 return (SET_ERROR(EINVAL));
2406
2407         domain = dash + 1;
2408         type = valary[0];
2409         rid = valary[1];
2410         quota = valary[2];
2411
2412         err = zfsvfs_hold(dsname, FTAG, &zfsvfs, B_FALSE);
2413         if (err == 0) {
2414                 err = zfs_set_userquota(zfsvfs, type, domain, rid, quota);
2415                 zfsvfs_rele(zfsvfs, FTAG);
2416         }
2417
2418         return (err);
2419 }
2420
2421 /*
2422  * If the named property is one that has a special function to set its value,
2423  * return 0 on success and a positive error code on failure; otherwise if it is
2424  * not one of the special properties handled by this function, return -1.
2425  *
2426  * XXX: It would be better for callers of the property interface if we handled
2427  * these special cases in dsl_prop.c (in the dsl layer).
2428  */
2429 static int
2430 zfs_prop_set_special(const char *dsname, zprop_source_t source,
2431     nvpair_t *pair)
2432 {
2433         const char *propname = nvpair_name(pair);
2434         zfs_prop_t prop = zfs_name_to_prop(propname);
2435         uint64_t intval;
2436         int err = -1;
2437
2438         if (prop == ZPROP_INVAL) {
2439                 if (zfs_prop_userquota(propname))
2440                         return (zfs_prop_set_userquota(dsname, pair));
2441                 return (-1);
2442         }
2443
2444         if (nvpair_type(pair) == DATA_TYPE_NVLIST) {
2445                 nvlist_t *attrs;
2446                 VERIFY(nvpair_value_nvlist(pair, &attrs) == 0);
2447                 VERIFY(nvlist_lookup_nvpair(attrs, ZPROP_VALUE,
2448                     &pair) == 0);
2449         }
2450
2451         if (zfs_prop_get_type(prop) == PROP_TYPE_STRING)
2452                 return (-1);
2453
2454         VERIFY(0 == nvpair_value_uint64(pair, &intval));
2455
2456         switch (prop) {
2457         case ZFS_PROP_QUOTA:
2458                 err = dsl_dir_set_quota(dsname, source, intval);
2459                 break;
2460         case ZFS_PROP_REFQUOTA:
2461                 err = dsl_dataset_set_refquota(dsname, source, intval);
2462                 break;
2463         case ZFS_PROP_FILESYSTEM_LIMIT:
2464         case ZFS_PROP_SNAPSHOT_LIMIT:
2465                 if (intval == UINT64_MAX) {
2466                         /* clearing the limit, just do it */
2467                         err = 0;
2468                 } else {
2469                         err = dsl_dir_activate_fs_ss_limit(dsname);
2470                 }
2471                 /*
2472                  * Set err to -1 to force the zfs_set_prop_nvlist code down the
2473                  * default path to set the value in the nvlist.
2474                  */
2475                 if (err == 0)
2476                         err = -1;
2477                 break;
2478         case ZFS_PROP_RESERVATION:
2479                 err = dsl_dir_set_reservation(dsname, source, intval);
2480                 break;
2481         case ZFS_PROP_REFRESERVATION:
2482                 err = dsl_dataset_set_refreservation(dsname, source, intval);
2483                 break;
2484         case ZFS_PROP_VOLSIZE:
2485                 err = zvol_set_volsize(dsname, intval);
2486                 break;
2487         case ZFS_PROP_VERSION:
2488         {
2489                 zfsvfs_t *zfsvfs;
2490
2491                 if ((err = zfsvfs_hold(dsname, FTAG, &zfsvfs, B_TRUE)) != 0)
2492                         break;
2493
2494                 err = zfs_set_version(zfsvfs, intval);
2495                 zfsvfs_rele(zfsvfs, FTAG);
2496
2497                 if (err == 0 && intval >= ZPL_VERSION_USERSPACE) {
2498                         zfs_cmd_t *zc;
2499
2500                         zc = kmem_zalloc(sizeof (zfs_cmd_t), KM_SLEEP);
2501                         (void) strcpy(zc->zc_name, dsname);
2502                         (void) zfs_ioc_userspace_upgrade(zc);
2503                         kmem_free(zc, sizeof (zfs_cmd_t));
2504                 }
2505                 break;
2506         }
2507         default:
2508                 err = -1;
2509         }
2510
2511         return (err);
2512 }
2513
2514 /*
2515  * This function is best effort. If it fails to set any of the given properties,
2516  * it continues to set as many as it can and returns the last error
2517  * encountered. If the caller provides a non-NULL errlist, it will be filled in
2518  * with the list of names of all the properties that failed along with the
2519  * corresponding error numbers.
2520  *
2521  * If every property is set successfully, zero is returned and errlist is not
2522  * modified.
2523  */
2524 int
2525 zfs_set_prop_nvlist(const char *dsname, zprop_source_t source, nvlist_t *nvl,
2526     nvlist_t *errlist)
2527 {
2528         nvpair_t *pair;
2529         nvpair_t *propval;
2530         int rv = 0;
2531         uint64_t intval;
2532         char *strval;
2533         nvlist_t *genericnvl = fnvlist_alloc();
2534         nvlist_t *retrynvl = fnvlist_alloc();
2535
2536 retry:
2537         pair = NULL;
2538         while ((pair = nvlist_next_nvpair(nvl, pair)) != NULL) {
2539                 const char *propname = nvpair_name(pair);
2540                 zfs_prop_t prop = zfs_name_to_prop(propname);
2541                 int err = 0;
2542
2543                 /* decode the property value */
2544                 propval = pair;
2545                 if (nvpair_type(pair) == DATA_TYPE_NVLIST) {
2546                         nvlist_t *attrs;
2547                         attrs = fnvpair_value_nvlist(pair);
2548                         if (nvlist_lookup_nvpair(attrs, ZPROP_VALUE,
2549                             &propval) != 0)
2550                                 err = SET_ERROR(EINVAL);
2551                 }
2552
2553                 /* Validate value type */
2554                 if (err == 0 && prop == ZPROP_INVAL) {
2555                         if (zfs_prop_user(propname)) {
2556                                 if (nvpair_type(propval) != DATA_TYPE_STRING)
2557                                         err = SET_ERROR(EINVAL);
2558                         } else if (zfs_prop_userquota(propname)) {
2559                                 if (nvpair_type(propval) !=
2560                                     DATA_TYPE_UINT64_ARRAY)
2561                                         err = SET_ERROR(EINVAL);
2562                         } else {
2563                                 err = SET_ERROR(EINVAL);
2564                         }
2565                 } else if (err == 0) {
2566                         if (nvpair_type(propval) == DATA_TYPE_STRING) {
2567                                 if (zfs_prop_get_type(prop) != PROP_TYPE_STRING)
2568                                         err = SET_ERROR(EINVAL);
2569                         } else if (nvpair_type(propval) == DATA_TYPE_UINT64) {
2570                                 const char *unused;
2571
2572                                 intval = fnvpair_value_uint64(propval);
2573
2574                                 switch (zfs_prop_get_type(prop)) {
2575                                 case PROP_TYPE_NUMBER:
2576                                         break;
2577                                 case PROP_TYPE_STRING:
2578                                         err = SET_ERROR(EINVAL);
2579                                         break;
2580                                 case PROP_TYPE_INDEX:
2581                                         if (zfs_prop_index_to_string(prop,
2582                                             intval, &unused) != 0)
2583                                                 err = SET_ERROR(EINVAL);
2584                                         break;
2585                                 default:
2586                                         cmn_err(CE_PANIC,
2587                                             "unknown property type");
2588                                 }
2589                         } else {
2590                                 err = SET_ERROR(EINVAL);
2591                         }
2592                 }
2593
2594                 /* Validate permissions */
2595                 if (err == 0)
2596                         err = zfs_check_settable(dsname, pair, CRED());
2597
2598                 if (err == 0) {
2599                         err = zfs_prop_set_special(dsname, source, pair);
2600                         if (err == -1) {
2601                                 /*
2602                                  * For better performance we build up a list of
2603                                  * properties to set in a single transaction.
2604                                  */
2605                                 err = nvlist_add_nvpair(genericnvl, pair);
2606                         } else if (err != 0 && nvl != retrynvl) {
2607                                 /*
2608                                  * This may be a spurious error caused by
2609                                  * receiving quota and reservation out of order.
2610                                  * Try again in a second pass.
2611                                  */
2612                                 err = nvlist_add_nvpair(retrynvl, pair);
2613                         }
2614                 }
2615
2616                 if (err != 0) {
2617                         if (errlist != NULL)
2618                                 fnvlist_add_int32(errlist, propname, err);
2619                         rv = err;
2620                 }
2621         }
2622
2623         if (nvl != retrynvl && !nvlist_empty(retrynvl)) {
2624                 nvl = retrynvl;
2625                 goto retry;
2626         }
2627
2628         if (!nvlist_empty(genericnvl) &&
2629             dsl_props_set(dsname, source, genericnvl) != 0) {
2630                 /*
2631                  * If this fails, we still want to set as many properties as we
2632                  * can, so try setting them individually.
2633                  */
2634                 pair = NULL;
2635                 while ((pair = nvlist_next_nvpair(genericnvl, pair)) != NULL) {
2636                         const char *propname = nvpair_name(pair);
2637                         int err = 0;
2638
2639                         propval = pair;
2640                         if (nvpair_type(pair) == DATA_TYPE_NVLIST) {
2641                                 nvlist_t *attrs;
2642                                 attrs = fnvpair_value_nvlist(pair);
2643                                 propval = fnvlist_lookup_nvpair(attrs,
2644                                     ZPROP_VALUE);
2645                         }
2646
2647                         if (nvpair_type(propval) == DATA_TYPE_STRING) {
2648                                 strval = fnvpair_value_string(propval);
2649                                 err = dsl_prop_set_string(dsname, propname,
2650                                     source, strval);
2651                         } else {
2652                                 intval = fnvpair_value_uint64(propval);
2653                                 err = dsl_prop_set_int(dsname, propname, source,
2654                                     intval);
2655                         }
2656
2657                         if (err != 0) {
2658                                 if (errlist != NULL) {
2659                                         fnvlist_add_int32(errlist, propname,
2660                                             err);
2661                                 }
2662                                 rv = err;
2663                         }
2664                 }
2665         }
2666         nvlist_free(genericnvl);
2667         nvlist_free(retrynvl);
2668
2669         return (rv);
2670 }
2671
2672 /*
2673  * Check that all the properties are valid user properties.
2674  */
2675 static int
2676 zfs_check_userprops(const char *fsname, nvlist_t *nvl)
2677 {
2678         nvpair_t *pair = NULL;
2679         int error = 0;
2680
2681         while ((pair = nvlist_next_nvpair(nvl, pair)) != NULL) {
2682                 const char *propname = nvpair_name(pair);
2683
2684                 if (!zfs_prop_user(propname) ||
2685                     nvpair_type(pair) != DATA_TYPE_STRING)
2686                         return (SET_ERROR(EINVAL));
2687
2688                 if (error = zfs_secpolicy_write_perms(fsname,
2689                     ZFS_DELEG_PERM_USERPROP, CRED()))
2690                         return (error);
2691
2692                 if (strlen(propname) >= ZAP_MAXNAMELEN)
2693                         return (SET_ERROR(ENAMETOOLONG));
2694
2695                 if (strlen(fnvpair_value_string(pair)) >= ZAP_MAXVALUELEN)
2696                         return (E2BIG);
2697         }
2698         return (0);
2699 }
2700
2701 static void
2702 props_skip(nvlist_t *props, nvlist_t *skipped, nvlist_t **newprops)
2703 {
2704         nvpair_t *pair;
2705
2706         VERIFY(nvlist_alloc(newprops, NV_UNIQUE_NAME, KM_SLEEP) == 0);
2707
2708         pair = NULL;
2709         while ((pair = nvlist_next_nvpair(props, pair)) != NULL) {
2710                 if (nvlist_exists(skipped, nvpair_name(pair)))
2711                         continue;
2712
2713                 VERIFY(nvlist_add_nvpair(*newprops, pair) == 0);
2714         }
2715 }
2716
2717 static int
2718 clear_received_props(const char *dsname, nvlist_t *props,
2719     nvlist_t *skipped)
2720 {
2721         int err = 0;
2722         nvlist_t *cleared_props = NULL;
2723         props_skip(props, skipped, &cleared_props);
2724         if (!nvlist_empty(cleared_props)) {
2725                 /*
2726                  * Acts on local properties until the dataset has received
2727                  * properties at least once on or after SPA_VERSION_RECVD_PROPS.
2728                  */
2729                 zprop_source_t flags = (ZPROP_SRC_NONE |
2730                     (dsl_prop_get_hasrecvd(dsname) ? ZPROP_SRC_RECEIVED : 0));
2731                 err = zfs_set_prop_nvlist(dsname, flags, cleared_props, NULL);
2732         }
2733         nvlist_free(cleared_props);
2734         return (err);
2735 }
2736
2737 /*
2738  * inputs:
2739  * zc_name              name of filesystem
2740  * zc_value             name of property to set
2741  * zc_nvlist_src{_size} nvlist of properties to apply
2742  * zc_cookie            received properties flag
2743  *
2744  * outputs:
2745  * zc_nvlist_dst{_size} error for each unapplied received property
2746  */
2747 static int
2748 zfs_ioc_set_prop(zfs_cmd_t *zc)
2749 {
2750         nvlist_t *nvl;
2751         boolean_t received = zc->zc_cookie;
2752         zprop_source_t source = (received ? ZPROP_SRC_RECEIVED :
2753             ZPROP_SRC_LOCAL);
2754         nvlist_t *errors;
2755         int error;
2756
2757         if ((error = get_nvlist(zc->zc_nvlist_src, zc->zc_nvlist_src_size,
2758             zc->zc_iflags, &nvl)) != 0)
2759                 return (error);
2760
2761         if (received) {
2762                 nvlist_t *origprops;
2763
2764                 if (dsl_prop_get_received(zc->zc_name, &origprops) == 0) {
2765                         (void) clear_received_props(zc->zc_name,
2766                             origprops, nvl);
2767                         nvlist_free(origprops);
2768                 }
2769
2770                 error = dsl_prop_set_hasrecvd(zc->zc_name);
2771         }
2772
2773         errors = fnvlist_alloc();
2774         if (error == 0)
2775                 error = zfs_set_prop_nvlist(zc->zc_name, source, nvl, errors);
2776
2777         if (zc->zc_nvlist_dst != 0 && errors != NULL) {
2778                 (void) put_nvlist(zc, errors);
2779         }
2780
2781         nvlist_free(errors);
2782         nvlist_free(nvl);
2783         return (error);
2784 }
2785
2786 /*
2787  * inputs:
2788  * zc_name              name of filesystem
2789  * zc_value             name of property to inherit
2790  * zc_cookie            revert to received value if TRUE
2791  *
2792  * outputs:             none
2793  */
2794 static int
2795 zfs_ioc_inherit_prop(zfs_cmd_t *zc)
2796 {
2797         const char *propname = zc->zc_value;
2798         zfs_prop_t prop = zfs_name_to_prop(propname);
2799         boolean_t received = zc->zc_cookie;
2800         zprop_source_t source = (received
2801             ? ZPROP_SRC_NONE            /* revert to received value, if any */
2802             : ZPROP_SRC_INHERITED);     /* explicitly inherit */
2803
2804         if (received) {
2805                 nvlist_t *dummy;
2806                 nvpair_t *pair;
2807                 zprop_type_t type;
2808                 int err;
2809
2810                 /*
2811                  * zfs_prop_set_special() expects properties in the form of an
2812                  * nvpair with type info.
2813                  */
2814                 if (prop == ZPROP_INVAL) {
2815                         if (!zfs_prop_user(propname))
2816                                 return (SET_ERROR(EINVAL));
2817
2818                         type = PROP_TYPE_STRING;
2819                 } else if (prop == ZFS_PROP_VOLSIZE ||
2820                     prop == ZFS_PROP_VERSION) {
2821                         return (SET_ERROR(EINVAL));
2822                 } else {
2823                         type = zfs_prop_get_type(prop);
2824                 }
2825
2826                 VERIFY(nvlist_alloc(&dummy, NV_UNIQUE_NAME, KM_SLEEP) == 0);
2827
2828                 switch (type) {
2829                 case PROP_TYPE_STRING:
2830                         VERIFY(0 == nvlist_add_string(dummy, propname, ""));
2831                         break;
2832                 case PROP_TYPE_NUMBER:
2833                 case PROP_TYPE_INDEX:
2834                         VERIFY(0 == nvlist_add_uint64(dummy, propname, 0));
2835                         break;
2836                 default:
2837                         nvlist_free(dummy);
2838                         return (SET_ERROR(EINVAL));
2839                 }
2840
2841                 pair = nvlist_next_nvpair(dummy, NULL);
2842                 err = zfs_prop_set_special(zc->zc_name, source, pair);
2843                 nvlist_free(dummy);
2844                 if (err != -1)
2845                         return (err); /* special property already handled */
2846         } else {
2847                 /*
2848                  * Only check this in the non-received case. We want to allow
2849                  * 'inherit -S' to revert non-inheritable properties like quota
2850                  * and reservation to the received or default values even though
2851                  * they are not considered inheritable.
2852                  */
2853                 if (prop != ZPROP_INVAL && !zfs_prop_inheritable(prop))
2854                         return (SET_ERROR(EINVAL));
2855         }
2856
2857         /* property name has been validated by zfs_secpolicy_inherit_prop() */
2858         return (dsl_prop_inherit(zc->zc_name, zc->zc_value, source));
2859 }
2860
2861 static int
2862 zfs_ioc_pool_set_props(zfs_cmd_t *zc)
2863 {
2864         nvlist_t *props;
2865         spa_t *spa;
2866         int error;
2867         nvpair_t *pair;
2868
2869         if (error = get_nvlist(zc->zc_nvlist_src, zc->zc_nvlist_src_size,
2870             zc->zc_iflags, &props))
2871                 return (error);
2872
2873         /*
2874          * If the only property is the configfile, then just do a spa_lookup()
2875          * to handle the faulted case.
2876          */
2877         pair = nvlist_next_nvpair(props, NULL);
2878         if (pair != NULL && strcmp(nvpair_name(pair),
2879             zpool_prop_to_name(ZPOOL_PROP_CACHEFILE)) == 0 &&
2880             nvlist_next_nvpair(props, pair) == NULL) {
2881                 mutex_enter(&spa_namespace_lock);
2882                 if ((spa = spa_lookup(zc->zc_name)) != NULL) {
2883                         spa_configfile_set(spa, props, B_FALSE);
2884                         spa_config_sync(spa, B_FALSE, B_TRUE);
2885                 }
2886                 mutex_exit(&spa_namespace_lock);
2887                 if (spa != NULL) {
2888                         nvlist_free(props);
2889                         return (0);
2890                 }
2891         }
2892
2893         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0) {
2894                 nvlist_free(props);
2895                 return (error);
2896         }
2897
2898         error = spa_prop_set(spa, props);
2899
2900         nvlist_free(props);
2901         spa_close(spa, FTAG);
2902
2903         return (error);
2904 }
2905
2906 static int
2907 zfs_ioc_pool_get_props(zfs_cmd_t *zc)
2908 {
2909         spa_t *spa;
2910         int error;
2911         nvlist_t *nvp = NULL;
2912
2913         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0) {
2914                 /*
2915                  * If the pool is faulted, there may be properties we can still
2916                  * get (such as altroot and cachefile), so attempt to get them
2917                  * anyway.
2918                  */
2919                 mutex_enter(&spa_namespace_lock);
2920                 if ((spa = spa_lookup(zc->zc_name)) != NULL)
2921                         error = spa_prop_get(spa, &nvp);
2922                 mutex_exit(&spa_namespace_lock);
2923         } else {
2924                 error = spa_prop_get(spa, &nvp);
2925                 spa_close(spa, FTAG);
2926         }
2927
2928         if (error == 0 && zc->zc_nvlist_dst != 0)
2929                 error = put_nvlist(zc, nvp);
2930         else
2931                 error = SET_ERROR(EFAULT);
2932
2933         nvlist_free(nvp);
2934         return (error);
2935 }
2936
2937 /*
2938  * inputs:
2939  * zc_name              name of filesystem
2940  * zc_nvlist_src{_size} nvlist of delegated permissions
2941  * zc_perm_action       allow/unallow flag
2942  *
2943  * outputs:             none
2944  */
2945 static int
2946 zfs_ioc_set_fsacl(zfs_cmd_t *zc)
2947 {
2948         int error;
2949         nvlist_t *fsaclnv = NULL;
2950
2951         if ((error = get_nvlist(zc->zc_nvlist_src, zc->zc_nvlist_src_size,
2952             zc->zc_iflags, &fsaclnv)) != 0)
2953                 return (error);
2954
2955         /*
2956          * Verify nvlist is constructed correctly
2957          */
2958         if ((error = zfs_deleg_verify_nvlist(fsaclnv)) != 0) {
2959                 nvlist_free(fsaclnv);
2960                 return (SET_ERROR(EINVAL));
2961         }
2962
2963         /*
2964          * If we don't have PRIV_SYS_MOUNT, then validate
2965          * that user is allowed to hand out each permission in
2966          * the nvlist(s)
2967          */
2968
2969         error = secpolicy_zfs(CRED());
2970         if (error != 0) {
2971                 if (zc->zc_perm_action == B_FALSE) {
2972                         error = dsl_deleg_can_allow(zc->zc_name,
2973                             fsaclnv, CRED());
2974                 } else {
2975                         error = dsl_deleg_can_unallow(zc->zc_name,
2976                             fsaclnv, CRED());
2977                 }
2978         }
2979
2980         if (error == 0)
2981                 error = dsl_deleg_set(zc->zc_name, fsaclnv, zc->zc_perm_action);
2982
2983         nvlist_free(fsaclnv);
2984         return (error);
2985 }
2986
2987 /*
2988  * inputs:
2989  * zc_name              name of filesystem
2990  *
2991  * outputs:
2992  * zc_nvlist_src{_size} nvlist of delegated permissions
2993  */
2994 static int
2995 zfs_ioc_get_fsacl(zfs_cmd_t *zc)
2996 {
2997         nvlist_t *nvp;
2998         int error;
2999
3000         if ((error = dsl_deleg_get(zc->zc_name, &nvp)) == 0) {
3001                 error = put_nvlist(zc, nvp);
3002                 nvlist_free(nvp);
3003         }
3004
3005         return (error);
3006 }
3007
3008 /*
3009  * Search the vfs list for a specified resource.  Returns a pointer to it
3010  * or NULL if no suitable entry is found. The caller of this routine
3011  * is responsible for releasing the returned vfs pointer.
3012  */
3013 static vfs_t *
3014 zfs_get_vfs(const char *resource)
3015 {
3016         vfs_t *vfsp;
3017
3018         mtx_lock(&mountlist_mtx);
3019         TAILQ_FOREACH(vfsp, &mountlist, mnt_list) {
3020                 if (strcmp(refstr_value(vfsp->vfs_resource), resource) == 0) {
3021                         VFS_HOLD(vfsp);
3022                         break;
3023                 }
3024         }
3025         mtx_unlock(&mountlist_mtx);
3026         return (vfsp);
3027 }
3028
3029 /* ARGSUSED */
3030 static void
3031 zfs_create_cb(objset_t *os, void *arg, cred_t *cr, dmu_tx_t *tx)
3032 {
3033         zfs_creat_t *zct = arg;
3034
3035         zfs_create_fs(os, cr, zct->zct_zplprops, tx);
3036 }
3037
3038 #define ZFS_PROP_UNDEFINED      ((uint64_t)-1)
3039
3040 /*
3041  * inputs:
3042  * os                   parent objset pointer (NULL if root fs)
3043  * fuids_ok             fuids allowed in this version of the spa?
3044  * sa_ok                SAs allowed in this version of the spa?
3045  * createprops          list of properties requested by creator
3046  *
3047  * outputs:
3048  * zplprops     values for the zplprops we attach to the master node object
3049  * is_ci        true if requested file system will be purely case-insensitive
3050  *
3051  * Determine the settings for utf8only, normalization and
3052  * casesensitivity.  Specific values may have been requested by the
3053  * creator and/or we can inherit values from the parent dataset.  If
3054  * the file system is of too early a vintage, a creator can not
3055  * request settings for these properties, even if the requested
3056  * setting is the default value.  We don't actually want to create dsl
3057  * properties for these, so remove them from the source nvlist after
3058  * processing.
3059  */
3060 static int
3061 zfs_fill_zplprops_impl(objset_t *os, uint64_t zplver,
3062     boolean_t fuids_ok, boolean_t sa_ok, nvlist_t *createprops,
3063     nvlist_t *zplprops, boolean_t *is_ci)
3064 {
3065         uint64_t sense = ZFS_PROP_UNDEFINED;
3066         uint64_t norm = ZFS_PROP_UNDEFINED;
3067         uint64_t u8 = ZFS_PROP_UNDEFINED;
3068
3069         ASSERT(zplprops != NULL);
3070
3071         /*
3072          * Pull out creator prop choices, if any.
3073          */
3074         if (createprops) {
3075                 (void) nvlist_lookup_uint64(createprops,
3076                     zfs_prop_to_name(ZFS_PROP_VERSION), &zplver);
3077                 (void) nvlist_lookup_uint64(createprops,
3078                     zfs_prop_to_name(ZFS_PROP_NORMALIZE), &norm);
3079                 (void) nvlist_remove_all(createprops,
3080                     zfs_prop_to_name(ZFS_PROP_NORMALIZE));
3081                 (void) nvlist_lookup_uint64(createprops,
3082                     zfs_prop_to_name(ZFS_PROP_UTF8ONLY), &u8);
3083                 (void) nvlist_remove_all(createprops,
3084                     zfs_prop_to_name(ZFS_PROP_UTF8ONLY));
3085                 (void) nvlist_lookup_uint64(createprops,
3086                     zfs_prop_to_name(ZFS_PROP_CASE), &sense);
3087                 (void) nvlist_remove_all(createprops,
3088                     zfs_prop_to_name(ZFS_PROP_CASE));
3089         }
3090
3091         /*
3092          * If the zpl version requested is whacky or the file system
3093          * or pool is version is too "young" to support normalization
3094          * and the creator tried to set a value for one of the props,
3095          * error out.
3096          */
3097         if ((zplver < ZPL_VERSION_INITIAL || zplver > ZPL_VERSION) ||
3098             (zplver >= ZPL_VERSION_FUID && !fuids_ok) ||
3099             (zplver >= ZPL_VERSION_SA && !sa_ok) ||
3100             (zplver < ZPL_VERSION_NORMALIZATION &&
3101             (norm != ZFS_PROP_UNDEFINED || u8 != ZFS_PROP_UNDEFINED ||
3102             sense != ZFS_PROP_UNDEFINED)))
3103                 return (SET_ERROR(ENOTSUP));
3104
3105         /*
3106          * Put the version in the zplprops
3107          */
3108         VERIFY(nvlist_add_uint64(zplprops,
3109             zfs_prop_to_name(ZFS_PROP_VERSION), zplver) == 0);
3110
3111         if (norm == ZFS_PROP_UNDEFINED)
3112                 VERIFY(zfs_get_zplprop(os, ZFS_PROP_NORMALIZE, &norm) == 0);
3113         VERIFY(nvlist_add_uint64(zplprops,
3114             zfs_prop_to_name(ZFS_PROP_NORMALIZE), norm) == 0);
3115
3116         /*
3117          * If we're normalizing, names must always be valid UTF-8 strings.
3118          */
3119         if (norm)
3120                 u8 = 1;
3121         if (u8 == ZFS_PROP_UNDEFINED)
3122                 VERIFY(zfs_get_zplprop(os, ZFS_PROP_UTF8ONLY, &u8) == 0);
3123         VERIFY(nvlist_add_uint64(zplprops,
3124             zfs_prop_to_name(ZFS_PROP_UTF8ONLY), u8) == 0);
3125
3126         if (sense == ZFS_PROP_UNDEFINED)
3127                 VERIFY(zfs_get_zplprop(os, ZFS_PROP_CASE, &sense) == 0);
3128         VERIFY(nvlist_add_uint64(zplprops,
3129             zfs_prop_to_name(ZFS_PROP_CASE), sense) == 0);
3130
3131         if (is_ci)
3132                 *is_ci = (sense == ZFS_CASE_INSENSITIVE);
3133
3134         return (0);
3135 }
3136
3137 static int
3138 zfs_fill_zplprops(const char *dataset, nvlist_t *createprops,
3139     nvlist_t *zplprops, boolean_t *is_ci)
3140 {
3141         boolean_t fuids_ok, sa_ok;
3142         uint64_t zplver = ZPL_VERSION;
3143         objset_t *os = NULL;
3144         char parentname[MAXNAMELEN];
3145         char *cp;
3146         spa_t *spa;
3147         uint64_t spa_vers;
3148         int error;
3149
3150         (void) strlcpy(parentname, dataset, sizeof (parentname));
3151         cp = strrchr(parentname, '/');
3152         ASSERT(cp != NULL);
3153         cp[0] = '\0';
3154
3155         if ((error = spa_open(dataset, &spa, FTAG)) != 0)
3156                 return (error);
3157
3158         spa_vers = spa_version(spa);
3159         spa_close(spa, FTAG);
3160
3161         zplver = zfs_zpl_version_map(spa_vers);
3162         fuids_ok = (zplver >= ZPL_VERSION_FUID);
3163         sa_ok = (zplver >= ZPL_VERSION_SA);
3164
3165         /*
3166          * Open parent object set so we can inherit zplprop values.
3167          */
3168         if ((error = dmu_objset_hold(parentname, FTAG, &os)) != 0)
3169                 return (error);
3170
3171         error = zfs_fill_zplprops_impl(os, zplver, fuids_ok, sa_ok, createprops,
3172             zplprops, is_ci);
3173         dmu_objset_rele(os, FTAG);
3174         return (error);
3175 }
3176
3177 static int
3178 zfs_fill_zplprops_root(uint64_t spa_vers, nvlist_t *createprops,
3179     nvlist_t *zplprops, boolean_t *is_ci)
3180 {
3181         boolean_t fuids_ok;
3182         boolean_t sa_ok;
3183         uint64_t zplver = ZPL_VERSION;
3184         int error;
3185
3186         zplver = zfs_zpl_version_map(spa_vers);
3187         fuids_ok = (zplver >= ZPL_VERSION_FUID);
3188         sa_ok = (zplver >= ZPL_VERSION_SA);
3189
3190         error = zfs_fill_zplprops_impl(NULL, zplver, fuids_ok, sa_ok,
3191             createprops, zplprops, is_ci);
3192         return (error);
3193 }
3194
3195 /*
3196  * innvl: {
3197  *     "type" -> dmu_objset_type_t (int32)
3198  *     (optional) "props" -> { prop -> value }
3199  * }
3200  *
3201  * outnvl: propname -> error code (int32)
3202  */
3203 static int
3204 zfs_ioc_create(const char *fsname, nvlist_t *innvl, nvlist_t *outnvl)
3205 {
3206         int error = 0;
3207         zfs_creat_t zct = { 0 };
3208         nvlist_t *nvprops = NULL;
3209         void (*cbfunc)(objset_t *os, void *arg, cred_t *cr, dmu_tx_t *tx);
3210         int32_t type32;
3211         dmu_objset_type_t type;
3212         boolean_t is_insensitive = B_FALSE;
3213
3214         if (nvlist_lookup_int32(innvl, "type", &type32) != 0)
3215                 return (SET_ERROR(EINVAL));
3216         type = type32;
3217         (void) nvlist_lookup_nvlist(innvl, "props", &nvprops);
3218
3219         switch (type) {
3220         case DMU_OST_ZFS:
3221                 cbfunc = zfs_create_cb;
3222                 break;
3223
3224         case DMU_OST_ZVOL:
3225                 cbfunc = zvol_create_cb;
3226                 break;
3227
3228         default:
3229                 cbfunc = NULL;
3230                 break;
3231         }
3232         if (strchr(fsname, '@') ||
3233             strchr(fsname, '%'))
3234                 return (SET_ERROR(EINVAL));
3235
3236         zct.zct_props = nvprops;
3237
3238         if (cbfunc == NULL)
3239                 return (SET_ERROR(EINVAL));
3240
3241         if (type == DMU_OST_ZVOL) {
3242                 uint64_t volsize, volblocksize;
3243
3244                 if (nvprops == NULL)
3245                         return (SET_ERROR(EINVAL));
3246                 if (nvlist_lookup_uint64(nvprops,
3247                     zfs_prop_to_name(ZFS_PROP_VOLSIZE), &volsize) != 0)
3248                         return (SET_ERROR(EINVAL));
3249
3250                 if ((error = nvlist_lookup_uint64(nvprops,
3251                     zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE),
3252                     &volblocksize)) != 0 && error != ENOENT)
3253                         return (SET_ERROR(EINVAL));
3254
3255                 if (error != 0)
3256                         volblocksize = zfs_prop_default_numeric(
3257                             ZFS_PROP_VOLBLOCKSIZE);
3258
3259                 if ((error = zvol_check_volblocksize(
3260                     volblocksize)) != 0 ||
3261                     (error = zvol_check_volsize(volsize,
3262                     volblocksize)) != 0)
3263                         return (error);
3264         } else if (type == DMU_OST_ZFS) {
3265                 int error;
3266
3267                 /*
3268                  * We have to have normalization and
3269                  * case-folding flags correct when we do the
3270                  * file system creation, so go figure them out
3271                  * now.
3272                  */
3273                 VERIFY(nvlist_alloc(&zct.zct_zplprops,
3274                     NV_UNIQUE_NAME, KM_SLEEP) == 0);
3275                 error = zfs_fill_zplprops(fsname, nvprops,
3276                     zct.zct_zplprops, &is_insensitive);
3277                 if (error != 0) {
3278                         nvlist_free(zct.zct_zplprops);
3279                         return (error);
3280                 }
3281         }
3282
3283         error = dmu_objset_create(fsname, type,
3284             is_insensitive ? DS_FLAG_CI_DATASET : 0, cbfunc, &zct);
3285         nvlist_free(zct.zct_zplprops);
3286
3287         /*
3288          * It would be nice to do this atomically.
3289          */
3290         if (error == 0) {
3291                 error = zfs_set_prop_nvlist(fsname, ZPROP_SRC_LOCAL,
3292                     nvprops, outnvl);
3293                 if (error != 0)
3294                         (void) dsl_destroy_head(fsname);
3295         }
3296 #ifdef __FreeBSD__
3297         if (error == 0 && type == DMU_OST_ZVOL)
3298                 zvol_create_minors(fsname);
3299 #endif
3300         return (error);
3301 }
3302
3303 /*
3304  * innvl: {
3305  *     "origin" -> name of origin snapshot
3306  *     (optional) "props" -> { prop -> value }
3307  * }
3308  *
3309  * outnvl: propname -> error code (int32)
3310  */
3311 static int
3312 zfs_ioc_clone(const char *fsname, nvlist_t *innvl, nvlist_t *outnvl)
3313 {
3314         int error = 0;
3315         nvlist_t *nvprops = NULL;
3316         char *origin_name;
3317
3318         if (nvlist_lookup_string(innvl, "origin", &origin_name) != 0)
3319                 return (SET_ERROR(EINVAL));
3320         (void) nvlist_lookup_nvlist(innvl, "props", &nvprops);
3321
3322         if (strchr(fsname, '@') ||
3323             strchr(fsname, '%'))
3324                 return (SET_ERROR(EINVAL));
3325
3326         if (dataset_namecheck(origin_name, NULL, NULL) != 0)
3327                 return (SET_ERROR(EINVAL));
3328         error = dmu_objset_clone(fsname, origin_name);
3329         if (error != 0)
3330                 return (error);
3331
3332         /*
3333          * It would be nice to do this atomically.
3334          */
3335         if (error == 0) {
3336                 error = zfs_set_prop_nvlist(fsname, ZPROP_SRC_LOCAL,
3337                     nvprops, outnvl);
3338                 if (error != 0)
3339                         (void) dsl_destroy_head(fsname);
3340         }
3341 #ifdef __FreeBSD__
3342         if (error == 0)
3343                 zvol_create_minors(fsname);
3344 #endif
3345         return (error);
3346 }
3347
3348 /*
3349  * innvl: {
3350  *     "snaps" -> { snapshot1, snapshot2 }
3351  *     (optional) "props" -> { prop -> value (string) }
3352  * }
3353  *
3354  * outnvl: snapshot -> error code (int32)
3355  */
3356 static int
3357 zfs_ioc_snapshot(const char *poolname, nvlist_t *innvl, nvlist_t *outnvl)
3358 {
3359         nvlist_t *snaps;
3360         nvlist_t *props = NULL;
3361         int error, poollen;
3362         nvpair_t *pair;
3363
3364         (void) nvlist_lookup_nvlist(innvl, "props", &props);
3365         if ((error = zfs_check_userprops(poolname, props)) != 0)
3366                 return (error);
3367
3368         if (!nvlist_empty(props) &&
3369             zfs_earlier_version(poolname, SPA_VERSION_SNAP_PROPS))
3370                 return (SET_ERROR(ENOTSUP));
3371
3372         if (nvlist_lookup_nvlist(innvl, "snaps", &snaps) != 0)
3373                 return (SET_ERROR(EINVAL));
3374         poollen = strlen(poolname);
3375         for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL;
3376             pair = nvlist_next_nvpair(snaps, pair)) {
3377                 const char *name = nvpair_name(pair);
3378                 const char *cp = strchr(name, '@');
3379
3380                 /*
3381                  * The snap name must contain an @, and the part after it must
3382                  * contain only valid characters.
3383                  */
3384                 if (cp == NULL ||
3385                     zfs_component_namecheck(cp + 1, NULL, NULL) != 0)
3386                         return (SET_ERROR(EINVAL));
3387
3388                 /*
3389                  * The snap must be in the specified pool.
3390                  */
3391                 if (strncmp(name, poolname, poollen) != 0 ||
3392                     (name[poollen] != '/' && name[poollen] != '@'))
3393                         return (SET_ERROR(EXDEV));
3394
3395                 /* This must be the only snap of this fs. */
3396                 for (nvpair_t *pair2 = nvlist_next_nvpair(snaps, pair);
3397                     pair2 != NULL; pair2 = nvlist_next_nvpair(snaps, pair2)) {
3398                         if (strncmp(name, nvpair_name(pair2), cp - name + 1)
3399                             == 0) {
3400                                 return (SET_ERROR(EXDEV));
3401                         }
3402                 }
3403         }
3404
3405         error = dsl_dataset_snapshot(snaps, props, outnvl);
3406         return (error);
3407 }
3408
3409 /*
3410  * innvl: "message" -> string
3411  */
3412 /* ARGSUSED */
3413 static int
3414 zfs_ioc_log_history(const char *unused, nvlist_t *innvl, nvlist_t *outnvl)
3415 {
3416         char *message;
3417         spa_t *spa;
3418         int error;
3419         char *poolname;
3420
3421         /*
3422          * The poolname in the ioctl is not set, we get it from the TSD,
3423          * which was set at the end of the last successful ioctl that allows
3424          * logging.  The secpolicy func already checked that it is set.
3425          * Only one log ioctl is allowed after each successful ioctl, so
3426          * we clear the TSD here.
3427          */
3428         poolname = tsd_get(zfs_allow_log_key);
3429         (void) tsd_set(zfs_allow_log_key, NULL);
3430         error = spa_open(poolname, &spa, FTAG);
3431         strfree(poolname);
3432         if (error != 0)
3433                 return (error);
3434
3435         if (nvlist_lookup_string(innvl, "message", &message) != 0)  {
3436                 spa_close(spa, FTAG);
3437                 return (SET_ERROR(EINVAL));
3438         }
3439
3440         if (spa_version(spa) < SPA_VERSION_ZPOOL_HISTORY) {
3441                 spa_close(spa, FTAG);
3442                 return (SET_ERROR(ENOTSUP));
3443         }
3444
3445         error = spa_history_log(spa, message);
3446         spa_close(spa, FTAG);
3447         return (error);
3448 }
3449
3450 /*
3451  * The dp_config_rwlock must not be held when calling this, because the
3452  * unmount may need to write out data.
3453  *
3454  * This function is best-effort.  Callers must deal gracefully if it
3455  * remains mounted (or is remounted after this call).
3456  *
3457  * Returns 0 if the argument is not a snapshot, or it is not currently a
3458  * filesystem, or we were able to unmount it.  Returns error code otherwise.
3459  */
3460 int
3461 zfs_unmount_snap(const char *snapname)
3462 {
3463         vfs_t *vfsp;
3464         zfsvfs_t *zfsvfs;
3465         int err;
3466
3467         if (strchr(snapname, '@') == NULL)
3468                 return (0);
3469
3470         vfsp = zfs_get_vfs(snapname);
3471         if (vfsp == NULL)
3472                 return (0);
3473
3474         zfsvfs = vfsp->vfs_data;
3475         ASSERT(!dsl_pool_config_held(dmu_objset_pool(zfsvfs->z_os)));
3476
3477         err = vn_vfswlock(vfsp->vfs_vnodecovered);
3478         VFS_RELE(vfsp);
3479         if (err != 0)
3480                 return (SET_ERROR(err));
3481
3482         /*
3483          * Always force the unmount for snapshots.
3484          */
3485
3486 #ifdef illumos
3487         (void) dounmount(vfsp, MS_FORCE, kcred);
3488 #else
3489         vfs_ref(vfsp);
3490         (void) dounmount(vfsp, MS_FORCE, curthread);
3491 #endif
3492         return (0);
3493 }
3494
3495 /* ARGSUSED */
3496 static int
3497 zfs_unmount_snap_cb(const char *snapname, void *arg)
3498 {
3499         return (zfs_unmount_snap(snapname));
3500 }
3501
3502 /*
3503  * When a clone is destroyed, its origin may also need to be destroyed,
3504  * in which case it must be unmounted.  This routine will do that unmount
3505  * if necessary.
3506  */
3507 void
3508 zfs_destroy_unmount_origin(const char *fsname)
3509 {
3510         int error;
3511         objset_t *os;
3512         dsl_dataset_t *ds;
3513
3514         error = dmu_objset_hold(fsname, FTAG, &os);
3515         if (error != 0)
3516                 return;
3517         ds = dmu_objset_ds(os);
3518         if (dsl_dir_is_clone(ds->ds_dir) && DS_IS_DEFER_DESTROY(ds->ds_prev)) {
3519                 char originname[MAXNAMELEN];
3520                 dsl_dataset_name(ds->ds_prev, originname);
3521                 dmu_objset_rele(os, FTAG);
3522                 (void) zfs_unmount_snap(originname);
3523         } else {
3524                 dmu_objset_rele(os, FTAG);
3525         }
3526 }
3527
3528 /*
3529  * innvl: {
3530  *     "snaps" -> { snapshot1, snapshot2 }
3531  *     (optional boolean) "defer"
3532  * }
3533  *
3534  * outnvl: snapshot -> error code (int32)
3535  *
3536  */
3537 /* ARGSUSED */
3538 static int
3539 zfs_ioc_destroy_snaps(const char *poolname, nvlist_t *innvl, nvlist_t *outnvl)
3540 {
3541         int error, poollen;
3542         nvlist_t *snaps;
3543         nvpair_t *pair;
3544         boolean_t defer;
3545
3546         if (nvlist_lookup_nvlist(innvl, "snaps", &snaps) != 0)
3547                 return (SET_ERROR(EINVAL));
3548         defer = nvlist_exists(innvl, "defer");
3549
3550         poollen = strlen(poolname);
3551         for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL;
3552             pair = nvlist_next_nvpair(snaps, pair)) {
3553                 const char *name = nvpair_name(pair);
3554
3555                 /*
3556                  * The snap must be in the specified pool to prevent the
3557                  * invalid removal of zvol minors below.
3558                  */
3559                 if (strncmp(name, poolname, poollen) != 0 ||
3560                     (name[poollen] != '/' && name[poollen] != '@'))
3561                         return (SET_ERROR(EXDEV));
3562
3563                 error = zfs_unmount_snap(name);
3564                 if (error != 0)
3565                         return (error);
3566 #if defined(__FreeBSD__)
3567                 zvol_remove_minors(name);
3568 #endif
3569         }
3570
3571         return (dsl_destroy_snapshots_nvl(snaps, defer, outnvl));
3572 }
3573
3574 /*
3575  * Create bookmarks.  Bookmark names are of the form <fs>#<bmark>.
3576  * All bookmarks must be in the same pool.
3577  *
3578  * innvl: {
3579  *     bookmark1 -> snapshot1, bookmark2 -> snapshot2
3580  * }
3581  *
3582  * outnvl: bookmark -> error code (int32)
3583  *
3584  */
3585 /* ARGSUSED */
3586 static int
3587 zfs_ioc_bookmark(const char *poolname, nvlist_t *innvl, nvlist_t *outnvl)
3588 {
3589         for (nvpair_t *pair = nvlist_next_nvpair(innvl, NULL);
3590             pair != NULL; pair = nvlist_next_nvpair(innvl, pair)) {
3591                 char *snap_name;
3592
3593                 /*
3594                  * Verify the snapshot argument.
3595                  */
3596                 if (nvpair_value_string(pair, &snap_name) != 0)
3597                         return (SET_ERROR(EINVAL));
3598
3599
3600                 /* Verify that the keys (bookmarks) are unique */
3601                 for (nvpair_t *pair2 = nvlist_next_nvpair(innvl, pair);
3602                     pair2 != NULL; pair2 = nvlist_next_nvpair(innvl, pair2)) {
3603                         if (strcmp(nvpair_name(pair), nvpair_name(pair2)) == 0)
3604                                 return (SET_ERROR(EINVAL));
3605                 }
3606         }
3607
3608         return (dsl_bookmark_create(innvl, outnvl));
3609 }
3610
3611 /*
3612  * innvl: {
3613  *     property 1, property 2, ...
3614  * }
3615  *
3616  * outnvl: {
3617  *     bookmark name 1 -> { property 1, property 2, ... },
3618  *     bookmark name 2 -> { property 1, property 2, ... }
3619  * }
3620  *
3621  */
3622 static int
3623 zfs_ioc_get_bookmarks(const char *fsname, nvlist_t *innvl, nvlist_t *outnvl)
3624 {
3625         return (dsl_get_bookmarks(fsname, innvl, outnvl));
3626 }
3627
3628 /*
3629  * innvl: {
3630  *     bookmark name 1, bookmark name 2
3631  * }
3632  *
3633  * outnvl: bookmark -> error code (int32)
3634  *
3635  */
3636 static int
3637 zfs_ioc_destroy_bookmarks(const char *poolname, nvlist_t *innvl,
3638     nvlist_t *outnvl)
3639 {
3640         int error, poollen;
3641
3642         poollen = strlen(poolname);
3643         for (nvpair_t *pair = nvlist_next_nvpair(innvl, NULL);
3644             pair != NULL; pair = nvlist_next_nvpair(innvl, pair)) {
3645                 const char *name = nvpair_name(pair);
3646                 const char *cp = strchr(name, '#');
3647
3648                 /*
3649                  * The bookmark name must contain an #, and the part after it
3650                  * must contain only valid characters.
3651                  */
3652                 if (cp == NULL ||
3653                     zfs_component_namecheck(cp + 1, NULL, NULL) != 0)
3654                         return (SET_ERROR(EINVAL));
3655
3656                 /*
3657                  * The bookmark must be in the specified pool.
3658                  */
3659                 if (strncmp(name, poolname, poollen) != 0 ||
3660                     (name[poollen] != '/' && name[poollen] != '#'))
3661                         return (SET_ERROR(EXDEV));
3662         }
3663
3664         error = dsl_bookmark_destroy(innvl, outnvl);
3665         return (error);
3666 }
3667
3668 /*
3669  * inputs:
3670  * zc_name              name of dataset to destroy
3671  * zc_objset_type       type of objset
3672  * zc_defer_destroy     mark for deferred destroy
3673  *
3674  * outputs:             none
3675  */
3676 static int
3677 zfs_ioc_destroy(zfs_cmd_t *zc)
3678 {
3679         int err;
3680
3681         if (zc->zc_objset_type == DMU_OST_ZFS) {
3682                 err = zfs_unmount_snap(zc->zc_name);
3683                 if (err != 0)
3684                         return (err);
3685         }
3686
3687         if (strchr(zc->zc_name, '@'))
3688                 err = dsl_destroy_snapshot(zc->zc_name, zc->zc_defer_destroy);
3689         else
3690                 err = dsl_destroy_head(zc->zc_name);
3691         if (zc->zc_objset_type == DMU_OST_ZVOL && err == 0)
3692 #ifdef __FreeBSD__
3693                 zvol_remove_minors(zc->zc_name);
3694 #else
3695                 (void) zvol_remove_minor(zc->zc_name);
3696 #endif
3697         return (err);
3698 }
3699
3700 /*
3701  * fsname is name of dataset to rollback (to most recent snapshot)
3702  *
3703  * innvl is not used.
3704  *
3705  * outnvl: "target" -> name of most recent snapshot
3706  * }
3707  */
3708 /* ARGSUSED */
3709 static int
3710 zfs_ioc_rollback(const char *fsname, nvlist_t *args, nvlist_t *outnvl)
3711 {
3712         zfsvfs_t *zfsvfs;
3713         int error;
3714
3715         if (getzfsvfs(fsname, &zfsvfs) == 0) {
3716                 error = zfs_suspend_fs(zfsvfs);
3717                 if (error == 0) {
3718                         int resume_err;
3719
3720                         error = dsl_dataset_rollback(fsname, zfsvfs, outnvl);
3721                         resume_err = zfs_resume_fs(zfsvfs, fsname);
3722                         error = error ? error : resume_err;
3723                 }
3724                 VFS_RELE(zfsvfs->z_vfs);
3725         } else {
3726                 error = dsl_dataset_rollback(fsname, NULL, outnvl);
3727         }
3728         return (error);
3729 }
3730
3731 static int
3732 recursive_unmount(const char *fsname, void *arg)
3733 {
3734         const char *snapname = arg;
3735         char fullname[MAXNAMELEN];
3736
3737         (void) snprintf(fullname, sizeof (fullname), "%s@%s", fsname, snapname);
3738         return (zfs_unmount_snap(fullname));
3739 }
3740
3741 /*
3742  * inputs:
3743  * zc_name      old name of dataset
3744  * zc_value     new name of dataset
3745  * zc_cookie    recursive flag (only valid for snapshots)
3746  *
3747  * outputs:     none
3748  */
3749 static int
3750 zfs_ioc_rename(zfs_cmd_t *zc)
3751 {
3752         boolean_t recursive = zc->zc_cookie & 1;
3753         char *at;
3754         boolean_t allow_mounted = B_TRUE;
3755
3756 #ifdef __FreeBSD__
3757         allow_mounted = (zc->zc_cookie & 2) != 0;
3758 #endif
3759
3760         zc->zc_value[sizeof (zc->zc_value) - 1] = '\0';
3761         if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
3762             strchr(zc->zc_value, '%'))
3763                 return (SET_ERROR(EINVAL));
3764
3765         at = strchr(zc->zc_name, '@');
3766         if (at != NULL) {
3767                 /* snaps must be in same fs */
3768                 int error;
3769
3770                 if (strncmp(zc->zc_name, zc->zc_value, at - zc->zc_name + 1))
3771                         return (SET_ERROR(EXDEV));
3772                 *at = '\0';
3773                 if (zc->zc_objset_type == DMU_OST_ZFS && allow_mounted) {
3774                         error = dmu_objset_find(zc->zc_name,
3775                             recursive_unmount, at + 1,
3776                             recursive ? DS_FIND_CHILDREN : 0);
3777                         if (error != 0) {
3778                                 *at = '@';
3779                                 return (error);
3780                         }
3781                 }
3782                 error = dsl_dataset_rename_snapshot(zc->zc_name,
3783                     at + 1, strchr(zc->zc_value, '@') + 1, recursive);
3784                 *at = '@';
3785
3786                 return (error);
3787         } else {
3788 #ifdef illumos
3789                 if (zc->zc_objset_type == DMU_OST_ZVOL)
3790                         (void) zvol_remove_minor(zc->zc_name);
3791 #endif
3792                 return (dsl_dir_rename(zc->zc_name, zc->zc_value));
3793         }
3794 }
3795
3796 static int
3797 zfs_check_settable(const char *dsname, nvpair_t *pair, cred_t *cr)
3798 {
3799         const char *propname = nvpair_name(pair);
3800         boolean_t issnap = (strchr(dsname, '@') != NULL);
3801         zfs_prop_t prop = zfs_name_to_prop(propname);
3802         uint64_t intval;
3803         int err;
3804
3805         if (prop == ZPROP_INVAL) {
3806                 if (zfs_prop_user(propname)) {
3807                         if (err = zfs_secpolicy_write_perms(dsname,
3808                             ZFS_DELEG_PERM_USERPROP, cr))
3809                                 return (err);
3810                         return (0);
3811                 }
3812
3813                 if (!issnap && zfs_prop_userquota(propname)) {
3814                         const char *perm = NULL;
3815                         const char *uq_prefix =
3816                             zfs_userquota_prop_prefixes[ZFS_PROP_USERQUOTA];
3817                         const char *gq_prefix =
3818                             zfs_userquota_prop_prefixes[ZFS_PROP_GROUPQUOTA];
3819
3820                         if (strncmp(propname, uq_prefix,
3821                             strlen(uq_prefix)) == 0) {
3822                                 perm = ZFS_DELEG_PERM_USERQUOTA;
3823                         } else if (strncmp(propname, gq_prefix,
3824                             strlen(gq_prefix)) == 0) {
3825                                 perm = ZFS_DELEG_PERM_GROUPQUOTA;
3826                         } else {
3827                                 /* USERUSED and GROUPUSED are read-only */
3828                                 return (SET_ERROR(EINVAL));
3829                         }
3830
3831                         if (err = zfs_secpolicy_write_perms(dsname, perm, cr))
3832                                 return (err);
3833                         return (0);
3834                 }
3835
3836                 return (SET_ERROR(EINVAL));
3837         }
3838
3839         if (issnap)
3840                 return (SET_ERROR(EINVAL));
3841
3842         if (nvpair_type(pair) == DATA_TYPE_NVLIST) {
3843                 /*
3844                  * dsl_prop_get_all_impl() returns properties in this
3845                  * format.
3846                  */
3847                 nvlist_t *attrs;
3848                 VERIFY(nvpair_value_nvlist(pair, &attrs) == 0);
3849                 VERIFY(nvlist_lookup_nvpair(attrs, ZPROP_VALUE,
3850                     &pair) == 0);
3851         }
3852
3853         /*
3854          * Check that this value is valid for this pool version
3855          */
3856         switch (prop) {
3857         case ZFS_PROP_COMPRESSION:
3858                 /*
3859                  * If the user specified gzip compression, make sure
3860                  * the SPA supports it. We ignore any errors here since
3861                  * we'll catch them later.
3862                  */
3863                 if (nvpair_value_uint64(pair, &intval) == 0) {
3864                         if (intval >= ZIO_COMPRESS_GZIP_1 &&
3865                             intval <= ZIO_COMPRESS_GZIP_9 &&
3866                             zfs_earlier_version(dsname,
3867                             SPA_VERSION_GZIP_COMPRESSION)) {
3868                                 return (SET_ERROR(ENOTSUP));
3869                         }
3870
3871                         if (intval == ZIO_COMPRESS_ZLE &&
3872                             zfs_earlier_version(dsname,
3873                             SPA_VERSION_ZLE_COMPRESSION))
3874                                 return (SET_ERROR(ENOTSUP));
3875
3876                         if (intval == ZIO_COMPRESS_LZ4) {
3877                                 spa_t *spa;
3878
3879                                 if ((err = spa_open(dsname, &spa, FTAG)) != 0)
3880                                         return (err);
3881
3882                                 if (!spa_feature_is_enabled(spa,
3883                                     SPA_FEATURE_LZ4_COMPRESS)) {
3884                                         spa_close(spa, FTAG);
3885                                         return (SET_ERROR(ENOTSUP));
3886                                 }
3887                                 spa_close(spa, FTAG);
3888                         }
3889
3890                         /*
3891                          * If this is a bootable dataset then
3892                          * verify that the compression algorithm
3893                          * is supported for booting. We must return
3894                          * something other than ENOTSUP since it
3895                          * implies a downrev pool version.
3896                          */
3897                         if (zfs_is_bootfs(dsname) &&
3898                             !BOOTFS_COMPRESS_VALID(intval)) {
3899                                 return (SET_ERROR(ERANGE));
3900                         }
3901                 }
3902                 break;
3903
3904         case ZFS_PROP_COPIES:
3905                 if (zfs_earlier_version(dsname, SPA_VERSION_DITTO_BLOCKS))
3906                         return (SET_ERROR(ENOTSUP));
3907                 break;
3908
3909         case ZFS_PROP_RECORDSIZE:
3910                 /* Record sizes above 128k need the feature to be enabled */
3911                 if (nvpair_value_uint64(pair, &intval) == 0 &&
3912                     intval > SPA_OLD_MAXBLOCKSIZE) {
3913                         spa_t *spa;
3914
3915                         /*
3916                          * If this is a bootable dataset then
3917                          * the we don't allow large (>128K) blocks,
3918                          * because GRUB doesn't support them.
3919                          */
3920                         if (zfs_is_bootfs(dsname) &&
3921                             intval > SPA_OLD_MAXBLOCKSIZE) {
3922                                 return (SET_ERROR(ERANGE));
3923                         }
3924
3925                         /*
3926                          * We don't allow setting the property above 1MB,
3927                          * unless the tunable has been changed.
3928                          */
3929                         if (intval > zfs_max_recordsize ||
3930                             intval > SPA_MAXBLOCKSIZE)
3931                                 return (SET_ERROR(ERANGE));
3932
3933                         if ((err = spa_open(dsname, &spa, FTAG)) != 0)
3934                                 return (err);
3935
3936                         if (!spa_feature_is_enabled(spa,
3937                             SPA_FEATURE_LARGE_BLOCKS)) {
3938                                 spa_close(spa, FTAG);
3939                                 return (SET_ERROR(ENOTSUP));
3940                         }
3941                         spa_close(spa, FTAG);
3942                 }
3943                 break;
3944
3945         case ZFS_PROP_SHARESMB:
3946                 if (zpl_earlier_version(dsname, ZPL_VERSION_FUID))
3947                         return (SET_ERROR(ENOTSUP));
3948                 break;
3949
3950         case ZFS_PROP_ACLINHERIT:
3951                 if (nvpair_type(pair) == DATA_TYPE_UINT64 &&
3952                     nvpair_value_uint64(pair, &intval) == 0) {
3953                         if (intval == ZFS_ACL_PASSTHROUGH_X &&
3954                             zfs_earlier_version(dsname,
3955                             SPA_VERSION_PASSTHROUGH_X))
3956                                 return (SET_ERROR(ENOTSUP));
3957                 }
3958                 break;
3959
3960         case ZFS_PROP_CHECKSUM:
3961         case ZFS_PROP_DEDUP:
3962         {
3963                 spa_feature_t feature;
3964                 spa_t *spa;
3965
3966                 /* dedup feature version checks */
3967                 if (prop == ZFS_PROP_DEDUP &&
3968                     zfs_earlier_version(dsname, SPA_VERSION_DEDUP))
3969                         return (SET_ERROR(ENOTSUP));
3970
3971                 if (nvpair_value_uint64(pair, &intval) != 0)
3972                         return (SET_ERROR(EINVAL));
3973
3974                 /* check prop value is enabled in features */
3975                 feature = zio_checksum_to_feature(intval);
3976                 if (feature == SPA_FEATURE_NONE)
3977                         break;
3978
3979                 if ((err = spa_open(dsname, &spa, FTAG)) != 0)
3980                         return (err);
3981                 /*
3982                  * Salted checksums are not supported on root pools.
3983                  */
3984                 if (spa_bootfs(spa) != 0 &&
3985                     intval < ZIO_CHECKSUM_FUNCTIONS &&
3986                     (zio_checksum_table[intval].ci_flags &
3987                     ZCHECKSUM_FLAG_SALTED)) {
3988                         spa_close(spa, FTAG);
3989                         return (SET_ERROR(ERANGE));
3990                 }
3991                 if (!spa_feature_is_enabled(spa, feature)) {
3992                         spa_close(spa, FTAG);
3993                         return (SET_ERROR(ENOTSUP));
3994                 }
3995                 spa_close(spa, FTAG);
3996                 break;
3997         }
3998         }
3999
4000         return (zfs_secpolicy_setprop(dsname, prop, pair, CRED()));
4001 }
4002
4003 /*
4004  * Checks for a race condition to make sure we don't increment a feature flag
4005  * multiple times.
4006  */
4007 static int
4008 zfs_prop_activate_feature_check(void *arg, dmu_tx_t *tx)
4009 {
4010         spa_t *spa = dmu_tx_pool(tx)->dp_spa;
4011         spa_feature_t *featurep = arg;
4012
4013         if (!spa_feature_is_active(spa, *featurep))
4014                 return (0);
4015         else
4016                 return (SET_ERROR(EBUSY));
4017 }
4018
4019 /*
4020  * The callback invoked on feature activation in the sync task caused by
4021  * zfs_prop_activate_feature.
4022  */
4023 static void
4024 zfs_prop_activate_feature_sync(void *arg, dmu_tx_t *tx)
4025 {
4026         spa_t *spa = dmu_tx_pool(tx)->dp_spa;
4027         spa_feature_t *featurep = arg;
4028
4029         spa_feature_incr(spa, *featurep, tx);
4030 }
4031
4032 /*
4033  * Activates a feature on a pool in response to a property setting. This
4034  * creates a new sync task which modifies the pool to reflect the feature
4035  * as being active.
4036  */
4037 static int
4038 zfs_prop_activate_feature(spa_t *spa, spa_feature_t feature)
4039 {
4040         int err;
4041
4042         /* EBUSY here indicates that the feature is already active */
4043         err = dsl_sync_task(spa_name(spa),
4044             zfs_prop_activate_feature_check, zfs_prop_activate_feature_sync,
4045             &feature, 2, ZFS_SPACE_CHECK_RESERVED);
4046
4047         if (err != 0 && err != EBUSY)
4048                 return (err);
4049         else
4050                 return (0);
4051 }
4052
4053 /*
4054  * Removes properties from the given props list that fail permission checks
4055  * needed to clear them and to restore them in case of a receive error. For each
4056  * property, make sure we have both set and inherit permissions.
4057  *
4058  * Returns the first error encountered if any permission checks fail. If the
4059  * caller provides a non-NULL errlist, it also gives the complete list of names
4060  * of all the properties that failed a permission check along with the
4061  * corresponding error numbers. The caller is responsible for freeing the
4062  * returned errlist.
4063  *
4064  * If every property checks out successfully, zero is returned and the list
4065  * pointed at by errlist is NULL.
4066  */
4067 static int
4068 zfs_check_clearable(char *dataset, nvlist_t *props, nvlist_t **errlist)
4069 {
4070         zfs_cmd_t *zc;
4071         nvpair_t *pair, *next_pair;
4072         nvlist_t *errors;
4073         int err, rv = 0;
4074
4075         if (props == NULL)
4076                 return (0);
4077
4078         VERIFY(nvlist_alloc(&errors, NV_UNIQUE_NAME, KM_SLEEP) == 0);
4079
4080         zc = kmem_alloc(sizeof (zfs_cmd_t), KM_SLEEP);
4081         (void) strcpy(zc->zc_name, dataset);
4082         pair = nvlist_next_nvpair(props, NULL);
4083         while (pair != NULL) {
4084                 next_pair = nvlist_next_nvpair(props, pair);
4085
4086                 (void) strcpy(zc->zc_value, nvpair_name(pair));
4087                 if ((err = zfs_check_settable(dataset, pair, CRED())) != 0 ||
4088                     (err = zfs_secpolicy_inherit_prop(zc, NULL, CRED())) != 0) {
4089                         VERIFY(nvlist_remove_nvpair(props, pair) == 0);
4090                         VERIFY(nvlist_add_int32(errors,
4091                             zc->zc_value, err) == 0);
4092                 }
4093                 pair = next_pair;
4094         }
4095         kmem_free(zc, sizeof (zfs_cmd_t));
4096
4097         if ((pair = nvlist_next_nvpair(errors, NULL)) == NULL) {
4098                 nvlist_free(errors);
4099                 errors = NULL;
4100         } else {
4101                 VERIFY(nvpair_value_int32(pair, &rv) == 0);
4102         }
4103
4104         if (errlist == NULL)
4105                 nvlist_free(errors);
4106         else
4107                 *errlist = errors;
4108
4109         return (rv);
4110 }
4111
4112 static boolean_t
4113 propval_equals(nvpair_t *p1, nvpair_t *p2)
4114 {
4115         if (nvpair_type(p1) == DATA_TYPE_NVLIST) {
4116                 /* dsl_prop_get_all_impl() format */
4117                 nvlist_t *attrs;
4118                 VERIFY(nvpair_value_nvlist(p1, &attrs) == 0);
4119                 VERIFY(nvlist_lookup_nvpair(attrs, ZPROP_VALUE,
4120                     &p1) == 0);
4121         }
4122
4123         if (nvpair_type(p2) == DATA_TYPE_NVLIST) {
4124                 nvlist_t *attrs;
4125                 VERIFY(nvpair_value_nvlist(p2, &attrs) == 0);
4126                 VERIFY(nvlist_lookup_nvpair(attrs, ZPROP_VALUE,
4127                     &p2) == 0);
4128         }
4129
4130         if (nvpair_type(p1) != nvpair_type(p2))
4131                 return (B_FALSE);
4132
4133         if (nvpair_type(p1) == DATA_TYPE_STRING) {
4134                 char *valstr1, *valstr2;
4135
4136                 VERIFY(nvpair_value_string(p1, (char **)&valstr1) == 0);
4137                 VERIFY(nvpair_value_string(p2, (char **)&valstr2) == 0);
4138                 return (strcmp(valstr1, valstr2) == 0);
4139         } else {
4140                 uint64_t intval1, intval2;
4141
4142                 VERIFY(nvpair_value_uint64(p1, &intval1) == 0);
4143                 VERIFY(nvpair_value_uint64(p2, &intval2) == 0);
4144                 return (intval1 == intval2);
4145         }
4146 }
4147
4148 /*
4149  * Remove properties from props if they are not going to change (as determined
4150  * by comparison with origprops). Remove them from origprops as well, since we
4151  * do not need to clear or restore properties that won't change.
4152  */
4153 static void
4154 props_reduce(nvlist_t *props, nvlist_t *origprops)
4155 {
4156         nvpair_t *pair, *next_pair;
4157
4158         if (origprops == NULL)
4159                 return; /* all props need to be received */
4160
4161         pair = nvlist_next_nvpair(props, NULL);
4162         while (pair != NULL) {
4163                 const char *propname = nvpair_name(pair);
4164                 nvpair_t *match;
4165
4166                 next_pair = nvlist_next_nvpair(props, pair);
4167
4168                 if ((nvlist_lookup_nvpair(origprops, propname,
4169                     &match) != 0) || !propval_equals(pair, match))
4170                         goto next; /* need to set received value */
4171
4172                 /* don't clear the existing received value */
4173                 (void) nvlist_remove_nvpair(origprops, match);
4174                 /* don't bother receiving the property */
4175                 (void) nvlist_remove_nvpair(props, pair);
4176 next:
4177                 pair = next_pair;
4178         }
4179 }
4180
4181 /*
4182  * Extract properties that cannot be set PRIOR to the receipt of a dataset.
4183  * For example, refquota cannot be set until after the receipt of a dataset,
4184  * because in replication streams, an older/earlier snapshot may exceed the
4185  * refquota.  We want to receive the older/earlier snapshot, but setting
4186  * refquota pre-receipt will set the dsl's ACTUAL quota, which will prevent
4187  * the older/earlier snapshot from being received (with EDQUOT).
4188  *
4189  * The ZFS test "zfs_receive_011_pos" demonstrates such a scenario.
4190  *
4191  * libzfs will need to be judicious handling errors encountered by props
4192  * extracted by this function.
4193  */
4194 static nvlist_t *
4195 extract_delay_props(nvlist_t *props)
4196 {
4197         nvlist_t *delayprops;
4198         nvpair_t *nvp, *tmp;
4199         static const zfs_prop_t delayable[] = { ZFS_PROP_REFQUOTA, 0 };
4200         int i;
4201
4202         VERIFY(nvlist_alloc(&delayprops, NV_UNIQUE_NAME, KM_SLEEP) == 0);
4203
4204         for (nvp = nvlist_next_nvpair(props, NULL); nvp != NULL;
4205             nvp = nvlist_next_nvpair(props, nvp)) {
4206                 /*
4207                  * strcmp() is safe because zfs_prop_to_name() always returns
4208                  * a bounded string.
4209                  */
4210                 for (i = 0; delayable[i] != 0; i++) {
4211                         if (strcmp(zfs_prop_to_name(delayable[i]),
4212                             nvpair_name(nvp)) == 0) {
4213                                 break;
4214                         }
4215                 }
4216                 if (delayable[i] != 0) {
4217                         tmp = nvlist_prev_nvpair(props, nvp);
4218                         VERIFY(nvlist_add_nvpair(delayprops, nvp) == 0);
4219                         VERIFY(nvlist_remove_nvpair(props, nvp) == 0);
4220                         nvp = tmp;
4221                 }
4222         }
4223
4224         if (nvlist_empty(delayprops)) {
4225                 nvlist_free(delayprops);
4226                 delayprops = NULL;
4227         }
4228         return (delayprops);
4229 }
4230
4231 #ifdef  DEBUG
4232 static boolean_t zfs_ioc_recv_inject_err;
4233 #endif
4234
4235 /*
4236  * inputs:
4237  * zc_name              name of containing filesystem
4238  * zc_nvlist_src{_size} nvlist of properties to apply
4239  * zc_value             name of snapshot to create
4240  * zc_string            name of clone origin (if DRR_FLAG_CLONE)
4241  * zc_cookie            file descriptor to recv from
4242  * zc_begin_record      the BEGIN record of the stream (not byteswapped)
4243  * zc_guid              force flag
4244  * zc_cleanup_fd        cleanup-on-exit file descriptor
4245  * zc_action_handle     handle for this guid/ds mapping (or zero on first call)
4246  * zc_resumable         if data is incomplete assume sender will resume
4247  *
4248  * outputs:
4249  * zc_cookie            number of bytes read
4250  * zc_nvlist_dst{_size} error for each unapplied received property
4251  * zc_obj               zprop_errflags_t
4252  * zc_action_handle     handle for this guid/ds mapping
4253  */
4254 static int
4255 zfs_ioc_recv(zfs_cmd_t *zc)
4256 {
4257         file_t *fp;
4258         dmu_recv_cookie_t drc;
4259         boolean_t force = (boolean_t)zc->zc_guid;
4260         int fd;
4261         int error = 0;
4262         int props_error = 0;
4263         nvlist_t *errors;
4264         offset_t off;
4265         nvlist_t *props = NULL; /* sent properties */
4266         nvlist_t *origprops = NULL; /* existing properties */
4267         nvlist_t *delayprops = NULL; /* sent properties applied post-receive */
4268         char *origin = NULL;
4269         char *tosnap;
4270         char tofs[ZFS_MAXNAMELEN];
4271         cap_rights_t rights;
4272         boolean_t first_recvd_props = B_FALSE;
4273
4274         if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
4275             strchr(zc->zc_value, '@') == NULL ||
4276             strchr(zc->zc_value, '%'))
4277                 return (SET_ERROR(EINVAL));
4278
4279         (void) strcpy(tofs, zc->zc_value);
4280         tosnap = strchr(tofs, '@');
4281         *tosnap++ = '\0';
4282
4283         if (zc->zc_nvlist_src != 0 &&
4284             (error = get_nvlist(zc->zc_nvlist_src, zc->zc_nvlist_src_size,
4285             zc->zc_iflags, &props)) != 0)
4286                 return (error);
4287
4288         fd = zc->zc_cookie;
4289 #ifdef illumos
4290         fp = getf(fd);
4291 #else
4292         fget_read(curthread, fd, cap_rights_init(&rights, CAP_PREAD), &fp);
4293 #endif
4294         if (fp == NULL) {
4295                 nvlist_free(props);
4296                 return (SET_ERROR(EBADF));
4297         }
4298
4299         errors = fnvlist_alloc();
4300
4301         if (zc->zc_string[0])
4302                 origin = zc->zc_string;
4303
4304         error = dmu_recv_begin(tofs, tosnap,
4305             &zc->zc_begin_record, force, zc->zc_resumable, origin, &drc);
4306         if (error != 0)
4307                 goto out;
4308
4309         /*
4310          * Set properties before we receive the stream so that they are applied
4311          * to the new data. Note that we must call dmu_recv_stream() if
4312          * dmu_recv_begin() succeeds.
4313          */
4314         if (props != NULL && !drc.drc_newfs) {
4315                 if (spa_version(dsl_dataset_get_spa(drc.drc_ds)) >=
4316                     SPA_VERSION_RECVD_PROPS &&
4317                     !dsl_prop_get_hasrecvd(tofs))
4318                         first_recvd_props = B_TRUE;
4319
4320                 /*
4321                  * If new received properties are supplied, they are to
4322                  * completely replace the existing received properties, so stash
4323                  * away the existing ones.
4324                  */
4325                 if (dsl_prop_get_received(tofs, &origprops) == 0) {
4326                         nvlist_t *errlist = NULL;
4327                         /*
4328                          * Don't bother writing a property if its value won't
4329                          * change (and avoid the unnecessary security checks).
4330                          *
4331                          * The first receive after SPA_VERSION_RECVD_PROPS is a
4332                          * special case where we blow away all local properties
4333                          * regardless.
4334                          */
4335                         if (!first_recvd_props)
4336                                 props_reduce(props, origprops);
4337                         if (zfs_check_clearable(tofs, origprops, &errlist) != 0)
4338                                 (void) nvlist_merge(errors, errlist, 0);
4339                         nvlist_free(errlist);
4340
4341                         if (clear_received_props(tofs, origprops,
4342                             first_recvd_props ? NULL : props) != 0)
4343                                 zc->zc_obj |= ZPROP_ERR_NOCLEAR;
4344                 } else {
4345                         zc->zc_obj |= ZPROP_ERR_NOCLEAR;
4346                 }
4347         }
4348
4349         if (props != NULL) {
4350                 props_error = dsl_prop_set_hasrecvd(tofs);
4351
4352                 if (props_error == 0) {
4353                         delayprops = extract_delay_props(props);
4354                         (void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_RECEIVED,
4355                             props, errors);
4356                 }
4357         }
4358
4359         off = fp->f_offset;
4360         error = dmu_recv_stream(&drc, fp, &off, zc->zc_cleanup_fd,
4361             &zc->zc_action_handle);
4362
4363         if (error == 0) {
4364                 zfsvfs_t *zfsvfs = NULL;
4365
4366                 if (getzfsvfs(tofs, &zfsvfs) == 0) {
4367                         /* online recv */
4368                         int end_err;
4369
4370                         error = zfs_suspend_fs(zfsvfs);
4371                         /*
4372                          * If the suspend fails, then the recv_end will
4373                          * likely also fail, and clean up after itself.
4374                          */
4375                         end_err = dmu_recv_end(&drc, zfsvfs);
4376                         if (error == 0)
4377                                 error = zfs_resume_fs(zfsvfs, tofs);
4378                         error = error ? error : end_err;
4379                         VFS_RELE(zfsvfs->z_vfs);
4380                 } else {
4381                         error = dmu_recv_end(&drc, NULL);
4382                 }
4383
4384                 /* Set delayed properties now, after we're done receiving. */
4385                 if (delayprops != NULL && error == 0) {
4386                         (void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_RECEIVED,
4387                             delayprops, errors);
4388                 }
4389         }
4390
4391         if (delayprops != NULL) {
4392                 /*
4393                  * Merge delayed props back in with initial props, in case
4394                  * we're DEBUG and zfs_ioc_recv_inject_err is set (which means
4395                  * we have to make sure clear_received_props() includes
4396                  * the delayed properties).
4397                  *
4398                  * Since zfs_ioc_recv_inject_err is only in DEBUG kernels,
4399                  * using ASSERT() will be just like a VERIFY.
4400                  */
4401                 ASSERT(nvlist_merge(props, delayprops, 0) == 0);
4402                 nvlist_free(delayprops);
4403         }
4404
4405         /*
4406          * Now that all props, initial and delayed, are set, report the prop
4407          * errors to the caller.
4408          */
4409         if (zc->zc_nvlist_dst_size != 0 &&
4410             (nvlist_smush(errors, zc->zc_nvlist_dst_size) != 0 ||
4411             put_nvlist(zc, errors) != 0)) {
4412                 /*
4413                  * Caller made zc->zc_nvlist_dst less than the minimum expected
4414                  * size or supplied an invalid address.
4415                  */
4416                 props_error = SET_ERROR(EINVAL);
4417         }
4418
4419         zc->zc_cookie = off - fp->f_offset;
4420         if (off >= 0 && off <= MAXOFFSET_T)
4421                 fp->f_offset = off;
4422
4423 #ifdef  DEBUG
4424         if (zfs_ioc_recv_inject_err) {
4425                 zfs_ioc_recv_inject_err = B_FALSE;
4426                 error = 1;
4427         }
4428 #endif
4429
4430 #ifdef __FreeBSD__
4431         if (error == 0)
4432                 zvol_create_minors(tofs);
4433 #endif
4434
4435         /*
4436          * On error, restore the original props.
4437          */
4438         if (error != 0 && props != NULL && !drc.drc_newfs) {
4439                 if (clear_received_props(tofs, props, NULL) != 0) {
4440                         /*
4441                          * We failed to clear the received properties.
4442                          * Since we may have left a $recvd value on the
4443                          * system, we can't clear the $hasrecvd flag.
4444                          */
4445                         zc->zc_obj |= ZPROP_ERR_NORESTORE;
4446                 } else if (first_recvd_props) {
4447                         dsl_prop_unset_hasrecvd(tofs);
4448                 }
4449
4450                 if (origprops == NULL && !drc.drc_newfs) {
4451                         /* We failed to stash the original properties. */
4452                         zc->zc_obj |= ZPROP_ERR_NORESTORE;
4453                 }
4454
4455                 /*
4456                  * dsl_props_set() will not convert RECEIVED to LOCAL on or
4457                  * after SPA_VERSION_RECVD_PROPS, so we need to specify LOCAL
4458                  * explictly if we're restoring local properties cleared in the
4459                  * first new-style receive.
4460                  */
4461                 if (origprops != NULL &&
4462                     zfs_set_prop_nvlist(tofs, (first_recvd_props ?
4463                     ZPROP_SRC_LOCAL : ZPROP_SRC_RECEIVED),
4464                     origprops, NULL) != 0) {
4465                         /*
4466                          * We stashed the original properties but failed to
4467                          * restore them.
4468                          */
4469                         zc->zc_obj |= ZPROP_ERR_NORESTORE;
4470                 }
4471         }
4472 out:
4473         nvlist_free(props);
4474         nvlist_free(origprops);
4475         nvlist_free(errors);
4476         releasef(fd);
4477
4478         if (error == 0)
4479                 error = props_error;
4480
4481         return (error);
4482 }
4483
4484 /*
4485  * inputs:
4486  * zc_name      name of snapshot to send
4487  * zc_cookie    file descriptor to send stream to
4488  * zc_obj       fromorigin flag (mutually exclusive with zc_fromobj)
4489  * zc_sendobj   objsetid of snapshot to send
4490  * zc_fromobj   objsetid of incremental fromsnap (may be zero)
4491  * zc_guid      if set, estimate size of stream only.  zc_cookie is ignored.
4492  *              output size in zc_objset_type.
4493  * zc_flags     lzc_send_flags
4494  *
4495  * outputs:
4496  * zc_objset_type       estimated size, if zc_guid is set
4497  */
4498 static int
4499 zfs_ioc_send(zfs_cmd_t *zc)
4500 {
4501         int error;
4502         offset_t off;
4503         boolean_t estimate = (zc->zc_guid != 0);
4504         boolean_t embedok = (zc->zc_flags & 0x1);
4505         boolean_t large_block_ok = (zc->zc_flags & 0x2);
4506
4507         if (zc->zc_obj != 0) {
4508                 dsl_pool_t *dp;
4509                 dsl_dataset_t *tosnap;
4510
4511                 error = dsl_pool_hold(zc->zc_name, FTAG, &dp);
4512                 if (error != 0)
4513                         return (error);
4514
4515                 error = dsl_dataset_hold_obj(dp, zc->zc_sendobj, FTAG, &tosnap);
4516                 if (error != 0) {
4517                         dsl_pool_rele(dp, FTAG);
4518                         return (error);
4519                 }
4520
4521                 if (dsl_dir_is_clone(tosnap->ds_dir))
4522                         zc->zc_fromobj =
4523                             dsl_dir_phys(tosnap->ds_dir)->dd_origin_obj;
4524                 dsl_dataset_rele(tosnap, FTAG);
4525                 dsl_pool_rele(dp, FTAG);
4526         }
4527
4528         if (estimate) {
4529                 dsl_pool_t *dp;
4530                 dsl_dataset_t *tosnap;
4531                 dsl_dataset_t *fromsnap = NULL;
4532
4533                 error = dsl_pool_hold(zc->zc_name, FTAG, &dp);
4534                 if (error != 0)
4535                         return (error);
4536
4537                 error = dsl_dataset_hold_obj(dp, zc->zc_sendobj, FTAG, &tosnap);
4538                 if (error != 0) {
4539                         dsl_pool_rele(dp, FTAG);
4540                         return (error);
4541                 }
4542
4543                 if (zc->zc_fromobj != 0) {
4544                         error = dsl_dataset_hold_obj(dp, zc->zc_fromobj,
4545                             FTAG, &fromsnap);
4546                         if (error != 0) {
4547                                 dsl_dataset_rele(tosnap, FTAG);
4548                                 dsl_pool_rele(dp, FTAG);
4549                                 return (error);
4550                         }
4551                 }
4552
4553                 error = dmu_send_estimate(tosnap, fromsnap,
4554                     &zc->zc_objset_type);
4555
4556                 if (fromsnap != NULL)
4557                         dsl_dataset_rele(fromsnap, FTAG);
4558                 dsl_dataset_rele(tosnap, FTAG);
4559                 dsl_pool_rele(dp, FTAG);
4560         } else {
4561                 file_t *fp;
4562                 cap_rights_t rights;
4563
4564 #ifdef illumos
4565                 fp = getf(zc->zc_cookie);
4566 #else
4567                 fget_write(curthread, zc->zc_cookie,
4568                     cap_rights_init(&rights, CAP_WRITE), &fp);
4569 #endif
4570                 if (fp == NULL)
4571                         return (SET_ERROR(EBADF));
4572
4573                 off = fp->f_offset;
4574                 error = dmu_send_obj(zc->zc_name, zc->zc_sendobj,
4575                     zc->zc_fromobj, embedok, large_block_ok,
4576 #ifdef illumos
4577                     zc->zc_cookie, fp->f_vnode, &off);
4578 #else
4579                     zc->zc_cookie, fp, &off);
4580 #endif
4581
4582                 if (off >= 0 && off <= MAXOFFSET_T)
4583                         fp->f_offset = off;
4584                 releasef(zc->zc_cookie);
4585         }
4586         return (error);
4587 }
4588
4589 /*
4590  * inputs:
4591  * zc_name      name of snapshot on which to report progress
4592  * zc_cookie    file descriptor of send stream
4593  *
4594  * outputs:
4595  * zc_cookie    number of bytes written in send stream thus far
4596  */
4597 static int
4598 zfs_ioc_send_progress(zfs_cmd_t *zc)
4599 {
4600         dsl_pool_t *dp;
4601         dsl_dataset_t *ds;
4602         dmu_sendarg_t *dsp = NULL;
4603         int error;
4604
4605         error = dsl_pool_hold(zc->zc_name, FTAG, &dp);
4606         if (error != 0)
4607                 return (error);
4608
4609         error = dsl_dataset_hold(dp, zc->zc_name, FTAG, &ds);
4610         if (error != 0) {
4611                 dsl_pool_rele(dp, FTAG);
4612                 return (error);
4613         }
4614
4615         mutex_enter(&ds->ds_sendstream_lock);
4616
4617         /*
4618          * Iterate over all the send streams currently active on this dataset.
4619          * If there's one which matches the specified file descriptor _and_ the
4620          * stream was started by the current process, return the progress of
4621          * that stream.
4622          */
4623         for (dsp = list_head(&ds->ds_sendstreams); dsp != NULL;
4624             dsp = list_next(&ds->ds_sendstreams, dsp)) {
4625                 if (dsp->dsa_outfd == zc->zc_cookie &&
4626                     dsp->dsa_proc == curproc)
4627                         break;
4628         }
4629
4630         if (dsp != NULL)
4631                 zc->zc_cookie = *(dsp->dsa_off);
4632         else
4633                 error = SET_ERROR(ENOENT);
4634
4635         mutex_exit(&ds->ds_sendstream_lock);
4636         dsl_dataset_rele(ds, FTAG);
4637         dsl_pool_rele(dp, FTAG);
4638         return (error);
4639 }
4640
4641 static int
4642 zfs_ioc_inject_fault(zfs_cmd_t *zc)
4643 {
4644         int id, error;
4645
4646         error = zio_inject_fault(zc->zc_name, (int)zc->zc_guid, &id,
4647             &zc->zc_inject_record);
4648
4649         if (error == 0)
4650                 zc->zc_guid = (uint64_t)id;
4651
4652         return (error);
4653 }
4654
4655 static int
4656 zfs_ioc_clear_fault(zfs_cmd_t *zc)
4657 {
4658         return (zio_clear_fault((int)zc->zc_guid));
4659 }
4660
4661 static int
4662 zfs_ioc_inject_list_next(zfs_cmd_t *zc)
4663 {
4664         int id = (int)zc->zc_guid;
4665         int error;
4666
4667         error = zio_inject_list_next(&id, zc->zc_name, sizeof (zc->zc_name),
4668             &zc->zc_inject_record);
4669
4670         zc->zc_guid = id;
4671
4672         return (error);
4673 }
4674
4675 static int
4676 zfs_ioc_error_log(zfs_cmd_t *zc)
4677 {
4678         spa_t *spa;
4679         int error;
4680         size_t count = (size_t)zc->zc_nvlist_dst_size;
4681
4682         if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
4683                 return (error);
4684
4685         error = spa_get_errlog(spa, (void *)(uintptr_t)zc->zc_nvlist_dst,
4686             &count);
4687         if (error == 0)
4688                 zc->zc_nvlist_dst_size = count;
4689         else
4690                 zc->zc_nvlist_dst_size = spa_get_errlog_size(spa);
4691
4692         spa_close(spa, FTAG);
4693
4694         return (error);
4695 }
4696
4697 static int
4698 zfs_ioc_clear(zfs_cmd_t *zc)
4699 {
4700         spa_t *spa;
4701         vdev_t *vd;
4702         int error;
4703
4704         /*
4705          * On zpool clear we also fix up missing slogs
4706          */
4707         mutex_enter(&spa_namespace_lock);
4708         spa = spa_lookup(zc->zc_name);
4709         if (spa == NULL) {
4710                 mutex_exit(&spa_namespace_lock);
4711                 return (SET_ERROR(EIO));
4712         }
4713         if (spa_get_log_state(spa) == SPA_LOG_MISSING) {
4714                 /* we need to let spa_open/spa_load clear the chains */
4715                 spa_set_log_state(spa, SPA_LOG_CLEAR);
4716         }
4717         spa->spa_last_open_failed = 0;
4718         mutex_exit(&spa_namespace_lock);
4719
4720         if (zc->zc_cookie & ZPOOL_NO_REWIND) {
4721                 error = spa_open(zc->zc_name, &spa, FTAG);
4722         } else {
4723                 nvlist_t *policy;
4724                 nvlist_t *config = NULL;
4725
4726                 if (zc->zc_nvlist_src == 0)
4727                         return (SET_ERROR(EINVAL));
4728
4729                 if ((error = get_nvlist(zc->zc_nvlist_src,
4730                     zc->zc_nvlist_src_size, zc->zc_iflags, &policy)) == 0) {
4731                         error = spa_open_rewind(zc->zc_name, &spa, FTAG,
4732                             policy, &config);
4733                         if (config != NULL) {
4734                                 int err;
4735
4736                                 if ((err = put_nvlist(zc, config)) != 0)
4737                                         error = err;
4738                                 nvlist_free(config);
4739                         }
4740                         nvlist_free(policy);
4741                 }
4742         }
4743
4744         if (error != 0)
4745                 return (error);
4746
4747         spa_vdev_state_enter(spa, SCL_NONE);
4748
4749         if (zc->zc_guid == 0) {
4750                 vd = NULL;
4751         } else {
4752                 vd = spa_lookup_by_guid(spa, zc->zc_guid, B_TRUE);
4753                 if (vd == NULL) {
4754                         (void) spa_vdev_state_exit(spa, NULL, ENODEV);
4755                         spa_close(spa, FTAG);
4756                         return (SET_ERROR(ENODEV));
4757                 }
4758         }
4759
4760         vdev_clear(spa, vd);
4761
4762         (void) spa_vdev_state_exit(spa, NULL, 0);
4763
4764         /*
4765          * Resume any suspended I/Os.
4766          */
4767         if (zio_resume(spa) != 0)
4768                 error = SET_ERROR(EIO);
4769
4770         spa_close(spa, FTAG);
4771
4772         return (error);
4773 }
4774
4775 static int
4776 zfs_ioc_pool_reopen(zfs_cmd_t *zc)
4777 {
4778         spa_t *spa;
4779         int error;
4780
4781         error = spa_open(zc->zc_name, &spa, FTAG);
4782         if (error != 0)
4783                 return (error);
4784
4785         spa_vdev_state_enter(spa, SCL_NONE);
4786
4787         /*
4788          * If a resilver is already in progress then set the
4789          * spa_scrub_reopen flag to B_TRUE so that we don't restart
4790          * the scan as a side effect of the reopen. Otherwise, let
4791          * vdev_open() decided if a resilver is required.
4792          */
4793         spa->spa_scrub_reopen = dsl_scan_resilvering(spa->spa_dsl_pool);
4794         vdev_reopen(spa->spa_root_vdev);
4795         spa->spa_scrub_reopen = B_FALSE;
4796
4797         (void) spa_vdev_state_exit(spa, NULL, 0);
4798         spa_close(spa, FTAG);
4799         return (0);
4800 }
4801 /*
4802  * inputs:
4803  * zc_name      name of filesystem
4804  * zc_value     name of origin snapshot
4805  *
4806  * outputs:
4807  * zc_string    name of conflicting snapshot, if there is one
4808  */
4809 static int
4810 zfs_ioc_promote(zfs_cmd_t *zc)
4811 {
4812         char *cp;
4813
4814         /*
4815          * We don't need to unmount *all* the origin fs's snapshots, but
4816          * it's easier.
4817          */
4818         cp = strchr(zc->zc_value, '@');
4819         if (cp)
4820                 *cp = '\0';
4821         (void) dmu_objset_find(zc->zc_value,
4822             zfs_unmount_snap_cb, NULL, DS_FIND_SNAPSHOTS);
4823         return (dsl_dataset_promote(zc->zc_name, zc->zc_string));
4824 }
4825
4826 /*
4827  * Retrieve a single {user|group}{used|quota}@... property.
4828  *
4829  * inputs:
4830  * zc_name      name of filesystem
4831  * zc_objset_type zfs_userquota_prop_t
4832  * zc_value     domain name (eg. "S-1-234-567-89")
4833  * zc_guid      RID/UID/GID
4834  *
4835  * outputs:
4836  * zc_cookie    property value
4837  */
4838 static int
4839 zfs_ioc_userspace_one(zfs_cmd_t *zc)
4840 {
4841         zfsvfs_t *zfsvfs;
4842         int error;
4843
4844         if (zc->zc_objset_type >= ZFS_NUM_USERQUOTA_PROPS)
4845                 return (SET_ERROR(EINVAL));
4846
4847         error = zfsvfs_hold(zc->zc_name, FTAG, &zfsvfs, B_FALSE);
4848         if (error != 0)
4849                 return (error);
4850
4851         error = zfs_userspace_one(zfsvfs,
4852             zc->zc_objset_type, zc->zc_value, zc->zc_guid, &zc->zc_cookie);
4853         zfsvfs_rele(zfsvfs, FTAG);
4854
4855         return (error);
4856 }
4857
4858 /*
4859  * inputs:
4860  * zc_name              name of filesystem
4861  * zc_cookie            zap cursor
4862  * zc_objset_type       zfs_userquota_prop_t
4863  * zc_nvlist_dst[_size] buffer to fill (not really an nvlist)
4864  *
4865  * outputs:
4866  * zc_nvlist_dst[_size] data buffer (array of zfs_useracct_t)
4867  * zc_cookie    zap cursor
4868  */
4869 static int
4870 zfs_ioc_userspace_many(zfs_cmd_t *zc)
4871 {
4872         zfsvfs_t *zfsvfs;
4873         int bufsize = zc->zc_nvlist_dst_size;
4874
4875         if (bufsize <= 0)
4876                 return (SET_ERROR(ENOMEM));
4877
4878         int error = zfsvfs_hold(zc->zc_name, FTAG, &zfsvfs, B_FALSE);
4879         if (error != 0)
4880                 return (error);
4881
4882         void *buf = kmem_alloc(bufsize, KM_SLEEP);
4883
4884         error = zfs_userspace_many(zfsvfs, zc->zc_objset_type, &zc->zc_cookie,
4885             buf, &zc->zc_nvlist_dst_size);
4886
4887         if (error == 0) {
4888                 error = ddi_copyout(buf,
4889                     (void *)(uintptr_t)zc->zc_nvlist_dst,
4890                     zc->zc_nvlist_dst_size, zc->zc_iflags);
4891         }
4892         kmem_free(buf, bufsize);
4893         zfsvfs_rele(zfsvfs, FTAG);
4894
4895         return (error);
4896 }
4897
4898 /*
4899  * inputs:
4900  * zc_name              name of filesystem
4901  *
4902  * outputs:
4903  * none
4904  */
4905 static int
4906 zfs_ioc_userspace_upgrade(zfs_cmd_t *zc)
4907 {
4908         objset_t *os;
4909         int error = 0;
4910         zfsvfs_t *zfsvfs;
4911
4912         if (getzfsvfs(zc->zc_name, &zfsvfs) == 0) {
4913                 if (!dmu_objset_userused_enabled(zfsvfs->z_os)) {
4914                         /*
4915                          * If userused is not enabled, it may be because the
4916                          * objset needs to be closed & reopened (to grow the
4917                          * objset_phys_t).  Suspend/resume the fs will do that.
4918                          */
4919                         error = zfs_suspend_fs(zfsvfs);
4920                         if (error == 0) {
4921                                 dmu_objset_refresh_ownership(zfsvfs->z_os,
4922                                     zfsvfs);
4923                                 error = zfs_resume_fs(zfsvfs, zc->zc_name);
4924                         }
4925                 }
4926                 if (error == 0)
4927                         error = dmu_objset_userspace_upgrade(zfsvfs->z_os);
4928                 VFS_RELE(zfsvfs->z_vfs);
4929         } else {
4930                 /* XXX kind of reading contents without owning */
4931                 error = dmu_objset_hold(zc->zc_name, FTAG, &os);
4932                 if (error != 0)
4933                         return (error);
4934
4935                 error = dmu_objset_userspace_upgrade(os);
4936                 dmu_objset_rele(os, FTAG);
4937         }
4938
4939         return (error);
4940 }
4941
4942 #ifdef illumos
4943 /*
4944  * We don't want to have a hard dependency
4945  * against some special symbols in sharefs
4946  * nfs, and smbsrv.  Determine them if needed when
4947  * the first file system is shared.
4948  * Neither sharefs, nfs or smbsrv are unloadable modules.
4949  */
4950 int (*znfsexport_fs)(void *arg);
4951 int (*zshare_fs)(enum sharefs_sys_op, share_t *, uint32_t);
4952 int (*zsmbexport_fs)(void *arg, boolean_t add_share);
4953
4954 int zfs_nfsshare_inited;
4955 int zfs_smbshare_inited;
4956
4957 ddi_modhandle_t nfs_mod;
4958 ddi_modhandle_t sharefs_mod;
4959 ddi_modhandle_t smbsrv_mod;
4960 #endif  /* illumos */
4961 kmutex_t zfs_share_lock;
4962
4963 #ifdef illumos
4964 static int
4965 zfs_init_sharefs()
4966 {
4967         int error;
4968
4969         ASSERT(MUTEX_HELD(&zfs_share_lock));
4970         /* Both NFS and SMB shares also require sharetab support. */
4971         if (sharefs_mod == NULL && ((sharefs_mod =
4972             ddi_modopen("fs/sharefs",
4973             KRTLD_MODE_FIRST, &error)) == NULL)) {
4974                 return (SET_ERROR(ENOSYS));
4975         }
4976         if (zshare_fs == NULL && ((zshare_fs =
4977             (int (*)(enum sharefs_sys_op, share_t *, uint32_t))
4978             ddi_modsym(sharefs_mod, "sharefs_impl", &error)) == NULL)) {
4979                 return (SET_ERROR(ENOSYS));
4980         }
4981         return (0);
4982 }
4983 #endif  /* illumos */
4984
4985 static int
4986 zfs_ioc_share(zfs_cmd_t *zc)
4987 {
4988 #ifdef illumos
4989         int error;
4990         int opcode;
4991
4992         switch (zc->zc_share.z_sharetype) {
4993         case ZFS_SHARE_NFS:
4994         case ZFS_UNSHARE_NFS:
4995                 if (zfs_nfsshare_inited == 0) {
4996                         mutex_enter(&zfs_share_lock);
4997                         if (nfs_mod == NULL && ((nfs_mod = ddi_modopen("fs/nfs",
4998                             KRTLD_MODE_FIRST, &error)) == NULL)) {
4999                                 mutex_exit(&zfs_share_lock);
5000                                 return (SET_ERROR(ENOSYS));
5001                         }
5002                         if (znfsexport_fs == NULL &&
5003                             ((znfsexport_fs = (int (*)(void *))
5004                             ddi_modsym(nfs_mod,
5005                             "nfs_export", &error)) == NULL)) {
5006                                 mutex_exit(&zfs_share_lock);
5007                                 return (SET_ERROR(ENOSYS));
5008                         }
5009                         error = zfs_init_sharefs();
5010                         if (error != 0) {
5011                                 mutex_exit(&zfs_share_lock);
5012                                 return (SET_ERROR(ENOSYS));
5013                         }
5014                         zfs_nfsshare_inited = 1;
5015                         mutex_exit(&zfs_share_lock);
5016                 }
5017                 break;
5018         case ZFS_SHARE_SMB:
5019         case ZFS_UNSHARE_SMB:
5020                 if (zfs_smbshare_inited == 0) {
5021                         mutex_enter(&zfs_share_lock);
5022                         if (smbsrv_mod == NULL && ((smbsrv_mod =
5023                             ddi_modopen("drv/smbsrv",
5024                             KRTLD_MODE_FIRST, &error)) == NULL)) {
5025                                 mutex_exit(&zfs_share_lock);
5026                                 return (SET_ERROR(ENOSYS));
5027                         }
5028                         if (zsmbexport_fs == NULL && ((zsmbexport_fs =
5029                             (int (*)(void *, boolean_t))ddi_modsym(smbsrv_mod,
5030                             "smb_server_share", &error)) == NULL)) {
5031                                 mutex_exit(&zfs_share_lock);
5032                                 return (SET_ERROR(ENOSYS));
5033                         }
5034                         error = zfs_init_sharefs();
5035                         if (error != 0) {
5036                                 mutex_exit(&zfs_share_lock);
5037                                 return (SET_ERROR(ENOSYS));
5038                         }
5039                         zfs_smbshare_inited = 1;
5040                         mutex_exit(&zfs_share_lock);
5041                 }
5042                 break;
5043         default:
5044                 return (SET_ERROR(EINVAL));
5045         }
5046
5047         switch (zc->zc_share.z_sharetype) {
5048         case ZFS_SHARE_NFS:
5049         case ZFS_UNSHARE_NFS:
5050                 if (error =
5051                     znfsexport_fs((void *)
5052                     (uintptr_t)zc->zc_share.z_exportdata))
5053                         return (error);
5054                 break;
5055         case ZFS_SHARE_SMB:
5056         case ZFS_UNSHARE_SMB:
5057                 if (error = zsmbexport_fs((void *)
5058                     (uintptr_t)zc->zc_share.z_exportdata,
5059                     zc->zc_share.z_sharetype == ZFS_SHARE_SMB ?
5060                     B_TRUE: B_FALSE)) {
5061                         return (error);
5062                 }
5063                 break;
5064         }
5065
5066         opcode = (zc->zc_share.z_sharetype == ZFS_SHARE_NFS ||
5067             zc->zc_share.z_sharetype == ZFS_SHARE_SMB) ?
5068             SHAREFS_ADD : SHAREFS_REMOVE;
5069
5070         /*
5071          * Add or remove share from sharetab
5072          */
5073         error = zshare_fs(opcode,
5074             (void *)(uintptr_t)zc->zc_share.z_sharedata,
5075             zc->zc_share.z_sharemax);
5076
5077         return (error);
5078
5079 #else   /* !illumos */
5080         return (ENOSYS);
5081 #endif  /* illumos */
5082 }
5083
5084 ace_t full_access[] = {
5085         {(uid_t)-1, ACE_ALL_PERMS, ACE_EVERYONE, 0}
5086 };
5087
5088 /*
5089  * inputs:
5090  * zc_name              name of containing filesystem
5091  * zc_obj               object # beyond which we want next in-use object #
5092  *
5093  * outputs:
5094  * zc_obj               next in-use object #
5095  */
5096 static int
5097 zfs_ioc_next_obj(zfs_cmd_t *zc)
5098 {
5099         objset_t *os = NULL;
5100         int error;
5101
5102         error = dmu_objset_hold(zc->zc_name, FTAG, &os);
5103         if (error != 0)
5104                 return (error);
5105
5106         error = dmu_object_next(os, &zc->zc_obj, B_FALSE,
5107             dsl_dataset_phys(os->os_dsl_dataset)->ds_prev_snap_txg);
5108
5109         dmu_objset_rele(os, FTAG);
5110         return (error);
5111 }
5112
5113 /*
5114  * inputs:
5115  * zc_name              name of filesystem
5116  * zc_value             prefix name for snapshot
5117  * zc_cleanup_fd        cleanup-on-exit file descriptor for calling process
5118  *
5119  * outputs:
5120  * zc_value             short name of new snapshot
5121  */
5122 static int
5123 zfs_ioc_tmp_snapshot(zfs_cmd_t *zc)
5124 {
5125         char *snap_name;
5126         char *hold_name;
5127         int error;
5128         minor_t minor;
5129
5130         error = zfs_onexit_fd_hold(zc->zc_cleanup_fd, &minor);
5131         if (error != 0)
5132                 return (error);
5133
5134         snap_name = kmem_asprintf("%s-%016llx", zc->zc_value,
5135             (u_longlong_t)ddi_get_lbolt64());
5136         hold_name = kmem_asprintf("%%%s", zc->zc_value);
5137
5138         error = dsl_dataset_snapshot_tmp(zc->zc_name, snap_name, minor,
5139             hold_name);
5140         if (error == 0)
5141                 (void) strcpy(zc->zc_value, snap_name);
5142         strfree(snap_name);
5143         strfree(hold_name);
5144         zfs_onexit_fd_rele(zc->zc_cleanup_fd);
5145         return (error);
5146 }
5147
5148 /*
5149  * inputs:
5150  * zc_name              name of "to" snapshot
5151  * zc_value             name of "from" snapshot
5152  * zc_cookie            file descriptor to write diff data on
5153  *
5154  * outputs:
5155  * dmu_diff_record_t's to the file descriptor
5156  */
5157 static int
5158 zfs_ioc_diff(zfs_cmd_t *zc)
5159 {
5160         file_t *fp;
5161         cap_rights_t rights;
5162         offset_t off;
5163         int error;
5164
5165 #ifdef illumos
5166         fp = getf(zc->zc_cookie);
5167 #else
5168         fget_write(curthread, zc->zc_cookie,
5169                     cap_rights_init(&rights, CAP_WRITE), &fp);
5170 #endif
5171         if (fp == NULL)
5172                 return (SET_ERROR(EBADF));
5173
5174         off = fp->f_offset;
5175
5176 #ifdef illumos
5177         error = dmu_diff(zc->zc_name, zc->zc_value, fp->f_vnode, &off);
5178 #else
5179         error = dmu_diff(zc->zc_name, zc->zc_value, fp, &off);
5180 #endif
5181
5182         if (off >= 0 && off <= MAXOFFSET_T)
5183                 fp->f_offset = off;
5184         releasef(zc->zc_cookie);
5185
5186         return (error);
5187 }
5188
5189 #ifdef illumos
5190 /*
5191  * Remove all ACL files in shares dir
5192  */
5193 static int
5194 zfs_smb_acl_purge(znode_t *dzp)
5195 {
5196         zap_cursor_t    zc;
5197         zap_attribute_t zap;
5198         zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
5199         int error;
5200
5201         for (zap_cursor_init(&zc, zfsvfs->z_os, dzp->z_id);
5202             (error = zap_cursor_retrieve(&zc, &zap)) == 0;
5203             zap_cursor_advance(&zc)) {
5204                 if ((error = VOP_REMOVE(ZTOV(dzp), zap.za_name, kcred,
5205                     NULL, 0)) != 0)
5206                         break;
5207         }
5208         zap_cursor_fini(&zc);
5209         return (error);
5210 }
5211 #endif  /* illumos */
5212
5213 static int
5214 zfs_ioc_smb_acl(zfs_cmd_t *zc)
5215 {
5216 #ifdef illumos
5217         vnode_t *vp;
5218         znode_t *dzp;
5219         vnode_t *resourcevp = NULL;
5220         znode_t *sharedir;
5221         zfsvfs_t *zfsvfs;
5222         nvlist_t *nvlist;
5223         char *src, *target;
5224         vattr_t vattr;
5225         vsecattr_t vsec;
5226         int error = 0;
5227
5228         if ((error = lookupname(zc->zc_value, UIO_SYSSPACE,
5229             NO_FOLLOW, NULL, &vp)) != 0)
5230                 return (error);
5231
5232         /* Now make sure mntpnt and dataset are ZFS */
5233
5234         if (strcmp(vp->v_vfsp->mnt_stat.f_fstypename, "zfs") != 0 ||
5235             (strcmp((char *)refstr_value(vp->v_vfsp->vfs_resource),
5236             zc->zc_name) != 0)) {
5237                 VN_RELE(vp);
5238                 return (SET_ERROR(EINVAL));
5239         }
5240
5241         dzp = VTOZ(vp);
5242         zfsvfs = dzp->z_zfsvfs;
5243         ZFS_ENTER(zfsvfs);
5244
5245         /*
5246          * Create share dir if its missing.
5247          */
5248         mutex_enter(&zfsvfs->z_lock);
5249         if (zfsvfs->z_shares_dir == 0) {
5250                 dmu_tx_t *tx;
5251
5252                 tx = dmu_tx_create(zfsvfs->z_os);
5253                 dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, TRUE,
5254                     ZFS_SHARES_DIR);
5255                 dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
5256                 error = dmu_tx_assign(tx, TXG_WAIT);
5257                 if (error != 0) {
5258                         dmu_tx_abort(tx);
5259                 } else {
5260                         error = zfs_create_share_dir(zfsvfs, tx);
5261                         dmu_tx_commit(tx);
5262                 }
5263                 if (error != 0) {
5264                         mutex_exit(&zfsvfs->z_lock);
5265                         VN_RELE(vp);
5266                         ZFS_EXIT(zfsvfs);
5267                         return (error);
5268                 }
5269         }
5270         mutex_exit(&zfsvfs->z_lock);
5271
5272         ASSERT(zfsvfs->z_shares_dir);
5273         if ((error = zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &sharedir)) != 0) {
5274                 VN_RELE(vp);
5275                 ZFS_EXIT(zfsvfs);
5276                 return (error);
5277         }
5278
5279         switch (zc->zc_cookie) {
5280         case ZFS_SMB_ACL_ADD:
5281                 vattr.va_mask = AT_MODE|AT_UID|AT_GID|AT_TYPE;
5282                 vattr.va_type = VREG;
5283                 vattr.va_mode = S_IFREG|0777;
5284                 vattr.va_uid = 0;
5285                 vattr.va_gid = 0;
5286
5287                 vsec.vsa_mask = VSA_ACE;
5288                 vsec.vsa_aclentp = &full_access;
5289                 vsec.vsa_aclentsz = sizeof (full_access);
5290                 vsec.vsa_aclcnt = 1;
5291
5292                 error = VOP_CREATE(ZTOV(sharedir), zc->zc_string,
5293                     &vattr, EXCL, 0, &resourcevp, kcred, 0, NULL, &vsec);
5294                 if (resourcevp)
5295                         VN_RELE(resourcevp);
5296                 break;
5297
5298         case ZFS_SMB_ACL_REMOVE:
5299                 error = VOP_REMOVE(ZTOV(sharedir), zc->zc_string, kcred,
5300                     NULL, 0);
5301                 break;
5302
5303         case ZFS_SMB_ACL_RENAME:
5304                 if ((error = get_nvlist(zc->zc_nvlist_src,
5305                     zc->zc_nvlist_src_size, zc->zc_iflags, &nvlist)) != 0) {
5306                         VN_RELE(vp);
5307                         VN_RELE(ZTOV(sharedir));
5308                         ZFS_EXIT(zfsvfs);
5309                         return (error);
5310                 }
5311                 if (nvlist_lookup_string(nvlist, ZFS_SMB_ACL_SRC, &src) ||
5312                     nvlist_lookup_string(nvlist, ZFS_SMB_ACL_TARGET,
5313                     &target)) {
5314                         VN_RELE(vp);
5315                         VN_RELE(ZTOV(sharedir));
5316                         ZFS_EXIT(zfsvfs);
5317                         nvlist_free(nvlist);
5318                         return (error);
5319                 }
5320                 error = VOP_RENAME(ZTOV(sharedir), src, ZTOV(sharedir), target,
5321                     kcred, NULL, 0);
5322                 nvlist_free(nvlist);
5323                 break;
5324
5325         case ZFS_SMB_ACL_PURGE:
5326                 error = zfs_smb_acl_purge(sharedir);
5327                 break;
5328
5329         default:
5330                 error = SET_ERROR(EINVAL);
5331                 break;
5332         }
5333
5334         VN_RELE(vp);
5335         VN_RELE(ZTOV(sharedir));
5336
5337         ZFS_EXIT(zfsvfs);
5338
5339         return (error);
5340 #else   /* !illumos */
5341         return (EOPNOTSUPP);
5342 #endif  /* illumos */
5343 }
5344
5345 /*
5346  * innvl: {
5347  *     "holds" -> { snapname -> holdname (string), ... }
5348  *     (optional) "cleanup_fd" -> fd (int32)
5349  * }
5350  *
5351  * outnvl: {
5352  *     snapname -> error value (int32)
5353  *     ...
5354  * }
5355  */
5356 /* ARGSUSED */
5357 static int
5358 zfs_ioc_hold(const char *pool, nvlist_t *args, nvlist_t *errlist)
5359 {
5360         nvpair_t *pair;
5361         nvlist_t *holds;
5362         int cleanup_fd = -1;
5363         int error;
5364         minor_t minor = 0;
5365
5366         error = nvlist_lookup_nvlist(args, "holds", &holds);
5367         if (error != 0)
5368                 return (SET_ERROR(EINVAL));
5369
5370         /* make sure the user didn't pass us any invalid (empty) tags */
5371         for (pair = nvlist_next_nvpair(holds, NULL); pair != NULL;
5372             pair = nvlist_next_nvpair(holds, pair)) {
5373                 char *htag;
5374
5375                 error = nvpair_value_string(pair, &htag);
5376                 if (error != 0)
5377                         return (SET_ERROR(error));
5378
5379                 if (strlen(htag) == 0)
5380                         return (SET_ERROR(EINVAL));
5381         }
5382
5383         if (nvlist_lookup_int32(args, "cleanup_fd", &cleanup_fd) == 0) {
5384                 error = zfs_onexit_fd_hold(cleanup_fd, &minor);
5385                 if (error != 0)
5386                         return (error);
5387         }
5388
5389         error = dsl_dataset_user_hold(holds, minor, errlist);
5390         if (minor != 0)
5391                 zfs_onexit_fd_rele(cleanup_fd);
5392         return (error);
5393 }
5394
5395 /*
5396  * innvl is not used.
5397  *
5398  * outnvl: {
5399  *    holdname -> time added (uint64 seconds since epoch)
5400  *    ...
5401  * }
5402  */
5403 /* ARGSUSED */
5404 static int
5405 zfs_ioc_get_holds(const char *snapname, nvlist_t *args, nvlist_t *outnvl)
5406 {
5407         return (dsl_dataset_get_holds(snapname, outnvl));
5408 }
5409
5410 /*
5411  * innvl: {
5412  *     snapname -> { holdname, ... }
5413  *     ...
5414  * }
5415  *
5416  * outnvl: {
5417  *     snapname -> error value (int32)
5418  *     ...
5419  * }
5420  */
5421 /* ARGSUSED */
5422 static int
5423 zfs_ioc_release(const char *pool, nvlist_t *holds, nvlist_t *errlist)
5424 {
5425         return (dsl_dataset_user_release(holds, errlist));
5426 }
5427
5428 /*
5429  * inputs:
5430  * zc_name              name of new filesystem or snapshot
5431  * zc_value             full name of old snapshot
5432  *
5433  * outputs:
5434  * zc_cookie            space in bytes
5435  * zc_objset_type       compressed space in bytes
5436  * zc_perm_action       uncompressed space in bytes
5437  */
5438 static int
5439 zfs_ioc_space_written(zfs_cmd_t *zc)
5440 {
5441         int error;
5442         dsl_pool_t *dp;
5443         dsl_dataset_t *new, *old;
5444
5445         error = dsl_pool_hold(zc->zc_name, FTAG, &dp);
5446         if (error != 0)
5447                 return (error);
5448         error = dsl_dataset_hold(dp, zc->zc_name, FTAG, &new);
5449         if (error != 0) {
5450                 dsl_pool_rele(dp, FTAG);
5451                 return (error);
5452         }
5453         error = dsl_dataset_hold(dp, zc->zc_value, FTAG, &old);
5454         if (error != 0) {
5455                 dsl_dataset_rele(new, FTAG);
5456                 dsl_pool_rele(dp, FTAG);
5457                 return (error);
5458         }
5459
5460         error = dsl_dataset_space_written(old, new, &zc->zc_cookie,
5461             &zc->zc_objset_type, &zc->zc_perm_action);
5462         dsl_dataset_rele(old, FTAG);
5463         dsl_dataset_rele(new, FTAG);
5464         dsl_pool_rele(dp, FTAG);
5465         return (error);
5466 }
5467
5468 /*
5469  * innvl: {
5470  *     "firstsnap" -> snapshot name
5471  * }
5472  *
5473  * outnvl: {
5474  *     "used" -> space in bytes
5475  *     "compressed" -> compressed space in bytes
5476  *     "uncompressed" -> uncompressed space in bytes
5477  * }
5478  */
5479 static int
5480 zfs_ioc_space_snaps(const char *lastsnap, nvlist_t *innvl, nvlist_t *outnvl)
5481 {
5482         int error;
5483         dsl_pool_t *dp;
5484         dsl_dataset_t *new, *old;
5485         char *firstsnap;
5486         uint64_t used, comp, uncomp;
5487
5488         if (nvlist_lookup_string(innvl, "firstsnap", &firstsnap) != 0)
5489                 return (SET_ERROR(EINVAL));
5490
5491         error = dsl_pool_hold(lastsnap, FTAG, &dp);
5492         if (error != 0)
5493                 return (error);
5494
5495         error = dsl_dataset_hold(dp, lastsnap, FTAG, &new);
5496         if (error == 0 && !new->ds_is_snapshot) {
5497                 dsl_dataset_rele(new, FTAG);
5498                 error = SET_ERROR(EINVAL);
5499         }
5500         if (error != 0) {
5501                 dsl_pool_rele(dp, FTAG);
5502                 return (error);
5503         }
5504         error = dsl_dataset_hold(dp, firstsnap, FTAG, &old);
5505         if (error == 0 && !old->ds_is_snapshot) {
5506                 dsl_dataset_rele(old, FTAG);
5507                 error = SET_ERROR(EINVAL);
5508         }
5509         if (error != 0) {
5510                 dsl_dataset_rele(new, FTAG);
5511                 dsl_pool_rele(dp, FTAG);
5512                 return (error);
5513         }
5514
5515         error = dsl_dataset_space_wouldfree(old, new, &used, &comp, &uncomp);
5516         dsl_dataset_rele(old, FTAG);
5517         dsl_dataset_rele(new, FTAG);
5518         dsl_pool_rele(dp, FTAG);
5519         fnvlist_add_uint64(outnvl, "used", used);
5520         fnvlist_add_uint64(outnvl, "compressed", comp);
5521         fnvlist_add_uint64(outnvl, "uncompressed", uncomp);
5522         return (error);
5523 }
5524
5525 static int
5526 zfs_ioc_jail(zfs_cmd_t *zc)
5527 {
5528
5529         return (zone_dataset_attach(curthread->td_ucred, zc->zc_name,
5530             (int)zc->zc_jailid));
5531 }
5532
5533 static int
5534 zfs_ioc_unjail(zfs_cmd_t *zc)
5535 {
5536
5537         return (zone_dataset_detach(curthread->td_ucred, zc->zc_name,
5538             (int)zc->zc_jailid));
5539 }
5540
5541 /*
5542  * innvl: {
5543  *     "fd" -> file descriptor to write stream to (int32)
5544  *     (optional) "fromsnap" -> full snap name to send an incremental from
5545  *     (optional) "largeblockok" -> (value ignored)
5546  *         indicates that blocks > 128KB are permitted
5547  *     (optional) "embedok" -> (value ignored)
5548  *         presence indicates DRR_WRITE_EMBEDDED records are permitted
5549  *     (optional) "resume_object" and "resume_offset" -> (uint64)
5550  *         if present, resume send stream from specified object and offset.
5551  * }
5552  *
5553  * outnvl is unused
5554  */
5555 /* ARGSUSED */
5556 static int
5557 zfs_ioc_send_new(const char *snapname, nvlist_t *innvl, nvlist_t *outnvl)
5558 {
5559         cap_rights_t rights;
5560         file_t *fp;
5561         int error;
5562         offset_t off;
5563         char *fromname = NULL;
5564         int fd;
5565         boolean_t largeblockok;
5566         boolean_t embedok;
5567         uint64_t resumeobj = 0;
5568         uint64_t resumeoff = 0;
5569
5570         error = nvlist_lookup_int32(innvl, "fd", &fd);
5571         if (error != 0)
5572                 return (SET_ERROR(EINVAL));
5573
5574         (void) nvlist_lookup_string(innvl, "fromsnap", &fromname);
5575
5576         largeblockok = nvlist_exists(innvl, "largeblockok");
5577         embedok = nvlist_exists(innvl, "embedok");
5578
5579         (void) nvlist_lookup_uint64(innvl, "resume_object", &resumeobj);
5580         (void) nvlist_lookup_uint64(innvl, "resume_offset", &resumeoff);
5581
5582 #ifdef illumos
5583         file_t *fp = getf(fd);
5584 #else
5585         fget_write(curthread, fd, cap_rights_init(&rights, CAP_WRITE), &fp);
5586 #endif
5587         if (fp == NULL)
5588                 return (SET_ERROR(EBADF));
5589
5590         off = fp->f_offset;
5591         error = dmu_send(snapname, fromname, embedok, largeblockok, fd,
5592 #ifdef illumos
5593             resumeobj, resumeoff, fp->f_vnode, &off);
5594 #else
5595             resumeobj, resumeoff, fp, &off);
5596 #endif
5597
5598 #ifdef illumos
5599         if (VOP_SEEK(fp->f_vnode, fp->f_offset, &off, NULL) == 0)
5600                 fp->f_offset = off;
5601 #else
5602         fp->f_offset = off;
5603 #endif
5604
5605         releasef(fd);
5606         return (error);
5607 }
5608
5609 /*
5610  * Determine approximately how large a zfs send stream will be -- the number
5611  * of bytes that will be written to the fd supplied to zfs_ioc_send_new().
5612  *
5613  * innvl: {
5614  *     (optional) "from" -> full snap or bookmark name to send an incremental
5615  *                          from
5616  * }
5617  *
5618  * outnvl: {
5619  *     "space" -> bytes of space (uint64)
5620  * }
5621  */
5622 static int
5623 zfs_ioc_send_space(const char *snapname, nvlist_t *innvl, nvlist_t *outnvl)
5624 {
5625         dsl_pool_t *dp;
5626         dsl_dataset_t *tosnap;
5627         int error;
5628         char *fromname;
5629         uint64_t space;
5630
5631         error = dsl_pool_hold(snapname, FTAG, &dp);
5632         if (error != 0)
5633                 return (error);
5634
5635         error = dsl_dataset_hold(dp, snapname, FTAG, &tosnap);
5636         if (error != 0) {
5637                 dsl_pool_rele(dp, FTAG);
5638                 return (error);
5639         }
5640
5641         error = nvlist_lookup_string(innvl, "from", &fromname);
5642         if (error == 0) {
5643                 if (strchr(fromname, '@') != NULL) {
5644                         /*
5645                          * If from is a snapshot, hold it and use the more
5646                          * efficient dmu_send_estimate to estimate send space
5647                          * size using deadlists.
5648                          */
5649                         dsl_dataset_t *fromsnap;
5650                         error = dsl_dataset_hold(dp, fromname, FTAG, &fromsnap);
5651                         if (error != 0)
5652                                 goto out;
5653                         error = dmu_send_estimate(tosnap, fromsnap, &space);
5654                         dsl_dataset_rele(fromsnap, FTAG);
5655                 } else if (strchr(fromname, '#') != NULL) {
5656                         /*
5657                          * If from is a bookmark, fetch the creation TXG of the
5658                          * snapshot it was created from and use that to find
5659                          * blocks that were born after it.
5660                          */
5661                         zfs_bookmark_phys_t frombm;
5662
5663                         error = dsl_bookmark_lookup(dp, fromname, tosnap,
5664                             &frombm);
5665                         if (error != 0)
5666                                 goto out;
5667                         error = dmu_send_estimate_from_txg(tosnap,
5668                             frombm.zbm_creation_txg, &space);
5669                 } else {
5670                         /*
5671                          * from is not properly formatted as a snapshot or
5672                          * bookmark
5673                          */
5674                         error = SET_ERROR(EINVAL);
5675                         goto out;
5676                 }
5677         } else {
5678                 // If estimating the size of a full send, use dmu_send_estimate
5679                 error = dmu_send_estimate(tosnap, NULL, &space);
5680         }
5681
5682         fnvlist_add_uint64(outnvl, "space", space);
5683
5684 out:
5685         dsl_dataset_rele(tosnap, FTAG);
5686         dsl_pool_rele(dp, FTAG);
5687         return (error);
5688 }
5689
5690 static zfs_ioc_vec_t zfs_ioc_vec[ZFS_IOC_LAST - ZFS_IOC_FIRST];
5691
5692 static void
5693 zfs_ioctl_register_legacy(zfs_ioc_t ioc, zfs_ioc_legacy_func_t *func,
5694     zfs_secpolicy_func_t *secpolicy, zfs_ioc_namecheck_t namecheck,
5695     boolean_t log_history, zfs_ioc_poolcheck_t pool_check)
5696 {
5697         zfs_ioc_vec_t *vec = &zfs_ioc_vec[ioc - ZFS_IOC_FIRST];
5698
5699         ASSERT3U(ioc, >=, ZFS_IOC_FIRST);
5700         ASSERT3U(ioc, <, ZFS_IOC_LAST);
5701         ASSERT3P(vec->zvec_legacy_func, ==, NULL);
5702         ASSERT3P(vec->zvec_func, ==, NULL);
5703
5704         vec->zvec_legacy_func = func;
5705         vec->zvec_secpolicy = secpolicy;
5706         vec->zvec_namecheck = namecheck;
5707         vec->zvec_allow_log = log_history;
5708         vec->zvec_pool_check = pool_check;
5709 }
5710
5711 /*
5712  * See the block comment at the beginning of this file for details on
5713  * each argument to this function.
5714  */
5715 static void
5716 zfs_ioctl_register(const char *name, zfs_ioc_t ioc, zfs_ioc_func_t *func,
5717     zfs_secpolicy_func_t *secpolicy, zfs_ioc_namecheck_t namecheck,
5718     zfs_ioc_poolcheck_t pool_check, boolean_t smush_outnvlist,
5719     boolean_t allow_log)
5720 {
5721         zfs_ioc_vec_t *vec = &zfs_ioc_vec[ioc - ZFS_IOC_FIRST];
5722
5723         ASSERT3U(ioc, >=, ZFS_IOC_FIRST);
5724         ASSERT3U(ioc, <, ZFS_IOC_LAST);
5725         ASSERT3P(vec->zvec_legacy_func, ==, NULL);
5726         ASSERT3P(vec->zvec_func, ==, NULL);
5727
5728         /* if we are logging, the name must be valid */
5729         ASSERT(!allow_log || namecheck != NO_NAME);
5730
5731         vec->zvec_name = name;
5732         vec->zvec_func = func;
5733         vec->zvec_secpolicy = secpolicy;
5734         vec->zvec_namecheck = namecheck;
5735         vec->zvec_pool_check = pool_check;
5736         vec->zvec_smush_outnvlist = smush_outnvlist;
5737         vec->zvec_allow_log = allow_log;
5738 }
5739
5740 static void
5741 zfs_ioctl_register_pool(zfs_ioc_t ioc, zfs_ioc_legacy_func_t *func,
5742     zfs_secpolicy_func_t *secpolicy, boolean_t log_history,
5743     zfs_ioc_poolcheck_t pool_check)
5744 {
5745         zfs_ioctl_register_legacy(ioc, func, secpolicy,
5746             POOL_NAME, log_history, pool_check);
5747 }
5748
5749 static void
5750 zfs_ioctl_register_dataset_nolog(zfs_ioc_t ioc, zfs_ioc_legacy_func_t *func,
5751     zfs_secpolicy_func_t *secpolicy, zfs_ioc_poolcheck_t pool_check)
5752 {
5753         zfs_ioctl_register_legacy(ioc, func, secpolicy,
5754             DATASET_NAME, B_FALSE, pool_check);
5755 }
5756
5757 static void
5758 zfs_ioctl_register_pool_modify(zfs_ioc_t ioc, zfs_ioc_legacy_func_t *func)
5759 {
5760         zfs_ioctl_register_legacy(ioc, func, zfs_secpolicy_config,
5761             POOL_NAME, B_TRUE, POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY);
5762 }
5763
5764 static void
5765 zfs_ioctl_register_pool_meta(zfs_ioc_t ioc, zfs_ioc_legacy_func_t *func,
5766     zfs_secpolicy_func_t *secpolicy)
5767 {
5768         zfs_ioctl_register_legacy(ioc, func, secpolicy,
5769             NO_NAME, B_FALSE, POOL_CHECK_NONE);
5770 }
5771
5772 static void
5773 zfs_ioctl_register_dataset_read_secpolicy(zfs_ioc_t ioc,
5774     zfs_ioc_legacy_func_t *func, zfs_secpolicy_func_t *secpolicy)
5775 {
5776         zfs_ioctl_register_legacy(ioc, func, secpolicy,
5777             DATASET_NAME, B_FALSE, POOL_CHECK_SUSPENDED);
5778 }
5779
5780 static void
5781 zfs_ioctl_register_dataset_read(zfs_ioc_t ioc, zfs_ioc_legacy_func_t *func)
5782 {
5783         zfs_ioctl_register_dataset_read_secpolicy(ioc, func,
5784             zfs_secpolicy_read);
5785 }
5786
5787 static void
5788 zfs_ioctl_register_dataset_modify(zfs_ioc_t ioc, zfs_ioc_legacy_func_t *func,
5789     zfs_secpolicy_func_t *secpolicy)
5790 {
5791         zfs_ioctl_register_legacy(ioc, func, secpolicy,
5792             DATASET_NAME, B_TRUE, POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY);
5793 }
5794
5795 static void
5796 zfs_ioctl_init(void)
5797 {
5798         zfs_ioctl_register("snapshot", ZFS_IOC_SNAPSHOT,
5799             zfs_ioc_snapshot, zfs_secpolicy_snapshot, POOL_NAME,
5800             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE);
5801
5802         zfs_ioctl_register("log_history", ZFS_IOC_LOG_HISTORY,
5803             zfs_ioc_log_history, zfs_secpolicy_log_history, NO_NAME,
5804             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_FALSE, B_FALSE);
5805
5806         zfs_ioctl_register("space_snaps", ZFS_IOC_SPACE_SNAPS,
5807             zfs_ioc_space_snaps, zfs_secpolicy_read, DATASET_NAME,
5808             POOL_CHECK_SUSPENDED, B_FALSE, B_FALSE);
5809
5810         zfs_ioctl_register("send", ZFS_IOC_SEND_NEW,
5811             zfs_ioc_send_new, zfs_secpolicy_send_new, DATASET_NAME,
5812             POOL_CHECK_SUSPENDED, B_FALSE, B_FALSE);
5813
5814         zfs_ioctl_register("send_space", ZFS_IOC_SEND_SPACE,
5815             zfs_ioc_send_space, zfs_secpolicy_read, DATASET_NAME,
5816             POOL_CHECK_SUSPENDED, B_FALSE, B_FALSE);
5817
5818         zfs_ioctl_register("create", ZFS_IOC_CREATE,
5819             zfs_ioc_create, zfs_secpolicy_create_clone, DATASET_NAME,
5820             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE);
5821
5822         zfs_ioctl_register("clone", ZFS_IOC_CLONE,
5823             zfs_ioc_clone, zfs_secpolicy_create_clone, DATASET_NAME,
5824             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE);
5825
5826         zfs_ioctl_register("destroy_snaps", ZFS_IOC_DESTROY_SNAPS,
5827             zfs_ioc_destroy_snaps, zfs_secpolicy_destroy_snaps, POOL_NAME,
5828             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE);
5829
5830         zfs_ioctl_register("hold", ZFS_IOC_HOLD,
5831             zfs_ioc_hold, zfs_secpolicy_hold, POOL_NAME,
5832             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE);
5833         zfs_ioctl_register("release", ZFS_IOC_RELEASE,
5834             zfs_ioc_release, zfs_secpolicy_release, POOL_NAME,
5835             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE);
5836
5837         zfs_ioctl_register("get_holds", ZFS_IOC_GET_HOLDS,
5838             zfs_ioc_get_holds, zfs_secpolicy_read, DATASET_NAME,
5839             POOL_CHECK_SUSPENDED, B_FALSE, B_FALSE);
5840
5841         zfs_ioctl_register("rollback", ZFS_IOC_ROLLBACK,
5842             zfs_ioc_rollback, zfs_secpolicy_rollback, DATASET_NAME,
5843             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_FALSE, B_TRUE);
5844
5845         zfs_ioctl_register("bookmark", ZFS_IOC_BOOKMARK,
5846             zfs_ioc_bookmark, zfs_secpolicy_bookmark, POOL_NAME,
5847             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE);
5848
5849         zfs_ioctl_register("get_bookmarks", ZFS_IOC_GET_BOOKMARKS,
5850             zfs_ioc_get_bookmarks, zfs_secpolicy_read, DATASET_NAME,
5851             POOL_CHECK_SUSPENDED, B_FALSE, B_FALSE);
5852
5853         zfs_ioctl_register("destroy_bookmarks", ZFS_IOC_DESTROY_BOOKMARKS,
5854             zfs_ioc_destroy_bookmarks, zfs_secpolicy_destroy_bookmarks,
5855             POOL_NAME,
5856             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE);
5857
5858         /* IOCTLS that use the legacy function signature */
5859
5860         zfs_ioctl_register_legacy(ZFS_IOC_POOL_FREEZE, zfs_ioc_pool_freeze,
5861             zfs_secpolicy_config, NO_NAME, B_FALSE, POOL_CHECK_READONLY);
5862
5863         zfs_ioctl_register_pool(ZFS_IOC_POOL_CREATE, zfs_ioc_pool_create,
5864             zfs_secpolicy_config, B_TRUE, POOL_CHECK_NONE);
5865         zfs_ioctl_register_pool_modify(ZFS_IOC_POOL_SCAN,
5866             zfs_ioc_pool_scan);
5867         zfs_ioctl_register_pool_modify(ZFS_IOC_POOL_UPGRADE,
5868             zfs_ioc_pool_upgrade);
5869         zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_ADD,
5870             zfs_ioc_vdev_add);
5871         zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_REMOVE,
5872             zfs_ioc_vdev_remove);
5873         zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_SET_STATE,
5874             zfs_ioc_vdev_set_state);
5875         zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_ATTACH,
5876             zfs_ioc_vdev_attach);
5877         zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_DETACH,
5878             zfs_ioc_vdev_detach);
5879         zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_SETPATH,
5880             zfs_ioc_vdev_setpath);
5881         zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_SETFRU,
5882             zfs_ioc_vdev_setfru);
5883         zfs_ioctl_register_pool_modify(ZFS_IOC_POOL_SET_PROPS,
5884             zfs_ioc_pool_set_props);
5885         zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_SPLIT,
5886             zfs_ioc_vdev_split);
5887         zfs_ioctl_register_pool_modify(ZFS_IOC_POOL_REGUID,
5888             zfs_ioc_pool_reguid);
5889
5890         zfs_ioctl_register_pool_meta(ZFS_IOC_POOL_CONFIGS,
5891             zfs_ioc_pool_configs, zfs_secpolicy_none);
5892         zfs_ioctl_register_pool_meta(ZFS_IOC_POOL_TRYIMPORT,
5893             zfs_ioc_pool_tryimport, zfs_secpolicy_config);
5894         zfs_ioctl_register_pool_meta(ZFS_IOC_INJECT_FAULT,
5895             zfs_ioc_inject_fault, zfs_secpolicy_inject);
5896         zfs_ioctl_register_pool_meta(ZFS_IOC_CLEAR_FAULT,
5897             zfs_ioc_clear_fault, zfs_secpolicy_inject);
5898         zfs_ioctl_register_pool_meta(ZFS_IOC_INJECT_LIST_NEXT,
5899             zfs_ioc_inject_list_next, zfs_secpolicy_inject);
5900
5901         /*
5902          * pool destroy, and export don't log the history as part of
5903          * zfsdev_ioctl, but rather zfs_ioc_pool_export
5904          * does the logging of those commands.
5905          */
5906         zfs_ioctl_register_pool(ZFS_IOC_POOL_DESTROY, zfs_ioc_pool_destroy,
5907             zfs_secpolicy_config, B_FALSE, POOL_CHECK_NONE);
5908         zfs_ioctl_register_pool(ZFS_IOC_POOL_EXPORT, zfs_ioc_pool_export,
5909             zfs_secpolicy_config, B_FALSE, POOL_CHECK_NONE);
5910
5911         zfs_ioctl_register_pool(ZFS_IOC_POOL_STATS, zfs_ioc_pool_stats,
5912             zfs_secpolicy_read, B_FALSE, POOL_CHECK_NONE);
5913         zfs_ioctl_register_pool(ZFS_IOC_POOL_GET_PROPS, zfs_ioc_pool_get_props,
5914             zfs_secpolicy_read, B_FALSE, POOL_CHECK_NONE);
5915
5916         zfs_ioctl_register_pool(ZFS_IOC_ERROR_LOG, zfs_ioc_error_log,
5917             zfs_secpolicy_inject, B_FALSE, POOL_CHECK_NONE);
5918         zfs_ioctl_register_pool(ZFS_IOC_DSOBJ_TO_DSNAME,
5919             zfs_ioc_dsobj_to_dsname,
5920             zfs_secpolicy_diff, B_FALSE, POOL_CHECK_NONE);
5921         zfs_ioctl_register_pool(ZFS_IOC_POOL_GET_HISTORY,
5922             zfs_ioc_pool_get_history,
5923             zfs_secpolicy_config, B_FALSE, POOL_CHECK_SUSPENDED);
5924
5925         zfs_ioctl_register_pool(ZFS_IOC_POOL_IMPORT, zfs_ioc_pool_import,
5926             zfs_secpolicy_config, B_TRUE, POOL_CHECK_NONE);
5927
5928         zfs_ioctl_register_pool(ZFS_IOC_CLEAR, zfs_ioc_clear,
5929             zfs_secpolicy_config, B_TRUE, POOL_CHECK_NONE);
5930         zfs_ioctl_register_pool(ZFS_IOC_POOL_REOPEN, zfs_ioc_pool_reopen,
5931             zfs_secpolicy_config, B_TRUE, POOL_CHECK_SUSPENDED);
5932
5933         zfs_ioctl_register_dataset_read(ZFS_IOC_SPACE_WRITTEN,
5934             zfs_ioc_space_written);
5935         zfs_ioctl_register_dataset_read(ZFS_IOC_OBJSET_RECVD_PROPS,
5936             zfs_ioc_objset_recvd_props);
5937         zfs_ioctl_register_dataset_read(ZFS_IOC_NEXT_OBJ,
5938             zfs_ioc_next_obj);
5939         zfs_ioctl_register_dataset_read(ZFS_IOC_GET_FSACL,
5940             zfs_ioc_get_fsacl);
5941         zfs_ioctl_register_dataset_read(ZFS_IOC_OBJSET_STATS,
5942             zfs_ioc_objset_stats);
5943         zfs_ioctl_register_dataset_read(ZFS_IOC_OBJSET_ZPLPROPS,
5944             zfs_ioc_objset_zplprops);
5945         zfs_ioctl_register_dataset_read(ZFS_IOC_DATASET_LIST_NEXT,
5946             zfs_ioc_dataset_list_next);
5947         zfs_ioctl_register_dataset_read(ZFS_IOC_SNAPSHOT_LIST_NEXT,
5948             zfs_ioc_snapshot_list_next);
5949         zfs_ioctl_register_dataset_read(ZFS_IOC_SEND_PROGRESS,
5950             zfs_ioc_send_progress);
5951
5952         zfs_ioctl_register_dataset_read_secpolicy(ZFS_IOC_DIFF,
5953             zfs_ioc_diff, zfs_secpolicy_diff);
5954         zfs_ioctl_register_dataset_read_secpolicy(ZFS_IOC_OBJ_TO_STATS,
5955             zfs_ioc_obj_to_stats, zfs_secpolicy_diff);
5956         zfs_ioctl_register_dataset_read_secpolicy(ZFS_IOC_OBJ_TO_PATH,
5957             zfs_ioc_obj_to_path, zfs_secpolicy_diff);
5958         zfs_ioctl_register_dataset_read_secpolicy(ZFS_IOC_USERSPACE_ONE,
5959             zfs_ioc_userspace_one, zfs_secpolicy_userspace_one);
5960         zfs_ioctl_register_dataset_read_secpolicy(ZFS_IOC_USERSPACE_MANY,
5961             zfs_ioc_userspace_many, zfs_secpolicy_userspace_many);
5962         zfs_ioctl_register_dataset_read_secpolicy(ZFS_IOC_SEND,
5963             zfs_ioc_send, zfs_secpolicy_send);
5964
5965         zfs_ioctl_register_dataset_modify(ZFS_IOC_SET_PROP, zfs_ioc_set_prop,
5966             zfs_secpolicy_none);
5967         zfs_ioctl_register_dataset_modify(ZFS_IOC_DESTROY, zfs_ioc_destroy,
5968             zfs_secpolicy_destroy);
5969         zfs_ioctl_register_dataset_modify(ZFS_IOC_RENAME, zfs_ioc_rename,
5970             zfs_secpolicy_rename);
5971         zfs_ioctl_register_dataset_modify(ZFS_IOC_RECV, zfs_ioc_recv,
5972             zfs_secpolicy_recv);
5973         zfs_ioctl_register_dataset_modify(ZFS_IOC_PROMOTE, zfs_ioc_promote,
5974             zfs_secpolicy_promote);
5975         zfs_ioctl_register_dataset_modify(ZFS_IOC_INHERIT_PROP,
5976             zfs_ioc_inherit_prop, zfs_secpolicy_inherit_prop);
5977         zfs_ioctl_register_dataset_modify(ZFS_IOC_SET_FSACL, zfs_ioc_set_fsacl,
5978             zfs_secpolicy_set_fsacl);
5979
5980         zfs_ioctl_register_dataset_nolog(ZFS_IOC_SHARE, zfs_ioc_share,
5981             zfs_secpolicy_share, POOL_CHECK_NONE);
5982         zfs_ioctl_register_dataset_nolog(ZFS_IOC_SMB_ACL, zfs_ioc_smb_acl,
5983             zfs_secpolicy_smb_acl, POOL_CHECK_NONE);
5984         zfs_ioctl_register_dataset_nolog(ZFS_IOC_USERSPACE_UPGRADE,
5985             zfs_ioc_userspace_upgrade, zfs_secpolicy_userspace_upgrade,
5986             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY);
5987         zfs_ioctl_register_dataset_nolog(ZFS_IOC_TMP_SNAPSHOT,
5988             zfs_ioc_tmp_snapshot, zfs_secpolicy_tmp_snapshot,
5989             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY);
5990
5991 #ifdef __FreeBSD__
5992         zfs_ioctl_register_dataset_nolog(ZFS_IOC_JAIL, zfs_ioc_jail,
5993             zfs_secpolicy_config, POOL_CHECK_NONE);
5994         zfs_ioctl_register_dataset_nolog(ZFS_IOC_UNJAIL, zfs_ioc_unjail,
5995             zfs_secpolicy_config, POOL_CHECK_NONE);
5996 #endif
5997 }
5998
5999 int
6000 pool_status_check(const char *name, zfs_ioc_namecheck_t type,
6001     zfs_ioc_poolcheck_t check)
6002 {
6003         spa_t *spa;
6004         int error;
6005
6006         ASSERT(type == POOL_NAME || type == DATASET_NAME);
6007
6008         if (check & POOL_CHECK_NONE)
6009                 return (0);
6010
6011         error = spa_open(name, &spa, FTAG);
6012         if (error == 0) {
6013                 if ((check & POOL_CHECK_SUSPENDED) && spa_suspended(spa))
6014                         error = SET_ERROR(EAGAIN);
6015                 else if ((check & POOL_CHECK_READONLY) && !spa_writeable(spa))
6016                         error = SET_ERROR(EROFS);
6017                 spa_close(spa, FTAG);
6018         }
6019         return (error);
6020 }
6021
6022 /*
6023  * Find a free minor number.
6024  */
6025 minor_t
6026 zfsdev_minor_alloc(void)
6027 {
6028         static minor_t last_minor;
6029         minor_t m;
6030
6031         ASSERT(MUTEX_HELD(&spa_namespace_lock));
6032
6033         for (m = last_minor + 1; m != last_minor; m++) {
6034                 if (m > ZFSDEV_MAX_MINOR)
6035                         m = 1;
6036                 if (ddi_get_soft_state(zfsdev_state, m) == NULL) {
6037                         last_minor = m;
6038                         return (m);
6039                 }
6040         }
6041
6042         return (0);
6043 }
6044
6045 static int
6046 zfs_ctldev_init(struct cdev *devp)
6047 {
6048         minor_t minor;
6049         zfs_soft_state_t *zs;
6050
6051         ASSERT(MUTEX_HELD(&spa_namespace_lock));
6052
6053         minor = zfsdev_minor_alloc();
6054         if (minor == 0)
6055                 return (SET_ERROR(ENXIO));
6056
6057         if (ddi_soft_state_zalloc(zfsdev_state, minor) != DDI_SUCCESS)
6058                 return (SET_ERROR(EAGAIN));
6059
6060         devfs_set_cdevpriv((void *)(uintptr_t)minor, zfsdev_close);
6061
6062         zs = ddi_get_soft_state(zfsdev_state, minor);
6063         zs->zss_type = ZSST_CTLDEV;
6064         zfs_onexit_init((zfs_onexit_t **)&zs->zss_data);
6065
6066         return (0);
6067 }
6068
6069 static void
6070 zfs_ctldev_destroy(zfs_onexit_t *zo, minor_t minor)
6071 {
6072         ASSERT(MUTEX_HELD(&spa_namespace_lock));
6073
6074         zfs_onexit_destroy(zo);
6075         ddi_soft_state_free(zfsdev_state, minor);
6076 }
6077
6078 void *
6079 zfsdev_get_soft_state(minor_t minor, enum zfs_soft_state_type which)
6080 {
6081         zfs_soft_state_t *zp;
6082
6083         zp = ddi_get_soft_state(zfsdev_state, minor);
6084         if (zp == NULL || zp->zss_type != which)
6085                 return (NULL);
6086
6087         return (zp->zss_data);
6088 }
6089
6090 static int
6091 zfsdev_open(struct cdev *devp, int flag, int mode, struct thread *td)
6092 {
6093         int error = 0;
6094
6095 #ifdef illumos
6096         if (getminor(*devp) != 0)
6097                 return (zvol_open(devp, flag, otyp, cr));
6098 #endif
6099
6100         /* This is the control device. Allocate a new minor if requested. */
6101         if (flag & FEXCL) {
6102                 mutex_enter(&spa_namespace_lock);
6103                 error = zfs_ctldev_init(devp);
6104                 mutex_exit(&spa_namespace_lock);
6105         }
6106
6107         return (error);
6108 }
6109
6110 static void
6111 zfsdev_close(void *data)
6112 {
6113         zfs_onexit_t *zo;
6114         minor_t minor = (minor_t)(uintptr_t)data;
6115
6116         if (minor == 0)
6117                 return;
6118
6119         mutex_enter(&spa_namespace_lock);
6120         zo = zfsdev_get_soft_state(minor, ZSST_CTLDEV);
6121         if (zo == NULL) {
6122                 mutex_exit(&spa_namespace_lock);
6123                 return;
6124         }
6125         zfs_ctldev_destroy(zo, minor);
6126         mutex_exit(&spa_namespace_lock);
6127 }
6128
6129 static int
6130 zfsdev_ioctl(struct cdev *dev, u_long zcmd, caddr_t arg, int flag,
6131     struct thread *td)
6132 {
6133         zfs_cmd_t *zc;
6134         uint_t vecnum;
6135         int error, rc, len;
6136 #ifdef illumos
6137         minor_t minor = getminor(dev);
6138 #else
6139         zfs_iocparm_t *zc_iocparm;
6140         int cflag, cmd, oldvecnum;
6141         boolean_t newioc, compat;
6142         void *compat_zc = NULL;
6143         cred_t *cr = td->td_ucred;
6144 #endif
6145         const zfs_ioc_vec_t *vec;
6146         char *saved_poolname = NULL;
6147         nvlist_t *innvl = NULL;
6148
6149         cflag = ZFS_CMD_COMPAT_NONE;
6150         compat = B_FALSE;
6151         newioc = B_TRUE;        /* "new" style (zfs_iocparm_t) ioctl */
6152
6153         len = IOCPARM_LEN(zcmd);
6154         vecnum = cmd = zcmd & 0xff;
6155
6156         /*
6157          * Check if we are talking to supported older binaries
6158          * and translate zfs_cmd if necessary
6159          */
6160         if (len != sizeof(zfs_iocparm_t)) {
6161                 newioc = B_FALSE;
6162                 compat = B_TRUE;
6163
6164                 vecnum = cmd;
6165
6166                 switch (len) {
6167                 case sizeof(zfs_cmd_zcmd_t):
6168                         cflag = ZFS_CMD_COMPAT_LZC;
6169                         break;
6170                 case sizeof(zfs_cmd_deadman_t):
6171                         cflag = ZFS_CMD_COMPAT_DEADMAN;
6172                         break;
6173                 case sizeof(zfs_cmd_v28_t):
6174                         cflag = ZFS_CMD_COMPAT_V28;
6175                         break;
6176                 case sizeof(zfs_cmd_v15_t):
6177                         cflag = ZFS_CMD_COMPAT_V15;
6178                         vecnum = zfs_ioctl_v15_to_v28[cmd];
6179
6180                         /*
6181                          * Return without further handling
6182                          * if the command is blacklisted.
6183                          */
6184                         if (vecnum == ZFS_IOC_COMPAT_PASS)
6185                                 return (0);
6186                         else if (vecnum == ZFS_IOC_COMPAT_FAIL)
6187                                 return (ENOTSUP);
6188                         break;
6189                 default:
6190                         return (EINVAL);
6191                 }
6192         }
6193
6194 #ifdef illumos
6195         vecnum = cmd - ZFS_IOC_FIRST;
6196         ASSERT3U(getmajor(dev), ==, ddi_driver_major(zfs_dip));
6197 #endif
6198
6199         if (vecnum >= sizeof (zfs_ioc_vec) / sizeof (zfs_ioc_vec[0]))
6200                 return (SET_ERROR(EINVAL));
6201         vec = &zfs_ioc_vec[vecnum];
6202
6203         zc = kmem_zalloc(sizeof(zfs_cmd_t), KM_SLEEP);
6204
6205 #ifdef illumos
6206         error = ddi_copyin((void *)arg, zc, sizeof (zfs_cmd_t), flag);
6207         if (error != 0) {
6208                 error = SET_ERROR(EFAULT);
6209                 goto out;
6210         }
6211 #else   /* !illumos */
6212         bzero(zc, sizeof(zfs_cmd_t));
6213
6214         if (newioc) {
6215                 zc_iocparm = (void *)arg;
6216
6217                 switch (zc_iocparm->zfs_ioctl_version) {
6218                 case ZFS_IOCVER_CURRENT:
6219                         if (zc_iocparm->zfs_cmd_size != sizeof(zfs_cmd_t)) {
6220                                 error = SET_ERROR(EINVAL);
6221                                 goto out;
6222                         }
6223                         break;
6224                 case ZFS_IOCVER_RESUME:
6225                         if (zc_iocparm->zfs_cmd_size != sizeof(zfs_cmd_resume_t)) {
6226                                 error = SET_ERROR(EFAULT);
6227                                 goto out;
6228                         }
6229                         compat = B_TRUE;
6230                         cflag = ZFS_CMD_COMPAT_RESUME;
6231                         break;
6232                 case ZFS_IOCVER_EDBP:
6233                         if (zc_iocparm->zfs_cmd_size != sizeof(zfs_cmd_edbp_t)) {
6234                                 error = SET_ERROR(EFAULT);
6235                                 goto out;
6236                         }
6237                         compat = B_TRUE;
6238                         cflag = ZFS_CMD_COMPAT_EDBP;
6239                         break;
6240                 case ZFS_IOCVER_ZCMD:
6241                         if (zc_iocparm->zfs_cmd_size > sizeof(zfs_cmd_t) ||
6242                             zc_iocparm->zfs_cmd_size < sizeof(zfs_cmd_zcmd_t)) {
6243                                 error = SET_ERROR(EFAULT);
6244                                 goto out;
6245                         }
6246                         compat = B_TRUE;
6247                         cflag = ZFS_CMD_COMPAT_ZCMD;
6248                         break;
6249                 default:
6250                         error = SET_ERROR(EINVAL);
6251                         goto out;
6252                         /* NOTREACHED */
6253                 }
6254
6255                 if (compat) {
6256                         ASSERT(sizeof(zfs_cmd_t) >= zc_iocparm->zfs_cmd_size);
6257                         compat_zc = kmem_zalloc(sizeof(zfs_cmd_t), KM_SLEEP);
6258                         bzero(compat_zc, sizeof(zfs_cmd_t));
6259
6260                         error = ddi_copyin((void *)(uintptr_t)zc_iocparm->zfs_cmd,
6261                             compat_zc, zc_iocparm->zfs_cmd_size, flag);
6262                         if (error != 0) {
6263                                 error = SET_ERROR(EFAULT);
6264                                 goto out;
6265                         }
6266                 } else {
6267                         error = ddi_copyin((void *)(uintptr_t)zc_iocparm->zfs_cmd,
6268                             zc, zc_iocparm->zfs_cmd_size, flag);
6269                         if (error != 0) {
6270                                 error = SET_ERROR(EFAULT);
6271                                 goto out;
6272                         }
6273                 }
6274         }
6275
6276         if (compat) {
6277                 if (newioc) {
6278                         ASSERT(compat_zc != NULL);
6279                         zfs_cmd_compat_get(zc, compat_zc, cflag);
6280                 } else {
6281                         ASSERT(compat_zc == NULL);
6282                         zfs_cmd_compat_get(zc, arg, cflag);
6283                 }
6284                 oldvecnum = vecnum;
6285                 error = zfs_ioctl_compat_pre(zc, &vecnum, cflag);
6286                 if (error != 0)
6287                         goto out;
6288                 if (oldvecnum != vecnum)
6289                         vec = &zfs_ioc_vec[vecnum];
6290         }
6291 #endif  /* !illumos */
6292
6293         zc->zc_iflags = flag & FKIOCTL;
6294         if (zc->zc_nvlist_src_size != 0) {
6295                 error = get_nvlist(zc->zc_nvlist_src, zc->zc_nvlist_src_size,
6296                     zc->zc_iflags, &innvl);
6297                 if (error != 0)
6298                         goto out;
6299         }
6300
6301         /* rewrite innvl for backwards compatibility */
6302         if (compat)
6303                 innvl = zfs_ioctl_compat_innvl(zc, innvl, vecnum, cflag);
6304
6305         /*
6306          * Ensure that all pool/dataset names are valid before we pass down to
6307          * the lower layers.
6308          */
6309         zc->zc_name[sizeof (zc->zc_name) - 1] = '\0';
6310         switch (vec->zvec_namecheck) {
6311         case POOL_NAME:
6312                 if (pool_namecheck(zc->zc_name, NULL, NULL) != 0)
6313                         error = SET_ERROR(EINVAL);
6314                 else
6315                         error = pool_status_check(zc->zc_name,
6316                             vec->zvec_namecheck, vec->zvec_pool_check);
6317                 break;
6318
6319         case DATASET_NAME:
6320                 if (dataset_namecheck(zc->zc_name, NULL, NULL) != 0)
6321                         error = SET_ERROR(EINVAL);
6322                 else
6323                         error = pool_status_check(zc->zc_name,
6324                             vec->zvec_namecheck, vec->zvec_pool_check);
6325                 break;
6326
6327         case NO_NAME:
6328                 break;
6329         }
6330
6331         if (error == 0 && !(flag & FKIOCTL))
6332                 error = vec->zvec_secpolicy(zc, innvl, cr);
6333
6334         if (error != 0)
6335                 goto out;
6336
6337         /* legacy ioctls can modify zc_name */
6338         len = strcspn(zc->zc_name, "/@#") + 1;
6339         saved_poolname = kmem_alloc(len, KM_SLEEP);
6340         (void) strlcpy(saved_poolname, zc->zc_name, len);
6341
6342         if (vec->zvec_func != NULL) {
6343                 nvlist_t *outnvl;
6344                 int puterror = 0;
6345                 spa_t *spa;
6346                 nvlist_t *lognv = NULL;
6347
6348                 ASSERT(vec->zvec_legacy_func == NULL);
6349
6350                 /*
6351                  * Add the innvl to the lognv before calling the func,
6352                  * in case the func changes the innvl.
6353                  */
6354                 if (vec->zvec_allow_log) {
6355                         lognv = fnvlist_alloc();
6356                         fnvlist_add_string(lognv, ZPOOL_HIST_IOCTL,
6357                             vec->zvec_name);
6358                         if (!nvlist_empty(innvl)) {
6359                                 fnvlist_add_nvlist(lognv, ZPOOL_HIST_INPUT_NVL,
6360                                     innvl);
6361                         }
6362                 }
6363
6364                 outnvl = fnvlist_alloc();
6365                 error = vec->zvec_func(zc->zc_name, innvl, outnvl);
6366
6367                 if (error == 0 && vec->zvec_allow_log &&
6368                     spa_open(zc->zc_name, &spa, FTAG) == 0) {
6369                         if (!nvlist_empty(outnvl)) {
6370                                 fnvlist_add_nvlist(lognv, ZPOOL_HIST_OUTPUT_NVL,
6371                                     outnvl);
6372                         }
6373                         (void) spa_history_log_nvl(spa, lognv);
6374                         spa_close(spa, FTAG);
6375                 }
6376                 fnvlist_free(lognv);
6377
6378                 /* rewrite outnvl for backwards compatibility */
6379                 if (compat)
6380                         outnvl = zfs_ioctl_compat_outnvl(zc, outnvl, vecnum,
6381                             cflag);
6382
6383                 if (!nvlist_empty(outnvl) || zc->zc_nvlist_dst_size != 0) {
6384                         int smusherror = 0;
6385                         if (vec->zvec_smush_outnvlist) {
6386                                 smusherror = nvlist_smush(outnvl,
6387                                     zc->zc_nvlist_dst_size);
6388                         }
6389                         if (smusherror == 0)
6390                                 puterror = put_nvlist(zc, outnvl);
6391                 }
6392
6393                 if (puterror != 0)
6394                         error = puterror;
6395
6396                 nvlist_free(outnvl);
6397         } else {
6398                 error = vec->zvec_legacy_func(zc);
6399         }
6400
6401 out:
6402         nvlist_free(innvl);
6403
6404 #ifdef illumos
6405         rc = ddi_copyout(zc, (void *)arg, sizeof (zfs_cmd_t), flag);
6406         if (error == 0 && rc != 0)
6407                 error = SET_ERROR(EFAULT);
6408 #else
6409         if (compat) {
6410                 zfs_ioctl_compat_post(zc, cmd, cflag);
6411                 if (newioc) {
6412                         ASSERT(compat_zc != NULL);
6413                         ASSERT(sizeof(zfs_cmd_t) >= zc_iocparm->zfs_cmd_size);
6414
6415                         zfs_cmd_compat_put(zc, compat_zc, vecnum, cflag);
6416                         rc = ddi_copyout(compat_zc,
6417                             (void *)(uintptr_t)zc_iocparm->zfs_cmd,
6418                             zc_iocparm->zfs_cmd_size, flag);
6419                         if (error == 0 && rc != 0)
6420                                 error = SET_ERROR(EFAULT);
6421                         kmem_free(compat_zc, sizeof (zfs_cmd_t));
6422                 } else {
6423                         zfs_cmd_compat_put(zc, arg, vecnum, cflag);
6424                 }
6425         } else {
6426                 ASSERT(newioc);
6427
6428                 rc = ddi_copyout(zc, (void *)(uintptr_t)zc_iocparm->zfs_cmd,
6429                     sizeof (zfs_cmd_t), flag);
6430                 if (error == 0 && rc != 0)
6431                         error = SET_ERROR(EFAULT);
6432         }
6433 #endif
6434         if (error == 0 && vec->zvec_allow_log) {
6435                 char *s = tsd_get(zfs_allow_log_key);
6436                 if (s != NULL)
6437                         strfree(s);
6438                 (void) tsd_set(zfs_allow_log_key, saved_poolname);
6439         } else {
6440                 if (saved_poolname != NULL)
6441                         strfree(saved_poolname);
6442         }
6443
6444         kmem_free(zc, sizeof (zfs_cmd_t));
6445         return (error);
6446 }
6447
6448 #ifdef illumos
6449 static int
6450 zfs_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
6451 {
6452         if (cmd != DDI_ATTACH)
6453                 return (DDI_FAILURE);
6454
6455         if (ddi_create_minor_node(dip, "zfs", S_IFCHR, 0,
6456             DDI_PSEUDO, 0) == DDI_FAILURE)
6457                 return (DDI_FAILURE);
6458
6459         zfs_dip = dip;
6460
6461         ddi_report_dev(dip);
6462
6463         return (DDI_SUCCESS);
6464 }
6465
6466 static int
6467 zfs_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
6468 {
6469         if (spa_busy() || zfs_busy() || zvol_busy())
6470                 return (DDI_FAILURE);
6471
6472         if (cmd != DDI_DETACH)
6473                 return (DDI_FAILURE);
6474
6475         zfs_dip = NULL;
6476
6477         ddi_prop_remove_all(dip);
6478         ddi_remove_minor_node(dip, NULL);
6479
6480         return (DDI_SUCCESS);
6481 }
6482
6483 /*ARGSUSED*/
6484 static int
6485 zfs_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
6486 {
6487         switch (infocmd) {
6488         case DDI_INFO_DEVT2DEVINFO:
6489                 *result = zfs_dip;
6490                 return (DDI_SUCCESS);
6491
6492         case DDI_INFO_DEVT2INSTANCE:
6493                 *result = (void *)0;
6494                 return (DDI_SUCCESS);
6495         }
6496
6497         return (DDI_FAILURE);
6498 }
6499 #endif  /* illumos */
6500
6501 /*
6502  * OK, so this is a little weird.
6503  *
6504  * /dev/zfs is the control node, i.e. minor 0.
6505  * /dev/zvol/[r]dsk/pool/dataset are the zvols, minor > 0.
6506  *
6507  * /dev/zfs has basically nothing to do except serve up ioctls,
6508  * so most of the standard driver entry points are in zvol.c.
6509  */
6510 #ifdef illumos
6511 static struct cb_ops zfs_cb_ops = {
6512         zfsdev_open,    /* open */
6513         zfsdev_close,   /* close */
6514         zvol_strategy,  /* strategy */
6515         nodev,          /* print */
6516         zvol_dump,      /* dump */
6517         zvol_read,      /* read */
6518         zvol_write,     /* write */
6519         zfsdev_ioctl,   /* ioctl */
6520         nodev,          /* devmap */
6521         nodev,          /* mmap */
6522         nodev,          /* segmap */
6523         nochpoll,       /* poll */
6524         ddi_prop_op,    /* prop_op */
6525         NULL,           /* streamtab */
6526         D_NEW | D_MP | D_64BIT,         /* Driver compatibility flag */
6527         CB_REV,         /* version */
6528         nodev,          /* async read */
6529         nodev,          /* async write */
6530 };
6531
6532 static struct dev_ops zfs_dev_ops = {
6533         DEVO_REV,       /* version */
6534         0,              /* refcnt */
6535         zfs_info,       /* info */
6536         nulldev,        /* identify */
6537         nulldev,        /* probe */
6538         zfs_attach,     /* attach */
6539         zfs_detach,     /* detach */
6540         nodev,          /* reset */
6541         &zfs_cb_ops,    /* driver operations */
6542         NULL,           /* no bus operations */
6543         NULL,           /* power */
6544         ddi_quiesce_not_needed, /* quiesce */
6545 };
6546
6547 static struct modldrv zfs_modldrv = {
6548         &mod_driverops,
6549         "ZFS storage pool",
6550         &zfs_dev_ops
6551 };
6552
6553 static struct modlinkage modlinkage = {
6554         MODREV_1,
6555         (void *)&zfs_modlfs,
6556         (void *)&zfs_modldrv,
6557         NULL
6558 };
6559 #endif  /* illumos */
6560
6561 static struct cdevsw zfs_cdevsw = {
6562         .d_version =    D_VERSION,
6563         .d_open =       zfsdev_open,
6564         .d_ioctl =      zfsdev_ioctl,
6565         .d_name =       ZFS_DEV_NAME
6566 };
6567
6568 static void
6569 zfs_allow_log_destroy(void *arg)
6570 {
6571         char *poolname = arg;
6572         strfree(poolname);
6573 }
6574
6575 static void
6576 zfsdev_init(void)
6577 {
6578         zfsdev = make_dev(&zfs_cdevsw, 0x0, UID_ROOT, GID_OPERATOR, 0666,
6579             ZFS_DEV_NAME);
6580 }
6581
6582 static void
6583 zfsdev_fini(void)
6584 {
6585         if (zfsdev != NULL)
6586                 destroy_dev(zfsdev);
6587 }
6588
6589 static struct root_hold_token *zfs_root_token;
6590 struct proc *zfsproc;
6591
6592 #ifdef illumos
6593 int
6594 _init(void)
6595 {
6596         int error;
6597
6598         spa_init(FREAD | FWRITE);
6599         zfs_init();
6600         zvol_init();
6601         zfs_ioctl_init();
6602
6603         if ((error = mod_install(&modlinkage)) != 0) {
6604                 zvol_fini();
6605                 zfs_fini();
6606                 spa_fini();
6607                 return (error);
6608         }
6609
6610         tsd_create(&zfs_fsyncer_key, NULL);
6611         tsd_create(&rrw_tsd_key, rrw_tsd_destroy);
6612         tsd_create(&zfs_allow_log_key, zfs_allow_log_destroy);
6613
6614         error = ldi_ident_from_mod(&modlinkage, &zfs_li);
6615         ASSERT(error == 0);
6616         mutex_init(&zfs_share_lock, NULL, MUTEX_DEFAULT, NULL);
6617
6618         return (0);
6619 }
6620
6621 int
6622 _fini(void)
6623 {
6624         int error;
6625
6626         if (spa_busy() || zfs_busy() || zvol_busy() || zio_injection_enabled)
6627                 return (SET_ERROR(EBUSY));
6628
6629         if ((error = mod_remove(&modlinkage)) != 0)
6630                 return (error);
6631
6632         zvol_fini();
6633         zfs_fini();
6634         spa_fini();
6635         if (zfs_nfsshare_inited)
6636                 (void) ddi_modclose(nfs_mod);
6637         if (zfs_smbshare_inited)
6638                 (void) ddi_modclose(smbsrv_mod);
6639         if (zfs_nfsshare_inited || zfs_smbshare_inited)
6640                 (void) ddi_modclose(sharefs_mod);
6641
6642         tsd_destroy(&zfs_fsyncer_key);
6643         ldi_ident_release(zfs_li);
6644         zfs_li = NULL;
6645         mutex_destroy(&zfs_share_lock);
6646
6647         return (error);
6648 }
6649
6650 int
6651 _info(struct modinfo *modinfop)
6652 {
6653         return (mod_info(&modlinkage, modinfop));
6654 }
6655 #endif  /* illumos */
6656
6657 static int zfs__init(void);
6658 static int zfs__fini(void);
6659 static void zfs_shutdown(void *, int);
6660
6661 static eventhandler_tag zfs_shutdown_event_tag;
6662
6663 #ifdef __FreeBSD__
6664 #define ZFS_MIN_KSTACK_PAGES 4
6665 #endif
6666
6667 int
6668 zfs__init(void)
6669 {
6670
6671 #ifdef __FreeBSD__
6672 #if KSTACK_PAGES < ZFS_MIN_KSTACK_PAGES
6673         printf("ZFS NOTICE: KSTACK_PAGES is %d which could result in stack "
6674             "overflow panic!\nPlease consider adding "
6675             "'options KSTACK_PAGES=%d' to your kernel config\n", KSTACK_PAGES,
6676             ZFS_MIN_KSTACK_PAGES);
6677 #endif
6678 #endif
6679         zfs_root_token = root_mount_hold("ZFS");
6680
6681         mutex_init(&zfs_share_lock, NULL, MUTEX_DEFAULT, NULL);
6682
6683         spa_init(FREAD | FWRITE);
6684         zfs_init();
6685         zvol_init();
6686         zfs_ioctl_init();
6687
6688         tsd_create(&zfs_fsyncer_key, NULL);
6689         tsd_create(&rrw_tsd_key, rrw_tsd_destroy);
6690         tsd_create(&zfs_allow_log_key, zfs_allow_log_destroy);
6691
6692         printf("ZFS storage pool version: features support (" SPA_VERSION_STRING ")\n");
6693         root_mount_rel(zfs_root_token);
6694
6695         zfsdev_init();
6696
6697         return (0);
6698 }
6699
6700 int
6701 zfs__fini(void)
6702 {
6703         if (spa_busy() || zfs_busy() || zvol_busy() ||
6704             zio_injection_enabled) {
6705                 return (EBUSY);
6706         }
6707
6708         zfsdev_fini();
6709         zvol_fini();
6710         zfs_fini();
6711         spa_fini();
6712
6713         tsd_destroy(&zfs_fsyncer_key);
6714         tsd_destroy(&rrw_tsd_key);
6715         tsd_destroy(&zfs_allow_log_key);
6716
6717         mutex_destroy(&zfs_share_lock);
6718
6719         return (0);
6720 }
6721
6722 static void
6723 zfs_shutdown(void *arg __unused, int howto __unused)
6724 {
6725
6726         /*
6727          * ZFS fini routines can not properly work in a panic-ed system.
6728          */
6729         if (panicstr == NULL)
6730                 (void)zfs__fini();
6731 }
6732
6733
6734 static int
6735 zfs_modevent(module_t mod, int type, void *unused __unused)
6736 {
6737         int err;
6738
6739         switch (type) {
6740         case MOD_LOAD:
6741                 err = zfs__init();
6742                 if (err == 0)
6743                         zfs_shutdown_event_tag = EVENTHANDLER_REGISTER(
6744                             shutdown_post_sync, zfs_shutdown, NULL,
6745                             SHUTDOWN_PRI_FIRST);
6746                 return (err);
6747         case MOD_UNLOAD:
6748                 err = zfs__fini();
6749                 if (err == 0 && zfs_shutdown_event_tag != NULL)
6750                         EVENTHANDLER_DEREGISTER(shutdown_post_sync,
6751                             zfs_shutdown_event_tag);
6752                 return (err);
6753         case MOD_SHUTDOWN:
6754                 return (0);
6755         default:
6756                 break;
6757         }
6758         return (EOPNOTSUPP);
6759 }
6760
6761 static moduledata_t zfs_mod = {
6762         "zfsctrl",
6763         zfs_modevent,
6764         0
6765 };
6766 DECLARE_MODULE(zfsctrl, zfs_mod, SI_SUB_VFS, SI_ORDER_ANY);
6767 MODULE_VERSION(zfsctrl, 1);
6768 MODULE_DEPEND(zfsctrl, opensolaris, 1, 1, 1);
6769 MODULE_DEPEND(zfsctrl, krpc, 1, 1, 1);
6770 MODULE_DEPEND(zfsctrl, acl_nfs4, 1, 1, 1);