-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Am Mon, 22 Feb 2021 12:02:04 GMT
Martin Matuska <m...@freebsd.org> schrieb:

> The branch main has been updated by mm:
> 
> URL: 
> https://cgit.FreeBSD.org/src/commit/?id=ba27dd8be821792e15bdabfac69fd6cab0cf9dd3
> 
> commit ba27dd8be821792e15bdabfac69fd6cab0cf9dd3
> Merge: c02a28754bc2 0626917d0786
> Author:     Martin Matuska <m...@freebsd.org>
> AuthorDate: 2021-02-22 11:35:56 +0000
> Commit:     Martin Matuska <m...@freebsd.org>
> CommitDate: 2021-02-22 12:01:17 +0000
> 
>     zfs: merge OpenZFS master-9312e0fd1
>     
>     Notable upstream changes:
>       778869fa1 Fix reporting of mount progress
>       e7adccf7f Disable use of hardware crypto offload drivers on FreeBSD
>       03e02e5b5 Fix checksum errors not being counted on repeated repair
>       64e0fe14f Restore FreeBSD resource usage accounting
>       11f2e9a49 Fix panic if scrubbing after removing a slog device
>     
>     MFC after:      2 weeks
> 
>  cddl/lib/libzpool/Makefile                         |   1 +
>  stand/libsa/zfs/zstd_shim.c                        |   5 +
>  sys/contrib/openzfs/cmd/zfs/zfs_main.c             |   3 -
>  sys/contrib/openzfs/cmd/ztest/ztest.c              | 113 ++++++++-
>  .../openzfs/include/os/freebsd/spl/sys/uio.h       |  43 +---
>  sys/contrib/openzfs/include/os/linux/spl/sys/uio.h |  22 +-
>  .../include/os/linux/zfs/sys/zfs_context_os.h      |   1 -
>  sys/contrib/openzfs/include/sys/Makefile.am        |   1 +
>  sys/contrib/openzfs/include/sys/spa.h              |   3 +-
>  sys/contrib/openzfs/include/sys/uio_impl.h         |  21 +-
>  sys/contrib/openzfs/include/sys/zfs_context.h      |   3 +-
>  sys/contrib/openzfs/include/sys/zfs_racct.h        |  37 +++
>  sys/contrib/openzfs/lib/libzpool/Makefile.am       |   1 +
>  sys/contrib/openzfs/lib/libzpool/util.c            |  74 ++++--
>  .../lib/libzutil/os/linux/zutil_device_path_os.c   | 252 
> ++++++++++++---------
>  sys/contrib/openzfs/module/Makefile.bsd            |   1 +
>  .../openzfs/module/os/freebsd/spl/spl_uio.c        |   9 +-
>  .../openzfs/module/os/freebsd/zfs/crypto_os.c      |  15 +-
>  .../openzfs/module/os/freebsd/zfs/zfs_racct.c      |  55 +++++
>  .../openzfs/module/os/linux/zfs/Makefile.in        |   1 +
>  .../openzfs/module/os/linux/zfs/zfs_racct.c        |  36 +++
>  sys/contrib/openzfs/module/zfs/arc.c               |   2 +
>  sys/contrib/openzfs/module/zfs/dmu.c               |   5 +
>  sys/contrib/openzfs/module/zfs/dsl_scan.c          |   6 +-
>  sys/contrib/openzfs/module/zfs/spa_config.c        |   2 +-
>  sys/contrib/openzfs/module/zfs/vdev.c              |   9 +-
>  sys/contrib/openzfs/module/zfs/vdev_indirect.c     |  10 +-
>  sys/contrib/openzfs/module/zfs/vdev_raidz.c        |  20 +-
>  sys/contrib/openzfs/module/zfs/vdev_rebuild.c      |   3 +
>  sys/contrib/openzfs/module/zfs/zfs_fm.c            |  46 +++-
>  sys/contrib/openzfs/module/zfs/zfs_ioctl.c         |   2 +-
>  sys/contrib/openzfs/module/zfs/zfs_vnops.c         |   2 +-
>  sys/contrib/openzfs/module/zfs/zio.c               |  11 +-
>  sys/contrib/openzfs/scripts/zfs.sh                 |   2 +-
>  sys/contrib/openzfs/tests/runfiles/common.run      |   3 +-
>  .../functional/cli_root/zpool_events/Makefile.am   |   3 +-
>  .../zpool_events/zpool_events_clear_retained.ksh   | 135 +++++++++++
>  .../zpool_events/zpool_events_duplicates.ksh       |  11 -
>  sys/modules/zfs/Makefile                           |   1 +
>  sys/modules/zfs/zfs_config.h                       |   2 +-
>  40 files changed, 724 insertions(+), 248 deletions(-)
> 
> diff --cc cddl/lib/libzpool/Makefile
> index d9b2e67094e3,000000000000..6893e31ff20a
> mode 100644,000000..100644
> --- a/cddl/lib/libzpool/Makefile
> +++ b/cddl/lib/libzpool/Makefile
> @@@ -1,266 -1,0 +1,267 @@@
>  +# $FreeBSD$
>  +
>  +ZFSTOP=     ${SRCTOP}/sys/contrib/openzfs
>  +
>  +# ZFS_COMMON_SRCS
>  +.PATH: ${ZFSTOP}/module/zfs
>  +.PATH: ${ZFSTOP}/module/zcommon
>  +.PATH: ${ZFSTOP}/module/unicode
>  +# LUA_SRCS
>  +.PATH: ${ZFSTOP}/module/lua
>  +# ZSTD_SRCS
>  +.PATH: ${ZFSTOP}/module/zstd
>  +.PATH: ${ZFSTOP}/module/zstd/lib
>  +
>  +.PATH: ${ZFSTOP}/module/os/linux/zfs
>  +
>  +.PATH: ${ZFSTOP}/lib/libzpool
>  +
>  +.if
> exists(${SRCTOP}/sys/cddl/contrib/opensolaris/common/atomic/${MACHINE_ARCH}/opensolaris_atomic.S)
> +.PATH: ${SRCTOP}/sys/cddl/contrib/opensolaris/common/atomic/${MACHINE_ARCH}
> +ATOMIC_SRCS= opensolaris_atomic.S +ACFLAGS+= -Wa,--noexecstack
>  +.else
>  +.PATH: ${SRCTOP}/sys/cddl/compat/opensolaris/kern
>  +ATOMIC_SRCS=        opensolaris_atomic.c
>  +.endif
>  +
>  +.if ${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "powerpcspe"
>  +# Don't waste GOT entries on small data.
>  +PICFLAG=    -fPIC
>  +.endif
>  +
>  +LIB=                zpool
>  +
>  +USER_C = \
>  +    kernel.c \
>  +    taskq.c \
>  +    util.c
>  +
>  +KERNEL_C = \
>  +    zfeature_common.c \
>  +    zfs_comutil.c \
>  +    zfs_deleg.c \
>  +    zfs_fletcher.c \
>  +    zfs_fletcher_superscalar.c \
>  +    zfs_fletcher_superscalar4.c \
>  +    zfs_namecheck.c \
>  +    zfs_prop.c \
>  +    zfs_zstd.c \
>  +    zpool_prop.c \
>  +    zprop_common.c \
>  +    abd.c \
>  +    abd_os.c \
>  +    aggsum.c \
>  +    arc.c \
>  +    arc_os.c \
>  +    blkptr.c \
>  +    bplist.c \
>  +    bpobj.c \
>  +    bptree.c \
>  +    btree.c \
>  +    bqueue.c \
>  +    cityhash.c \
>  +    dbuf.c \
>  +    dbuf_stats.c \
>  +    ddt.c \
>  +    ddt_zap.c \
>  +    dmu.c \
>  +    dmu_diff.c \
>  +    dmu_object.c \
>  +    dmu_objset.c \
>  +    dmu_recv.c \
>  +    dmu_redact.c \
>  +    dmu_send.c \
>  +    dmu_traverse.c \
>  +    dmu_tx.c \
>  +    dmu_zfetch.c \
>  +    dnode.c \
>  +    dnode_sync.c \
>  +    dsl_bookmark.c \
>  +    dsl_dataset.c \
>  +    dsl_deadlist.c \
>  +    dsl_deleg.c \
>  +    dsl_dir.c \
>  +    dsl_crypt.c \
>  +    dsl_pool.c \
>  +    dsl_prop.c \
>  +    dsl_scan.c \
>  +    dsl_synctask.c \
>  +    dsl_destroy.c \
>  +    dsl_userhold.c \
>  +    edonr_zfs.c \
>  +    hkdf.c \
>  +    fm.c \
>  +    gzip.c \
>  +    lzjb.c \
>  +    lz4.c \
>  +    metaslab.c \
>  +    mmp.c \
>  +    multilist.c \
>  +    objlist.c \
>  +    pathname.c \
>  +    range_tree.c \
>  +    refcount.c \
>  +    rrwlock.c \
>  +    sa.c \
>  +    sha256.c \
>  +    skein_zfs.c \
>  +    spa.c \
>  +    spa_boot.c \
>  +    spa_checkpoint.c \
>  +    spa_config.c \
>  +    spa_errlog.c \
>  +    spa_history.c \
>  +    spa_log_spacemap.c \
>  +    spa_misc.c \
>  +    spa_stats.c \
>  +    space_map.c \
>  +    space_reftree.c \
>  +    txg.c \
>  +    trace.c \
>  +    uberblock.c \
>  +    unique.c \
>  +    vdev.c \
>  +    vdev_cache.c \
>  +    vdev_draid.c \
>  +    vdev_draid_rand.c \
>  +    vdev_file.c \
>  +    vdev_indirect_births.c \
>  +    vdev_indirect.c \
>  +    vdev_indirect_mapping.c \
>  +    vdev_initialize.c \
>  +    vdev_label.c \
>  +    vdev_mirror.c \
>  +    vdev_missing.c \
>  +    vdev_queue.c \
>  +    vdev_raidz.c \
>  +    vdev_raidz_math_aarch64_neon.c \
>  +    vdev_raidz_math_aarch64_neonx2.c \
>  +    vdev_raidz_math_avx2.c \
>  +    vdev_raidz_math_avx512bw.c \
>  +    vdev_raidz_math_avx512f.c \
>  +    vdev_raidz_math.c \
>  +    vdev_raidz_math_scalar.c \
>  +    vdev_rebuild.c \
>  +    vdev_removal.c \
>  +    vdev_root.c \
>  +    vdev_trim.c \
>  +    zap.c \
>  +    zap_leaf.c \
>  +    zap_micro.c \
>  +    zcp.c \
>  +    zcp_get.c \
>  +    zcp_global.c \
>  +    zcp_iter.c \
>  +    zcp_set.c \
>  +    zcp_synctask.c \
>  +    zfeature.c \
>  +    zfs_byteswap.c \
>  +    zfs_debug.c \
>  +    zfs_fm.c \
>  +    zfs_fuid.c \
>  +    zfs_sa.c \
>  +    zfs_znode.c \
> ++    zfs_racct.c \
>  +    zfs_ratelimit.c \
>  +    zfs_rlock.c \
>  +    zil.c \
>  +    zio.c \
>  +    zio_checksum.c \
>  +    zio_compress.c \
>  +    zio_crypt.c \
>  +    zio_inject.c \
>  +    zle.c \
>  +    zrlock.c \
>  +    zstd.c \
>  +    zthr.c
>  +
>  +ARCH_C =
>  +.if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386"
>  +ARCH_C +=   vdev_raidz_math_sse2.c \
>  +            vdev_raidz_math_ssse3.c \
>  +            zfs_fletcher_intel.c \
>  +            zfs_fletcher_sse.c 
>  +CFLAGS +=  -DHAVE_SSE2      -DHAVE_SSE3
>  +.endif
>  +.if ${MACHINE_ARCH} == "amd64"
>  +ARCH_C +=   zfs_fletcher_avx512.c
>  +CFLAGS+= -DHAVE_AVX2 -DHAVE_AVX -D__x86_64 -DHAVE_AVX512F \
>  +    -DHAVE_AVX512BW
>  +.endif
>  +.if ${MACHINE_CPUARCH} == "aarch64"
>  +ARCH_C +=   zfs_fletcher_aarch64_neon.c
>  +.endif
>  +
>  +LUA_C = \
>  +    lapi.c \
>  +    lauxlib.c \
>  +    lbaselib.c \
>  +    lcode.c \
>  +    lcompat.c \
>  +    lcorolib.c \
>  +    lctype.c \
>  +    ldebug.c \
>  +    ldo.c \
>  +    lfunc.c \
>  +    lgc.c \
>  +    llex.c \
>  +    lmem.c \
>  +    lobject.c \
>  +    lopcodes.c \
>  +    lparser.c \
>  +    lstate.c \
>  +    lstring.c \
>  +    lstrlib.c \
>  +    ltable.c \
>  +    ltablib.c \
>  +    ltm.c \
>  +    lvm.c \
>  +    lzio.c
>  +
>  +UNICODE_C = u8_textprep.c uconv.c
>  +
>  +SRCS=               ${USER_C} ${KERNEL_C} ${LUA_C} ${UNICODE_C} ${ARCH_C}
>  +
>  +WARNS?=             2
>  +CFLAGS+= \
>  +    -DIN_BASE \
>  +    -I${ZFSTOP}/include \
>  +    -I${ZFSTOP}/lib/libspl/include \
>  +    -I${ZFSTOP}/lib/libspl/include/os/freebsd \
>  +    -I${SRCTOP}/sys \
>  +    -I${ZFSTOP}/include/os/freebsd/zfs \
>  +    -I${SRCTOP}/cddl/compat/opensolaris/include \
>  +    -I${ZFSTOP}/module/icp/include \
>  +    -include ${ZFSTOP}/include/os/freebsd/spl/sys/ccompile.h \
>  +    -DHAVE_ISSETUGID \
>  +    -include ${SRCTOP}/sys/modules/zfs/zfs_config.h \
>  +    -I${SRCTOP}/sys/modules/zfs \
>  +    -I${ZFSTOP}/include/os/freebsd/zfs \
>  +    -DLIB_ZPOOL_BUILD -DZFS_DEBUG \
>  +
>  +# XXX: pthread doesn't have mutex_owned() equivalent, so we need to look
>  +#      into libthr private structures. That's sooo evil, but it's only for
>  +#      ZFS debugging tools needs.
>  +CFLAGS+=    -DWANTS_MUTEX_OWNED
>  +CFLAGS+=    -I${SRCTOP}/lib/libpthread/thread
>  +CFLAGS+=    -I${SRCTOP}/lib/libpthread/sys
>  +CFLAGS+=    -I${SRCTOP}/lib/libthr/arch/${MACHINE_CPUARCH}/include
>  +CFLAGS.gcc+=        -fms-extensions
>  +
>  +LIBADD=             md pthread z spl icp nvpair avl umem
>  +
>  +# atomic.S doesn't like profiling.
>  +MK_PROFILE= no
>  +
>  +CSTD=       c99
>  +
>  +# Since there are many asserts in this library, it makes no sense to compile
>  +# it without debugging.
>  +
>  +CFLAGS+=    -g -DDEBUG=1
>  +
>  +CFLAGS.zfs_zstd.c=  -Wno-cast-qual -Wno-pointer-arith
>  +CFLAGS.zstd.c+=     -fno-tree-vectorize
>  +
>  +.include <bsd.lib.mk>
> diff --cc stand/libsa/zfs/zstd_shim.c
> index b94df6f51913,000000000000..91f5171a72b5
> mode 100644,000000..100644
> --- a/stand/libsa/zfs/zstd_shim.c
> +++ b/stand/libsa/zfs/zstd_shim.c
> @@@ -1,40 -1,0 +1,45 @@@
>  +/*-
>  + * Copyright (c) 2020 M. Warner Losh <i...@freebsd.org>
>  + *
>  + * Redistribution and use in source and binary forms, with or without
>  + * modification, are permitted provided that the following conditions
>  + * are met:
>  + * 1. Redistributions of source code must retain the above copyright
>  + *    notice, this list of conditions and the following disclaimer.
>  + * 2. Redistributions in binary form must reproduce the above copyright
>  + *    notice, this list of conditions and the following disclaimer in the
>  + *    documentation and/or other materials provided with the distribution.
>  + *
>  + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
>  + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
>  + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
> PURPOSE
>  + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
>  + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
> CONSEQUENTIAL
>  + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
>  + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
>  + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
> STRICT
>  + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
>  + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
>  + * SUCH DAMAGE.
>  + *
>  + */
>  +#include <sys/cdefs.h>
>  +__FBSDID("$FreeBSD$");
>  +
>  +/*
>  + * Small amount of shim code needed to get zfs_zstd.c to compile. These 
> items
>  + * here should all be defined in the SPL or as part of libstand somewhere, 
> but
>  + * aren't for reasons that haven't been tracked down yet. Ideally, they 
> would
>  + * all go away and we'd compile zfs_zstd.c directly. Based on an original by
>  + * Matt Macey, but only the #include remains untouched from that.
>  + */
>  +
>  +#define ZFS_MODULE_PARAM_ARGS void
>  +typedef int boolean_t;      /* This one may be tough to get rid of */
>  +
> ++/* TODO: openzfs/include/sys/uio_impl.h must not be included */
> ++#ifndef _SYS_UIO_IMPL_H
> ++#define _SYS_UIO_IMPL_H
> ++#endif
> ++
>  +#include <contrib/openzfs/module/zstd/zfs_zstd.c>
> diff --cc sys/contrib/openzfs/include/sys/zfs_racct.h
> index 000000000000,cfcdd336ea42..cfcdd336ea42
> mode 000000,100644..100644
> --- a/sys/contrib/openzfs/include/sys/zfs_racct.h
> +++ b/sys/contrib/openzfs/include/sys/zfs_racct.h
> diff --cc sys/contrib/openzfs/module/os/freebsd/zfs/zfs_racct.c
> index 000000000000,b46cc046268e..b46cc046268e
> mode 000000,100644..100644
> --- a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_racct.c
> +++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_racct.c
> diff --cc sys/contrib/openzfs/module/os/linux/zfs/zfs_racct.c
> index 000000000000,7897e0f9edc1..7897e0f9edc1
> mode 000000,100644..100644
> --- a/sys/contrib/openzfs/module/os/linux/zfs/zfs_racct.c
> +++ b/sys/contrib/openzfs/module/os/linux/zfs/zfs_racct.c
> diff --cc sys/contrib/openzfs/module/zfs/zfs_ioctl.c
> index 0e35fd069cbb,000000000000..922253469fba
> mode 100644,000000..100644
> --- a/sys/contrib/openzfs/module/zfs/zfs_ioctl.c
> +++ b/sys/contrib/openzfs/module/zfs/zfs_ioctl.c
> @@@ -1,7688 -1,0 +1,7688 @@@
>  +/*
>  + * CDDL HEADER START
>  + *
>  + * The contents of this file are subject to the terms of the
>  + * Common Development and Distribution License (the "License").
>  + * You may not use this file except in compliance with the License.
>  + *
>  + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
>  + * or http://www.opensolaris.org/os/licensing.
>  + * See the License for the specific language governing permissions
>  + * and limitations under the License.
>  + *
>  + * When distributing Covered Code, include this CDDL HEADER in each
>  + * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
>  + * If applicable, add the following below this CDDL HEADER, with the
>  + * fields enclosed by brackets "[]" replaced with your own identifying
>  + * information: Portions Copyright [yyyy] [name of copyright owner]
>  + *
>  + * CDDL HEADER END
>  + */
>  +
>  +/*
>  + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights 
> reserved.
>  + * Portions Copyright 2011 Martin Matuska
>  + * Copyright 2015, OmniTI Computer Consulting, Inc. All rights reserved.
>  + * Portions Copyright 2012 Pawel Jakub Dawidek <pa...@dawidek.net>
>  + * Copyright (c) 2014, 2016 Joyent, Inc. All rights reserved.
>  + * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
>  + * Copyright (c) 2014, Joyent, Inc. All rights reserved.
>  + * Copyright (c) 2011, 2020 by Delphix. All rights reserved.
>  + * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
>  + * Copyright (c) 2013 Steven Hartland. All rights reserved.
>  + * Copyright (c) 2014 Integros [integros.com]
>  + * Copyright 2016 Toomas Soome <tso...@me.com>
>  + * Copyright (c) 2016 Actifio, Inc. All rights reserved.
>  + * Copyright (c) 2018, loli10K <ezomori.noz...@gmail.com>. All rights 
> reserved.
>  + * Copyright 2017 RackTop Systems.
>  + * Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
>  + * Copyright (c) 2019 Datto Inc.
>  + * Copyright (c) 2019, 2020 by Christian Schwarz. All rights reserved.
>  + * Copyright (c) 2019, Klara Inc.
>  + * Copyright (c) 2019, Allan Jude
>  + */
>  +
>  +/*
>  + * ZFS ioctls.
>  + *
>  + * This file handles the ioctls to /dev/zfs, used for configuring ZFS 
> storage
>  + * pools and filesystems, e.g. with /sbin/zfs and /sbin/zpool.
>  + *
>  + * There are two ways that we handle ioctls: the legacy way where almost
>  + * all of the logic is in the ioctl callback, and the new way where most
>  + * of the marshalling is handled in the common entry point, zfsdev_ioctl().
>  + *
>  + * Non-legacy ioctls should be registered by calling
>  + * zfs_ioctl_register() from zfs_ioctl_init().  The ioctl is invoked
>  + * from userland by lzc_ioctl().
>  + *
>  + * The registration arguments are as follows:
>  + *
>  + * const char *name
>  + *   The name of the ioctl.  This is used for history logging.  If the
>  + *   ioctl returns successfully (the callback returns 0), and allow_log
>  + *   is true, then a history log entry will be recorded with the input &
>  + *   output nvlists.  The log entry can be printed with "zpool history -i".
>  + *
>  + * zfs_ioc_t ioc
>  + *   The ioctl request number, which userland will pass to ioctl(2).
>  + *   We want newer versions of libzfs and libzfs_core to run against
>  + *   existing zfs kernel modules (i.e. a deferred reboot after an update).
>  + *   Therefore the ioctl numbers cannot change from release to release.
>  + *
>  + * zfs_secpolicy_func_t *secpolicy
>  + *   This function will be called before the zfs_ioc_func_t, to
>  + *   determine if this operation is permitted.  It should return EPERM
>  + *   on failure, and 0 on success.  Checks include determining if the
>  + *   dataset is visible in this zone, and if the user has either all
>  + *   zfs privileges in the zone (SYS_MOUNT), or has been granted permission
>  + *   to do this operation on this dataset with "zfs allow".
>  + *
>  + * zfs_ioc_namecheck_t namecheck
>  + *   This specifies what to expect in the zfs_cmd_t:zc_name -- a pool
>  + *   name, a dataset name, or nothing.  If the name is not well-formed,
>  + *   the ioctl will fail and the callback will not be called.
>  + *   Therefore, the callback can assume that the name is well-formed
>  + *   (e.g. is null-terminated, doesn't have more than one '@' character,
>  + *   doesn't have invalid characters).
>  + *
>  + * zfs_ioc_poolcheck_t pool_check
>  + *   This specifies requirements on the pool state.  If the pool does
>  + *   not meet them (is suspended or is readonly), the ioctl will fail
>  + *   and the callback will not be called.  If any checks are specified
>  + *   (i.e. it is not POOL_CHECK_NONE), namecheck must not be NO_NAME.
>  + *   Multiple checks can be or-ed together (e.g. POOL_CHECK_SUSPENDED |
>  + *   POOL_CHECK_READONLY).
>  + *
>  + * zfs_ioc_key_t *nvl_keys
>  + *  The list of expected/allowable innvl input keys. This list is used
>  + *  to validate the nvlist input to the ioctl.
>  + *
>  + * boolean_t smush_outnvlist
>  + *   If smush_outnvlist is true, then the output is presumed to be a
>  + *   list of errors, and it will be "smushed" down to fit into the
>  + *   caller's buffer, by removing some entries and replacing them with a
>  + *   single "N_MORE_ERRORS" entry indicating how many were removed.  See
>  + *   nvlist_smush() for details.  If smush_outnvlist is false, and the
>  + *   outnvlist does not fit into the userland-provided buffer, then the
>  + *   ioctl will fail with ENOMEM.
>  + *
>  + * zfs_ioc_func_t *func
>  + *   The callback function that will perform the operation.
>  + *
>  + *   The callback should return 0 on success, or an error number on
>  + *   failure.  If the function fails, the userland ioctl will return -1,
>  + *   and errno will be set to the callback's return value.  The callback
>  + *   will be called with the following arguments:
>  + *
>  + *   const char *name
>  + *     The name of the pool or dataset to operate on, from
>  + *     zfs_cmd_t:zc_name.  The 'namecheck' argument specifies the
>  + *     expected type (pool, dataset, or none).
>  + *
>  + *   nvlist_t *innvl
>  + *     The input nvlist, deserialized from zfs_cmd_t:zc_nvlist_src.  Or
>  + *     NULL if no input nvlist was provided.  Changes to this nvlist are
>  + *     ignored.  If the input nvlist could not be deserialized, the
>  + *     ioctl will fail and the callback will not be called.
>  + *
>  + *   nvlist_t *outnvl
>  + *     The output nvlist, initially empty.  The callback can fill it in,
>  + *     and it will be returned to userland by serializing it into
>  + *     zfs_cmd_t:zc_nvlist_dst.  If it is non-empty, and serialization
>  + *     fails (e.g. because the caller didn't supply a large enough
>  + *     buffer), then the overall ioctl will fail.  See the
>  + *     'smush_nvlist' argument above for additional behaviors.
>  + *
>  + *     There are two typical uses of the output nvlist:
>  + *       - To return state, e.g. property values.  In this case,
>  + *         smush_outnvlist should be false.  If the buffer was not large
>  + *         enough, the caller will reallocate a larger buffer and try
>  + *         the ioctl again.
>  + *
>  + *       - To return multiple errors from an ioctl which makes on-disk
>  + *         changes.  In this case, smush_outnvlist should be true.
>  + *         Ioctls which make on-disk modifications should generally not
>  + *         use the outnvl if they succeed, because the caller can not
>  + *         distinguish between the operation failing, and
>  + *         deserialization failing.
>  + *
>  + * IOCTL Interface Errors
>  + *
>  + * The following ioctl input errors can be returned:
>  + *   ZFS_ERR_IOC_CMD_UNAVAIL        the ioctl number is not supported by 
> kernel
>  + *   ZFS_ERR_IOC_ARG_UNAVAIL        an input argument is not supported by 
> kernel
>  + *   ZFS_ERR_IOC_ARG_REQUIRED       a required input argument is missing
>  + *   ZFS_ERR_IOC_ARG_BADTYPE        an input argument has an invalid type
>  + */
>  +
>  +#include <sys/types.h>
>  +#include <sys/param.h>
>  +#include <sys/errno.h>
> - #include <sys/uio.h>
> ++#include <sys/uio_impl.h>
>  +#include <sys/file.h>
>  +#include <sys/kmem.h>
>  +#include <sys/cmn_err.h>
>  +#include <sys/stat.h>
>  +#include <sys/zfs_ioctl.h>
>  +#include <sys/zfs_quota.h>
>  +#include <sys/zfs_vfsops.h>
>  +#include <sys/zfs_znode.h>
>  +#include <sys/zap.h>
>  +#include <sys/spa.h>
>  +#include <sys/spa_impl.h>
>  +#include <sys/vdev.h>
>  +#include <sys/vdev_impl.h>
>  +#include <sys/dmu.h>
>  +#include <sys/dsl_dir.h>
>  +#include <sys/dsl_dataset.h>
>  +#include <sys/dsl_prop.h>
>  +#include <sys/dsl_deleg.h>
>  +#include <sys/dmu_objset.h>
>  +#include <sys/dmu_impl.h>
>  +#include <sys/dmu_redact.h>
>  +#include <sys/dmu_tx.h>
>  +#include <sys/sunddi.h>
>  +#include <sys/policy.h>
>  +#include <sys/zone.h>
>  +#include <sys/nvpair.h>
>  +#include <sys/pathname.h>
>  +#include <sys/fs/zfs.h>
>  +#include <sys/zfs_ctldir.h>
>  +#include <sys/zfs_dir.h>
>  +#include <sys/zfs_onexit.h>
>  +#include <sys/zvol.h>
>  +#include <sys/dsl_scan.h>
>  +#include <sys/fm/util.h>
>  +#include <sys/dsl_crypt.h>
>  +#include <sys/rrwlock.h>
>  +#include <sys/zfs_file.h>
>  +
>  +#include <sys/dmu_recv.h>
>  +#include <sys/dmu_send.h>
>  +#include <sys/dmu_recv.h>
>  +#include <sys/dsl_destroy.h>
>  +#include <sys/dsl_bookmark.h>
>  +#include <sys/dsl_userhold.h>
>  +#include <sys/zfeature.h>
>  +#include <sys/zcp.h>
>  +#include <sys/zio_checksum.h>
>  +#include <sys/vdev_removal.h>
>  +#include <sys/vdev_impl.h>
>  +#include <sys/vdev_initialize.h>
>  +#include <sys/vdev_trim.h>
>  +
>  +#include "zfs_namecheck.h"
>  +#include "zfs_prop.h"
>  +#include "zfs_deleg.h"
>  +#include "zfs_comutil.h"
>  +
>  +#include <sys/lua/lua.h>
>  +#include <sys/lua/lauxlib.h>
>  +#include <sys/zfs_ioctl_impl.h>
>  +
>  +kmutex_t zfsdev_state_lock;
>  +zfsdev_state_t *zfsdev_state_list;
>  +
>  +/*
>  + * Limit maximum nvlist size.  We don't want users passing in insane values
>  + * for zc->zc_nvlist_src_size, since we will need to allocate that much 
> memory.
>  + * Defaults to 0=auto which is handled by platform code.
>  + */
>  +unsigned long zfs_max_nvlist_src_size = 0;
>  +
>  +/*
>  + * When logging the output nvlist of an ioctl in the on-disk history, limit
>  + * the logged size to this many bytes.  This must be less then 
> DMU_MAX_ACCESS.
>  + * This applies primarily to zfs_ioc_channel_program().
>  + */
>  +unsigned long zfs_history_output_max = 1024 * 1024;
>  +
>  +uint_t zfs_fsyncer_key;
>  +uint_t zfs_allow_log_key;
>  +
>  +/* DATA_TYPE_ANY is used when zkey_type can vary. */
>  +#define     DATA_TYPE_ANY   DATA_TYPE_UNKNOWN
>  +
>  +typedef struct zfs_ioc_vec {
>  +    zfs_ioc_legacy_func_t   *zvec_legacy_func;
>  +    zfs_ioc_func_t          *zvec_func;
>  +    zfs_secpolicy_func_t    *zvec_secpolicy;
>  +    zfs_ioc_namecheck_t     zvec_namecheck;
>  +    boolean_t               zvec_allow_log;
>  +    zfs_ioc_poolcheck_t     zvec_pool_check;
>  +    boolean_t               zvec_smush_outnvlist;
>  +    const char              *zvec_name;
>  +    const zfs_ioc_key_t     *zvec_nvl_keys;
>  +    size_t                  zvec_nvl_key_count;
>  +} zfs_ioc_vec_t;
>  +
>  +/* This array is indexed by zfs_userquota_prop_t */
>  +static const char *userquota_perms[] = {
>  +    ZFS_DELEG_PERM_USERUSED,
>  +    ZFS_DELEG_PERM_USERQUOTA,
>  +    ZFS_DELEG_PERM_GROUPUSED,
>  +    ZFS_DELEG_PERM_GROUPQUOTA,
>  +    ZFS_DELEG_PERM_USEROBJUSED,
>  +    ZFS_DELEG_PERM_USEROBJQUOTA,
>  +    ZFS_DELEG_PERM_GROUPOBJUSED,
>  +    ZFS_DELEG_PERM_GROUPOBJQUOTA,
>  +    ZFS_DELEG_PERM_PROJECTUSED,
>  +    ZFS_DELEG_PERM_PROJECTQUOTA,
>  +    ZFS_DELEG_PERM_PROJECTOBJUSED,
>  +    ZFS_DELEG_PERM_PROJECTOBJQUOTA,
>  +};
>  +
>  +static int zfs_ioc_userspace_upgrade(zfs_cmd_t *zc);
>  +static int zfs_ioc_id_quota_upgrade(zfs_cmd_t *zc);
>  +static int zfs_check_settable(const char *name, nvpair_t *property,
>  +    cred_t *cr);
>  +static int zfs_check_clearable(const char *dataset, nvlist_t *props,
>  +    nvlist_t **errors);
>  +static int zfs_fill_zplprops_root(uint64_t, nvlist_t *, nvlist_t *,
>  +    boolean_t *);
>  +int zfs_set_prop_nvlist(const char *, zprop_source_t, nvlist_t *, nvlist_t 
> *);
>  +static int get_nvlist(uint64_t nvl, uint64_t size, int iflag, nvlist_t 
> **nvp);
>  +
>  +static void
>  +history_str_free(char *buf)
>  +{
>  +    kmem_free(buf, HIS_MAX_RECORD_LEN);
>  +}
>  +
>  +static char *
>  +history_str_get(zfs_cmd_t *zc)
>  +{
>  +    char *buf;
>  +
>  +    if (zc->zc_history == 0)
>  +            return (NULL);
>  +
>  +    buf = kmem_alloc(HIS_MAX_RECORD_LEN, KM_SLEEP);
>  +    if (copyinstr((void *)(uintptr_t)zc->zc_history,
>  +        buf, HIS_MAX_RECORD_LEN, NULL) != 0) {
>  +            history_str_free(buf);
>  +            return (NULL);
>  +    }
>  +
>  +    buf[HIS_MAX_RECORD_LEN -1] = '\0';
>  +
>  +    return (buf);
>  +}
>  +
>  +/*
>  + * Return non-zero if the spa version is less than requested version.
>  + */
>  +static int
>  +zfs_earlier_version(const char *name, int version)
>  +{
>  +    spa_t *spa;
>  +
>  +    if (spa_open(name, &spa, FTAG) == 0) {
>  +            if (spa_version(spa) < version) {
>  +                    spa_close(spa, FTAG);
>  +                    return (1);
>  +            }
>  +            spa_close(spa, FTAG);
>  +    }
>  +    return (0);
>  +}
>  +
>  +/*
>  + * Return TRUE if the ZPL version is less than requested version.
>  + */
>  +static boolean_t
>  +zpl_earlier_version(const char *name, int version)
>  +{
>  +    objset_t *os;
>  +    boolean_t rc = B_TRUE;
>  +
>  +    if (dmu_objset_hold(name, FTAG, &os) == 0) {
>  +            uint64_t zplversion;
>  +
>  +            if (dmu_objset_type(os) != DMU_OST_ZFS) {
>  +                    dmu_objset_rele(os, FTAG);
>  +                    return (B_TRUE);
>  +            }
>  +            /* XXX reading from non-owned objset */
>  +            if (zfs_get_zplprop(os, ZFS_PROP_VERSION, &zplversion) == 0)
>  +                    rc = zplversion < version;
>  +            dmu_objset_rele(os, FTAG);
>  +    }
>  +    return (rc);
>  +}
>  +
>  +static void
>  +zfs_log_history(zfs_cmd_t *zc)
>  +{
>  +    spa_t *spa;
>  +    char *buf;
>  +
>  +    if ((buf = history_str_get(zc)) == NULL)
>  +            return;
>  +
>  +    if (spa_open(zc->zc_name, &spa, FTAG) == 0) {
>  +            if (spa_version(spa) >= SPA_VERSION_ZPOOL_HISTORY)
>  +                    (void) spa_history_log(spa, buf);
>  +            spa_close(spa, FTAG);
>  +    }
>  +    history_str_free(buf);
>  +}
>  +
>  +/*
>  + * Policy for top-level read operations (list pools).  Requires no 
> privileges,
>  + * and can be used in the local zone, as there is no associated dataset.
>  + */
>  +/* ARGSUSED */
>  +static int
>  +zfs_secpolicy_none(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
>  +{
>  +    return (0);
>  +}
>  +
>  +/*
>  + * Policy for dataset read operations (list children, get statistics).  
> Requires
>  + * no privileges, but must be visible in the local zone.
>  + */
>  +/* ARGSUSED */
>  +static int
>  +zfs_secpolicy_read(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
>  +{
>  +    if (INGLOBALZONE(curproc) ||
>  +        zone_dataset_visible(zc->zc_name, NULL))
>  +            return (0);
>  +
>  +    return (SET_ERROR(ENOENT));
>  +}
>  +
>  +static int
>  +zfs_dozonecheck_impl(const char *dataset, uint64_t zoned, cred_t *cr)
>  +{
>  +    int writable = 1;
>  +
>  +    /*
>  +     * The dataset must be visible by this zone -- check this first
>  +     * so they don't see EPERM on something they shouldn't know about.
>  +     */
>  +    if (!INGLOBALZONE(curproc) &&
>  +        !zone_dataset_visible(dataset, &writable))
>  +            return (SET_ERROR(ENOENT));
>  +
>  +    if (INGLOBALZONE(curproc)) {
>  +            /*
>  +             * If the fs is zoned, only root can access it from the
>  +             * global zone.
>  +             */
>  +            if (secpolicy_zfs(cr) && zoned)
>  +                    return (SET_ERROR(EPERM));
>  +    } else {
>  +            /*
>  +             * If we are in a local zone, the 'zoned' property must be set.
>  +             */
>  +            if (!zoned)
>  +                    return (SET_ERROR(EPERM));
>  +
>  +            /* must be writable by this zone */
>  +            if (!writable)
>  +                    return (SET_ERROR(EPERM));
>  +    }
>  +    return (0);
>  +}
>  +
>  +static int
>  +zfs_dozonecheck(const char *dataset, cred_t *cr)
>  +{
>  +    uint64_t zoned;
>  +
>  +    if (dsl_prop_get_integer(dataset, zfs_prop_to_name(ZFS_PROP_ZONED),
>  +        &zoned, NULL))
>  +            return (SET_ERROR(ENOENT));
>  +
>  +    return (zfs_dozonecheck_impl(dataset, zoned, cr));
>  +}
>  +
>  +static int
>  +zfs_dozonecheck_ds(const char *dataset, dsl_dataset_t *ds, cred_t *cr)
>  +{
>  +    uint64_t zoned;
>  +
>  +    if (dsl_prop_get_int_ds(ds, zfs_prop_to_name(ZFS_PROP_ZONED), &zoned))
>  +            return (SET_ERROR(ENOENT));
>  +
>  +    return (zfs_dozonecheck_impl(dataset, zoned, cr));
>  +}
>  +
>  +static int
>  +zfs_secpolicy_write_perms_ds(const char *name, dsl_dataset_t *ds,
>  +    const char *perm, cred_t *cr)
>  +{
>  +    int error;
>  +
>  +    error = zfs_dozonecheck_ds(name, ds, cr);
>  +    if (error == 0) {
>  +            error = secpolicy_zfs(cr);
>  +            if (error != 0)
>  +                    error = dsl_deleg_access_impl(ds, perm, cr);
>  +    }
>  +    return (error);
>  +}
>  +
>  +static int
>  +zfs_secpolicy_write_perms(const char *name, const char *perm, cred_t *cr)
>  +{
>  +    int error;
>  +    dsl_dataset_t *ds;
>  +    dsl_pool_t *dp;
>  +
>  +    /*
>  +     * First do a quick check for root in the global zone, which
>  +     * is allowed to do all write_perms.  This ensures that zfs_ioc_*
>  +     * will get to handle nonexistent datasets.
>  +     */
>  +    if (INGLOBALZONE(curproc) && secpolicy_zfs(cr) == 0)
>  +            return (0);
>  +
>  +    error = dsl_pool_hold(name, FTAG, &dp);
>  +    if (error != 0)
>  +            return (error);
>  +
>  +    error = dsl_dataset_hold(dp, name, FTAG, &ds);
>  +    if (error != 0) {
>  +            dsl_pool_rele(dp, FTAG);
>  +            return (error);
>  +    }
>  +
>  +    error = zfs_secpolicy_write_perms_ds(name, ds, perm, cr);
>  +
>  +    dsl_dataset_rele(ds, FTAG);
>  +    dsl_pool_rele(dp, FTAG);
>  +    return (error);
>  +}
>  +
>  +/*
>  + * Policy for setting the security label property.
>  + *
>  + * Returns 0 for success, non-zero for access and other errors.
>  + */
>  +static int
>  +zfs_set_slabel_policy(const char *name, const char *strval, cred_t *cr)
>  +{
>  +#ifdef HAVE_MLSLABEL
>  +    char            ds_hexsl[MAXNAMELEN];
>  +    bslabel_t       ds_sl, new_sl;
>  +    boolean_t       new_default = FALSE;
>  +    uint64_t        zoned;
>  +    int             needed_priv = -1;
>  +    int             error;
>  +
>  +    /* First get the existing dataset label. */
>  +    error = dsl_prop_get(name, zfs_prop_to_name(ZFS_PROP_MLSLABEL),
>  +        1, sizeof (ds_hexsl), &ds_hexsl, NULL);
>  +    if (error != 0)
>  +            return (SET_ERROR(EPERM));
>  +
>  +    if (strcasecmp(strval, ZFS_MLSLABEL_DEFAULT) == 0)
>  +            new_default = TRUE;
>  +
>  +    /* The label must be translatable */
>  +    if (!new_default && (hexstr_to_label(strval, &new_sl) != 0))
>  +            return (SET_ERROR(EINVAL));
>  +
>  +    /*
>  +     * In a non-global zone, disallow attempts to set a label that
>  +     * doesn't match that of the zone; otherwise no other checks
>  +     * are needed.
>  +     */
>  +    if (!INGLOBALZONE(curproc)) {
>  +            if (new_default || !blequal(&new_sl, CR_SL(CRED())))
>  +                    return (SET_ERROR(EPERM));
>  +            return (0);
>  +    }
>  +
>  +    /*
>  +     * For global-zone datasets (i.e., those whose zoned property is
>  +     * "off", verify that the specified new label is valid for the
>  +     * global zone.
>  +     */
>  +    if (dsl_prop_get_integer(name,
>  +        zfs_prop_to_name(ZFS_PROP_ZONED), &zoned, NULL))
>  +            return (SET_ERROR(EPERM));
>  +    if (!zoned) {
>  +            if (zfs_check_global_label(name, strval) != 0)
>  +                    return (SET_ERROR(EPERM));
>  +    }
>  +
>  +    /*
>  +     * If the existing dataset label is nondefault, check if the
>  +     * dataset is mounted (label cannot be changed while mounted).
>  +     * Get the zfsvfs_t; if there isn't one, then the dataset isn't
>  +     * mounted (or isn't a dataset, doesn't exist, ...).
>  +     */
>  +    if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) != 0) {
>  +            objset_t *os;
>  +            static const char *setsl_tag = "setsl_tag";
>  +
>  +            /*
>  +             * Try to own the dataset; abort if there is any error,
>  +             * (e.g., already mounted, in use, or other error).
>  +             */
>  +            error = dmu_objset_own(name, DMU_OST_ZFS, B_TRUE, B_TRUE,
>  +                setsl_tag, &os);
>  +            if (error != 0)
>  +                    return (SET_ERROR(EPERM));
>  +
>  +            dmu_objset_disown(os, B_TRUE, setsl_tag);
>  +
>  +            if (new_default) {
>  +                    needed_priv = PRIV_FILE_DOWNGRADE_SL;
> *** 13292 LINES SKIPPED ***
> _______________________________________________
> dev-commits-src-main@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
> To unsubscribe, send any mail to 
> "dev-commits-src-main-unsubscr...@freebsd.org"

On FreeBSD 14-CURRENT, with ZFS statically builtin the kernel, this commit 
renders "make
buildkernel" to fail:

[...]

===> cam (all)
- --- kernel ---
ld: error: undefined symbol: zfs_racct_read
>>> referenced by arc.c
>>>               arc.o:(arc_read)
- --- modules-all ---
- --- all_subdir_cardbus ---
===> cardbus (all)
- --- kernel ---

ld: error: undefined symbol: zfs_racct_write
>>> referenced by dmu.c
>>>               dmu.o:(dmu_buf_hold_array_by_dnode)
>>> referenced by dmu.c
>>>               dmu.o:(dmu_assign_arcbuf_by_dnode)
*** [kernel] Error code 1

make[2]: stopped in /usr/obj/usr/src/amd64.amd64/sys/CURRENT14
- --- modules-all ---
*** [modules-all] Error code 6



- -- 
O. Hartmann

Ich widerspreche der Nutzung oder Übermittlung meiner Daten für
Werbezwecke oder für die Markt- oder Meinungsforschung (§ 28 Abs. 4 BDSG).
-----BEGIN PGP SIGNATURE-----

iHUEARYIAB0WIQSy8IBxAPDkqVBaTJ44N1ZZPba5RwUCYDO5RgAKCRA4N1ZZPba5
Rz4/AQDhhbsIWQYZ3ZgrMfzSs0m410Cpvo5mzOU1yIH3PIXJ1AD/bUPx/RUhEuYX
17WmQR5+uuUL9w1/rTNWps5baPHmaAw=
=7igt
-----END PGP SIGNATURE-----
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to