mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-06 16:40:47 +00:00
zfs: merge openzfs/zfs@431083f75
Notable upstream pull request merges: #12194 Fix short-lived txg caused by autotrim #13368 ZFS_IOC_COUNT_FILLED does unnecessary txg_wait_synced() #13392 Implementation of block cloning for ZFS #13741 SHA2 reworking and API for iterating over multiple implementations #14282 Sync thread should avoid holding the spa config write lock when possible #14283 txg_sync should handle write errors in ZIL #14359 More adaptive ARC eviction #14469 Fix NULL pointer dereference in zio_ready() #14479 zfs redact fails when dnodesize=auto #14496 improve error message of zfs redact #14500 Skip memory allocation when compressing holes #14501 FreeBSD: don't verify recycled vnode for zfs control directory #14502 partially revert PR 14304 (eee9362a7
) #14509 Fix per-jail zfs.mount_snapshot setting #14514 Fix data race between zil_commit() and zil_suspend() #14516 System-wide speculative prefetch limit #14517 Use rw_tryupgrade() in dmu_bonus_hold_by_dnode() #14519 Do not hold spa_config in ZIL while blocked on IO #14523 Move dmu_buf_rele() after dsl_dataset_sync_done() #14524 Ignore too large stack in case of dsl_deadlist_merge #14526 Use .section .rodata instead of .rodata on FreeBSD #14528 ICP: AES-GCM: Refactor gcm_clear_ctx() #14529 ICP: AES-GCM: Unify gcm_init_ctx() and gmac_init_ctx() #14532 Handle unexpected errors in zil_lwb_commit() without ASSERT() #14544 icp: Prevent compilers from optimizing away memset() in gcm_clear_ctx() #14546 Revert zfeature_active() to static #14556 Remove bad kmem_free() oversight from previous zfsdev_state_list patch #14563 Optimize the is_l2cacheable functions #14565 FreeBSD: zfs_znode_alloc: lock the vnode earlier #14566 FreeBSD: fix false assert in cache_vop_rmdir when replaying ZIL #14567 spl: Add cmn_err_once() to log a message only on the first call #14568 Fix incremental receive silently failing for recursive sends #14569 Restore ASMABI and other Unify work #14576 Fix detection of IBM Power8 machines (ISA 2.07) #14577 Better handling for future crypto parameters #14600 zcommon: Refactor FPU state handling in fletcher4 #14603 Fix prefetching of indirect blocks while destroying #14633 Fixes in persistent error log #14639 FreeBSD: Remove extra arc_reduce_target_size() call #14641 Additional limits on hole reporting #14649 Drop lying to the compiler in the fletcher4 code #14652 panic loop when removing slog device #14653 Update vdev state for spare vdev #14655 Fix cloning into already dirty dbufs #14678 Revert "Do not hold spa_config in ZIL while blocked on IO" Obtained from: OpenZFS OpenZFS commit:431083f75b
This commit is contained in:
commit
2a58b312b6
|
@ -6,7 +6,6 @@ PACKAGE= zfs
|
|||
LIB= icp
|
||||
LIBADD=
|
||||
|
||||
|
||||
.if ${MACHINE_ARCH} == "amd64"
|
||||
ASM_SOURCES_C = asm-x86_64/aes/aeskey.c
|
||||
ASM_SOURCES_AS = \
|
||||
|
@ -15,30 +14,47 @@ ASM_SOURCES_AS = \
|
|||
asm-x86_64/modes/gcm_pclmulqdq.S \
|
||||
asm-x86_64/modes/aesni-gcm-x86_64.S \
|
||||
asm-x86_64/modes/ghash-x86_64.S \
|
||||
asm-x86_64/sha2/sha256_impl.S \
|
||||
asm-x86_64/sha2/sha512_impl.S \
|
||||
asm-x86_64/sha2/sha256-x86_64.S \
|
||||
asm-x86_64/sha2/sha512-x86_64.S \
|
||||
asm-x86_64/blake3/blake3_avx2.S \
|
||||
asm-x86_64/blake3/blake3_avx512.S \
|
||||
asm-x86_64/blake3/blake3_sse2.S \
|
||||
asm-x86_64/blake3/blake3_sse41.S
|
||||
|
||||
CFLAGS+= -D__amd64 -D_SYS_STACK_H -UHAVE_AES
|
||||
.elif ${MACHINE_ARCH} == "armv7"
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS = \
|
||||
asm-arm/sha2/sha256-armv7.S \
|
||||
asm-arm/sha2/sha512-armv7.S
|
||||
.elif ${MACHINE_ARCH} == "aarch64"
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS = \
|
||||
asm-aarch64/blake3/b3_aarch64_sse2.S \
|
||||
asm-aarch64/blake3/b3_aarch64_sse41.S
|
||||
asm-aarch64/blake3/b3_aarch64_sse41.S \
|
||||
asm-aarch64/sha2/sha256-armv8.S \
|
||||
asm-aarch64/sha2/sha512-armv8.S
|
||||
.elif ${MACHINE_ARCH} == "powerpc64"
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS = \
|
||||
asm-ppc64/sha2/sha256-ppc.S \
|
||||
asm-ppc64/sha2/sha512-ppc.S \
|
||||
asm-ppc64/sha2/sha256-p8.S \
|
||||
asm-ppc64/sha2/sha512-p8.S
|
||||
.elif ${MACHINE_ARCH} == "powerpc64le"
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS = \
|
||||
asm-ppc64/blake3/b3_ppc64le_sse2.S \
|
||||
asm-ppc64/blake3/b3_ppc64le_sse41.S
|
||||
asm-ppc64/blake3/b3_ppc64le_sse41.S \
|
||||
asm-ppc64/sha2/sha256-ppc.S \
|
||||
asm-ppc64/sha2/sha512-ppc.S \
|
||||
asm-ppc64/sha2/sha256-p8.S \
|
||||
asm-ppc64/sha2/sha512-p8.S
|
||||
.else
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS =
|
||||
.endif
|
||||
|
||||
|
||||
KERNEL_C = \
|
||||
spi/kcf_spi.c \
|
||||
api/kcf_ctxops.c \
|
||||
|
@ -52,7 +68,6 @@ KERNEL_C = \
|
|||
algs/blake3/blake3.c \
|
||||
algs/blake3/blake3_generic.c \
|
||||
algs/blake3/blake3_impl.c \
|
||||
algs/blake3/blake3_x86-64.c \
|
||||
algs/edonr/edonr.c \
|
||||
algs/modes/modes.c \
|
||||
algs/modes/cbc.c \
|
||||
|
@ -62,7 +77,9 @@ KERNEL_C = \
|
|||
algs/modes/ctr.c \
|
||||
algs/modes/ccm.c \
|
||||
algs/modes/ecb.c \
|
||||
algs/sha2/sha2.c \
|
||||
algs/sha2/sha2_generic.c \
|
||||
algs/sha2/sha256_impl.c \
|
||||
algs/sha2/sha512_impl.c \
|
||||
algs/skein/skein.c \
|
||||
algs/skein/skein_block.c \
|
||||
algs/skein/skein_iv.c \
|
||||
|
@ -77,10 +94,8 @@ KERNEL_C = \
|
|||
core/kcf_prov_tabs.c \
|
||||
$(ASM_SOURCES_C)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.PATH: ${SRCTOP}/sys/contrib/openzfs/module/zfs
|
||||
KERNEL_C+= zfs_impl.c
|
||||
|
||||
SRCS= $(ASM_SOURCES_AS) $(KERNEL_C)
|
||||
|
||||
|
@ -98,22 +113,29 @@ CFLAGS+= -include ${SRCTOP}/sys/contrib/openzfs/include/os/freebsd/spl/sys/ccomp
|
|||
CFLAGS+= -DHAVE_ISSETUGID
|
||||
CFLAGS+= -include ${SRCTOP}/sys/modules/zfs/zfs_config.h
|
||||
|
||||
|
||||
CFLAGS.aes_amd64.S+= -DLOCORE
|
||||
CFLAGS.aes_aesni.S+= -DLOCORE
|
||||
CFLAGS.gcm_pclmulqdq.S+= -DLOCORE
|
||||
CFLAGS.aesni-gcm-x86_64.S+= -DLOCORE
|
||||
CFLAGS.ghash-x86_64.S+= -DLOCORE
|
||||
CFLAGS.sha256_impl.S+= -DLOCORE
|
||||
CFLAGS.sha512_impl.S+= -DLOCORE
|
||||
CFLAGS.sha256-x86_64.S+= -DLOCORE
|
||||
CFLAGS.sha512-x86_64.S+= -DLOCORE
|
||||
CFLAGS.blake3_avx2.S = -DLOCORE
|
||||
CFLAGS.blake3_avx512.S = -DLOCORE
|
||||
CFLAGS.blake3_sse2.S = -DLOCORE
|
||||
CFLAGS.blake3_sse41.S = -DLOCORE
|
||||
CFLAGS.b3_aarch64_sse2.S = -DLOCORE
|
||||
CFLAGS.b3_aarch64_sse41.S = -DLOCORE
|
||||
CFLAGS.sha256-armv7.S = -DLOCORE
|
||||
CFLAGS.sha256-armv8.S = -DLOCORE
|
||||
CFLAGS.sha512-armv7.S = -DLOCORE
|
||||
CFLAGS.sha512-armv8.S = -DLOCORE
|
||||
CFLAGS.b3_ppc64le_sse2.S = -DLOCORE
|
||||
CFLAGS.b3_ppc64le_sse41.S = -DLOCORE
|
||||
CFLAGS.sha256-p8.S = -DLOCORE
|
||||
CFLAGS.sha256-ppc.S = -DLOCORE
|
||||
CFLAGS.sha512-p8.S = -DLOCORE
|
||||
CFLAGS.sha512-ppc.S = -DLOCORE
|
||||
|
||||
|
||||
LDFLAGS.bfd+= -Wl,-znoexecstack
|
||||
|
|
|
@ -6,7 +6,6 @@ PACKAGE= utilities
|
|||
LIB= icp_rescue
|
||||
LIBADD=
|
||||
|
||||
|
||||
.if ${MACHINE_ARCH} == "amd64"
|
||||
ASM_SOURCES_C = asm-x86_64/aes/aeskey.c
|
||||
ASM_SOURCES_AS = \
|
||||
|
@ -14,30 +13,47 @@ ASM_SOURCES_AS = \
|
|||
asm-x86_64/aes/aes_aesni.S \
|
||||
asm-x86_64/modes/gcm_pclmulqdq.S \
|
||||
asm-x86_64/modes/aesni-gcm-x86_64.S \
|
||||
asm-x86_64/sha2/sha256_impl.S \
|
||||
asm-x86_64/sha2/sha512_impl.S \
|
||||
asm-x86_64/sha2/sha256-x86_64.S \
|
||||
asm-x86_64/sha2/sha512-x86_64.S \
|
||||
asm-x86_64/blake3/blake3_avx2.S \
|
||||
asm-x86_64/blake3/blake3_avx512.S \
|
||||
asm-x86_64/blake3/blake3_sse2.S \
|
||||
asm-x86_64/blake3/blake3_sse41.S
|
||||
|
||||
CFLAGS+= -D__amd64 -D_SYS_STACK_H
|
||||
.elif ${MACHINE_ARCH} == "armv7"
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS = \
|
||||
asm-arm/sha2/sha256-armv7.S \
|
||||
asm-arm/sha2/sha512-armv7.S
|
||||
.elif ${MACHINE_ARCH} == "aarch64"
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS = \
|
||||
asm-aarch64/blake3/b3_aarch64_sse2.S \
|
||||
asm-aarch64/blake3/b3_aarch64_sse41.S
|
||||
asm-aarch64/blake3/b3_aarch64_sse41.S \
|
||||
asm-aarch64/sha2/sha256-armv8.S \
|
||||
asm-aarch64/sha2/sha512-armv8.S
|
||||
.elif ${MACHINE_ARCH} == "powerpc64"
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS = \
|
||||
asm-ppc64/sha2/sha256-ppc.S \
|
||||
asm-ppc64/sha2/sha512-ppc.S \
|
||||
asm-ppc64/sha2/sha256-p8.S \
|
||||
asm-ppc64/sha2/sha512-p8.S
|
||||
.elif ${MACHINE_ARCH} == "powerpc64le"
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS = \
|
||||
asm-ppc64/blake3/b3_ppc64le_sse2.S \
|
||||
asm-ppc64/blake3/b3_ppc64le_sse41.S
|
||||
asm-ppc64/blake3/b3_ppc64le_sse41.S \
|
||||
asm-ppc64/sha2/sha256-ppc.S \
|
||||
asm-ppc64/sha2/sha512-ppc.S \
|
||||
asm-ppc64/sha2/sha256-p8.S \
|
||||
asm-ppc64/sha2/sha512-p8.S
|
||||
.else
|
||||
ASM_SOURCES_C =
|
||||
ASM_SOURCES_AS =
|
||||
.endif
|
||||
|
||||
|
||||
KERNEL_C = \
|
||||
spi/kcf_spi.c \
|
||||
api/kcf_ctxops.c \
|
||||
|
@ -51,7 +67,6 @@ KERNEL_C = \
|
|||
algs/blake3/blake3.c \
|
||||
algs/blake3/blake3_generic.c \
|
||||
algs/blake3/blake3_impl.c \
|
||||
algs/blake3/blake3_x86-64.c \
|
||||
algs/edonr/edonr.c \
|
||||
algs/modes/modes.c \
|
||||
algs/modes/cbc.c \
|
||||
|
@ -61,7 +76,9 @@ KERNEL_C = \
|
|||
algs/modes/ctr.c \
|
||||
algs/modes/ccm.c \
|
||||
algs/modes/ecb.c \
|
||||
algs/sha2/sha2.c \
|
||||
algs/sha2/sha2_generic.c \
|
||||
algs/sha2/sha256_impl.c \
|
||||
algs/sha2/sha512_impl.c \
|
||||
algs/skein/skein_block.c \
|
||||
illumos-crypto.c \
|
||||
io/aes.c \
|
||||
|
@ -74,6 +91,9 @@ KERNEL_C = \
|
|||
core/kcf_prov_tabs.c \
|
||||
$(ASM_SOURCES_C)
|
||||
|
||||
.PATH: ${SRCTOP}/sys/contrib/openzfs/module/zfs
|
||||
KERNEL_C+= zfs_impl.c
|
||||
|
||||
SRCS= $(ASM_SOURCES_AS) $(KERNEL_C)
|
||||
|
||||
WARNS?= 2
|
||||
|
@ -90,14 +110,13 @@ CFLAGS+= -include ${SRCTOP}/sys/contrib/openzfs/include/os/freebsd/spl/sys/ccomp
|
|||
CFLAGS+= -DHAVE_ISSETUGID -UHAVE_AVX -DRESCUE
|
||||
CFLAGS+= -include ${SRCTOP}/sys/modules/zfs/zfs_config.h
|
||||
|
||||
|
||||
CFLAGS.aes_amd64.S+= -DLOCORE
|
||||
CFLAGS.aes_aesni.S+= -DLOCORE
|
||||
CFLAGS.gcm_pclmulqdq.S+= -DLOCORE
|
||||
CFLAGS.aesni-gcm-x86_64.S+= -DLOCORE
|
||||
CFLAGS.ghash-x86_64.S+= -DLOCORE
|
||||
CFLAGS.sha256_impl.S+= -DLOCORE
|
||||
CFLAGS.sha512_impl.S+= -DLOCORE
|
||||
CFLAGS.sha256-x86_64.S+= -DLOCORE
|
||||
CFLAGS.sha512-x86_64.S+= -DLOCORE
|
||||
CFLAGS.gcm.c+= -UCAN_USE_GCM_ASM
|
||||
CFLAGS.blake3_avx2.S = -DLOCORE
|
||||
CFLAGS.blake3_avx512.S = -DLOCORE
|
||||
|
@ -105,9 +124,16 @@ CFLAGS.blake3_sse2.S = -DLOCORE
|
|||
CFLAGS.blake3_sse41.S = -DLOCORE
|
||||
CFLAGS.b3_aarch64_sse2.S = -DLOCORE
|
||||
CFLAGS.b3_aarch64_sse41.S = -DLOCORE
|
||||
CFLAGS.sha256-armv7.S = -DLOCORE
|
||||
CFLAGS.sha512-armv7.S = -DLOCORE
|
||||
CFLAGS.sha256-armv8.S = -DLOCORE
|
||||
CFLAGS.sha512-armv8.S = -DLOCORE
|
||||
CFLAGS.b3_ppc64le_sse2.S = -DLOCORE
|
||||
CFLAGS.b3_ppc64le_sse41.S = -DLOCORE
|
||||
|
||||
CFLAGS.sha256-ppc.S = -DLOCORE
|
||||
CFLAGS.sha256-p8.S = -DLOCORE
|
||||
CFLAGS.sha512-ppc.S = -DLOCORE
|
||||
CFLAGS.sha512-p8.S = -DLOCORE
|
||||
|
||||
LDFLAGS.bfd+= -Wl,-znoexecstack
|
||||
|
||||
|
|
|
@ -55,7 +55,6 @@ USER_C += \
|
|||
os/freebsd/smb.c
|
||||
|
||||
KERNEL_C = \
|
||||
algs/sha2/sha2.c \
|
||||
cityhash.c \
|
||||
zfeature_common.c \
|
||||
zfs_comutil.c \
|
||||
|
|
|
@ -62,8 +62,9 @@ KERNEL_C = \
|
|||
bplist.c \
|
||||
bpobj.c \
|
||||
bptree.c \
|
||||
btree.c \
|
||||
bqueue.c \
|
||||
btree.c \
|
||||
brt.c \
|
||||
cityhash.c \
|
||||
dbuf.c \
|
||||
dbuf_stats.c \
|
||||
|
@ -117,7 +118,7 @@ KERNEL_C = \
|
|||
refcount.c \
|
||||
rrwlock.c \
|
||||
sa.c \
|
||||
sha256.c \
|
||||
sha2_zfs.c \
|
||||
skein_zfs.c \
|
||||
spa.c \
|
||||
spa_checkpoint.c \
|
||||
|
|
|
@ -24,7 +24,7 @@ CFLAGS+= \
|
|||
-include ${ZFSTOP}/include/os/freebsd/spl/sys/ccompile.h \
|
||||
-DHAVE_ISSETUGID
|
||||
|
||||
LIBADD= nvpair umem uutil zfs spl avl zutil zpool
|
||||
LIBADD= nvpair umem uutil zfs spl avl zutil zpool crypto
|
||||
|
||||
CFLAGS.gcc+= -fms-extensions
|
||||
# Since there are many asserts in this program, it makes no sense to compile
|
||||
|
|
|
@ -490,8 +490,7 @@ bool
|
|||
CaseFile::ActivateSpare() {
|
||||
nvlist_t *config, *nvroot, *parent_config;
|
||||
nvlist_t **spares;
|
||||
char *devPath, *vdev_type;
|
||||
const char *poolname;
|
||||
const char *devPath, *poolname, *vdev_type;
|
||||
u_int nspares, i;
|
||||
int error;
|
||||
|
||||
|
@ -518,7 +517,7 @@ CaseFile::ActivateSpare() {
|
|||
|
||||
parent_config = find_parent(config, nvroot, m_vdevGUID);
|
||||
if (parent_config != NULL) {
|
||||
char *parent_type;
|
||||
const char *parent_type;
|
||||
|
||||
/*
|
||||
* Don't activate spares for members of a "replacing" vdev.
|
||||
|
|
|
@ -336,7 +336,7 @@ Vdev::Name(zpool_handle_t *zhp, bool verbose) const
|
|||
string
|
||||
Vdev::Path() const
|
||||
{
|
||||
char *path(NULL);
|
||||
const char *path(NULL);
|
||||
|
||||
if ((m_config != NULL)
|
||||
&& (nvlist_lookup_string(m_config, ZPOOL_CONFIG_PATH, &path) == 0))
|
||||
|
@ -348,7 +348,7 @@ Vdev::Path() const
|
|||
string
|
||||
Vdev::PhysicalPath() const
|
||||
{
|
||||
char *path(NULL);
|
||||
const char *path(NULL);
|
||||
|
||||
if ((m_config != NULL) && (nvlist_lookup_string(m_config,
|
||||
ZPOOL_CONFIG_PHYS_PATH, &path) == 0))
|
||||
|
|
|
@ -106,7 +106,7 @@ ZfsdException::Log() const
|
|||
|
||||
output << "Pool ";
|
||||
|
||||
char *poolName;
|
||||
const char *poolName;
|
||||
if (nvlist_lookup_string(m_poolConfig, ZPOOL_CONFIG_POOL_NAME,
|
||||
&poolName) == 0)
|
||||
output << poolName;
|
||||
|
|
|
@ -237,7 +237,7 @@ be_dependent_clone_cb(zfs_handle_t *zfs_hdl, void *data)
|
|||
{
|
||||
int err;
|
||||
bool found;
|
||||
char *name;
|
||||
const char *name;
|
||||
struct nvlist *nvl;
|
||||
struct nvpair *nvp;
|
||||
struct be_destroy_data *bdd;
|
||||
|
@ -1260,7 +1260,7 @@ be_activate(libbe_handle_t *lbh, const char *bootenv, bool temporary)
|
|||
{
|
||||
char be_path[BE_MAXPATHLEN];
|
||||
nvlist_t *dsprops;
|
||||
char *origin;
|
||||
const char *origin;
|
||||
zfs_handle_t *zhp;
|
||||
int err;
|
||||
|
||||
|
|
|
@ -362,7 +362,8 @@ static int
|
|||
bectl_cmd_destroy(int argc, char *argv[])
|
||||
{
|
||||
nvlist_t *props;
|
||||
char *origin, *target, targetds[BE_MAXPATHLEN];
|
||||
char *target, targetds[BE_MAXPATHLEN];
|
||||
const char *origin;
|
||||
int err, flags, opt;
|
||||
|
||||
flags = 0;
|
||||
|
@ -584,13 +585,9 @@ main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
if ((be = libbe_init(root)) == NULL) {
|
||||
if (!cmd->silent) {
|
||||
if (!cmd->silent)
|
||||
fprintf(stderr, "libbe_init(\"%s\") failed.\n",
|
||||
root != NULL ? root : "");
|
||||
if (root == NULL)
|
||||
fprintf(stderr,
|
||||
"Try specifying ZFS root using -r.\n");
|
||||
}
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
|
|
@ -133,7 +133,8 @@ jailparam_delarg(char *arg)
|
|||
static int
|
||||
build_jailcmd(char ***argvp, bool interactive, int argc, char *argv[])
|
||||
{
|
||||
char *cmd, **jargv, *name, *val;
|
||||
char *cmd, **jargv;
|
||||
const char *name, *val;
|
||||
nvpair_t *nvp;
|
||||
size_t i, iarg, nargv;
|
||||
|
||||
|
@ -404,7 +405,7 @@ static int
|
|||
bectl_locate_jail(const char *ident)
|
||||
{
|
||||
nvlist_t *belist, *props;
|
||||
char *mnt;
|
||||
const char *mnt;
|
||||
int jid;
|
||||
|
||||
/* Try the easy-match first */
|
||||
|
|
|
@ -39,8 +39,8 @@ __FBSDID("$FreeBSD$");
|
|||
#include "bectl.h"
|
||||
|
||||
struct sort_column {
|
||||
char *name;
|
||||
char *val;
|
||||
const char *name;
|
||||
const char *val;
|
||||
nvlist_t *nvl;
|
||||
};
|
||||
|
||||
|
@ -80,7 +80,7 @@ static unsigned long long dataset_space(const char *oname);
|
|||
static const char *
|
||||
get_origin_props(nvlist_t *dsprops, nvlist_t **originprops)
|
||||
{
|
||||
char *propstr;
|
||||
const char *propstr;
|
||||
|
||||
if (nvlist_lookup_string(dsprops, "origin", &propstr) == 0) {
|
||||
if (be_prop_list_alloc(originprops) != 0) {
|
||||
|
@ -119,7 +119,8 @@ static unsigned long long
|
|||
dataset_space(const char *oname)
|
||||
{
|
||||
unsigned long long space;
|
||||
char *dsname, *propstr, *sep;
|
||||
char *dsname, *sep;
|
||||
const char *propstr;
|
||||
nvlist_t *dsprops;
|
||||
|
||||
space = 0;
|
||||
|
@ -179,8 +180,7 @@ print_info(const char *name, nvlist_t *dsprops, struct printc *pc)
|
|||
char buf[BUFSZ];
|
||||
unsigned long long ctimenum, space;
|
||||
nvlist_t *originprops;
|
||||
const char *oname;
|
||||
char *dsname, *propstr;
|
||||
const char *oname, *dsname, *propstr;
|
||||
int active_colsz;
|
||||
boolean_t active_now, active_reboot, bootonce;
|
||||
|
||||
|
@ -293,10 +293,9 @@ print_info(const char *name, nvlist_t *dsprops, struct printc *pc)
|
|||
static void
|
||||
print_headers(nvlist_t *props, struct printc *pc)
|
||||
{
|
||||
const char *chosen_be_header;
|
||||
const char *chosen_be_header, *propstr;
|
||||
nvpair_t *cur;
|
||||
nvlist_t *dsprops;
|
||||
char *propstr;
|
||||
size_t be_maxcol, mount_colsz;
|
||||
|
||||
if (pc->show_all_datasets || pc->show_snaps)
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
.PATH: ${OZFS}/module/zstd/lib/common
|
||||
.PATH: ${OZFS}/module/zstd/lib/compress
|
||||
.PATH: ${OZFS}/module/zstd/lib/decompress
|
||||
.PATH: ${OZFS}/module/icp/asm-aarch64/blake3
|
||||
.PATH: ${OZFS}/module/icp/algs/blake3
|
||||
ZFS_SRC= zfs.c nvlist.c skein.c skein_block.c list.c
|
||||
ZFS_SRC+= zfs_zstd.c
|
||||
|
@ -18,7 +19,11 @@ ZSTD_SRC+= zstd_common.c
|
|||
ZSTD_SRC+= zstd_ddict.c zstd_decompress.c zstd_decompress_block.c
|
||||
ZSTD_SRC+= zstd_double_fast.c zstd_fast.c zstd_lazy.c zstd_ldm.c
|
||||
|
||||
SRCS+= ${ZFS_SRC} ${ZSTD_SRC}
|
||||
.if ${MACHINE_ARCH} == "aarch64"
|
||||
ZFS_SRC_AS = b3_aarch64_sse2.S b3_aarch64_sse41.S
|
||||
.endif
|
||||
|
||||
SRCS+= ${ZFS_SRC} ${ZSTD_SRC} ${ZFS_SRC_AS}
|
||||
|
||||
#
|
||||
# Any file that needs the FreeBSD overrides that are in
|
||||
|
@ -67,6 +72,9 @@ CFLAGS.zfs.c+= -DHAS_ZSTD_ZFS \
|
|||
-I${SYSDIR}/crypto/skein \
|
||||
-I${SRCTOP}/sys/cddl/contrib/opensolaris/common/lz4
|
||||
|
||||
.for i in ${ZFS_SRC_AS}
|
||||
CFLAGS.$i+= -DLOCORE
|
||||
.endfor
|
||||
#
|
||||
# ZSTD coding style has some issues, so suppress clang's warnings. Also, zstd's
|
||||
# use of BMI instrucitons is broken in this environment, so avoid them.
|
||||
|
@ -82,6 +90,16 @@ CFLAGS.skein_block.c+= -DSKEIN_LOOP=111
|
|||
|
||||
# To find blake3_impl.c in OpenZFS tree for our somehat ugly blake3_impl_hack.c
|
||||
# that's needed until the necessary tweaks can be upstreamed.
|
||||
CFLAGS.blake3_impl_hack.c+= -I${OZFS}/module/icp/algs/blake3
|
||||
CFLAGS.blake3_impl_hack.c+= -I${OZFS}/module/icp/algs/blake3 -I${OZFS}/module/icp/include
|
||||
|
||||
CWARNFLAGS.zfs.c+= ${NO_WDANGLING_POINTER}
|
||||
|
||||
b3_aarch64_sse2.o: b3_aarch64_sse2.S
|
||||
${CC} -c ${CFLAGS:N-mgeneral-regs-only} ${WERROR} ${.IMPSRC} \
|
||||
-o ${.TARGET}
|
||||
${CTFCONVERT_CMD}
|
||||
|
||||
b3_aarch64_sse41.o: b3_aarch64_sse41.S
|
||||
${CC} -c ${CFLAGS:N-mgeneral-regs-only} ${WERROR} ${.IMPSRC} \
|
||||
-o ${.TARGET}
|
||||
${CTFCONVERT_CMD}
|
||||
|
|
|
@ -17,6 +17,7 @@ static __inline int isspace(int c)
|
|||
|
||||
#include "blake3_impl.c"
|
||||
|
||||
/*
|
||||
static inline boolean_t blake3_is_not_supported(void)
|
||||
{
|
||||
return (B_FALSE);
|
||||
|
@ -33,3 +34,4 @@ const blake3_ops_t blake3_sse41_impl = {
|
|||
.degree = 4,
|
||||
.name = "fakesse41"
|
||||
};
|
||||
*/
|
||||
|
|
|
@ -147,15 +147,16 @@ contrib/openzfs/module/os/freebsd/spl/spl_acl.c optional zfs compile-with "${ZF
|
|||
contrib/openzfs/module/os/freebsd/spl/spl_dtrace.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_kstat.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_policy.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_procfs_list.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_string.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_sunddi.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_sysevent.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_uio.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_vfs.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_vm.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_zone.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_procfs_list.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_zlib.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/os/freebsd/spl/spl_zone.c optional zfs compile-with "${ZFS_C}"
|
||||
|
||||
|
||||
|
||||
# zfs specific
|
||||
|
@ -246,7 +247,11 @@ contrib/openzfs/module/icp/algs/edonr/edonr.c optional zfs compile-with "${ZFS_
|
|||
contrib/openzfs/module/icp/algs/blake3/blake3.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/icp/algs/blake3/blake3_generic.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/icp/algs/blake3/blake3_impl.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/icp/algs/blake3/blake3_x86-64.c optional zfs compile-with "${ZFS_C}"
|
||||
|
||||
# zfs sha2 hash support
|
||||
contrib/openzfs/module/icp/algs/sha2/sha2_generic.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/icp/algs/sha2/sha256_impl.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/icp/algs/sha2/sha512_impl.c optional zfs compile-with "${ZFS_C}"
|
||||
|
||||
#zfs core common code
|
||||
contrib/openzfs/module/zfs/abd.c optional zfs compile-with "${ZFS_C}"
|
||||
|
@ -257,6 +262,7 @@ contrib/openzfs/module/zfs/blkptr.c optional zfs compile-with "${ZFS_C}"
|
|||
contrib/openzfs/module/zfs/bplist.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/bpobj.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/bptree.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/brt.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/btree.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/bqueue.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/dbuf.c optional zfs compile-with "${ZFS_C}"
|
||||
|
@ -304,7 +310,7 @@ contrib/openzfs/module/zfs/range_tree.c optional zfs compile-with "${ZFS_C}"
|
|||
contrib/openzfs/module/zfs/refcount.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/rrwlock.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/sa.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/sha256.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/sha2_zfs.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/skein_zfs.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/spa.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/spa_checkpoint.c optional zfs compile-with "${ZFS_C}"
|
||||
|
@ -352,6 +358,7 @@ contrib/openzfs/module/zfs/zfs_byteswap.c optional zfs compile-with "${ZFS_C}"
|
|||
contrib/openzfs/module/zfs/zfs_chksum.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/zfs_fm.c optional zfs compile-with "${ZFS_C} ${NO_WUNUSED_BUT_SET_VARIABLE}"
|
||||
contrib/openzfs/module/zfs/zfs_fuid.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/zfs_impl.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/zfs_ioctl.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/zfs_log.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zfs/zfs_onexit.c optional zfs compile-with "${ZFS_C}"
|
||||
|
|
|
@ -418,11 +418,26 @@ x86/x86/mptable_pci.c optional mptable pci
|
|||
x86/x86/msi.c optional pci
|
||||
x86/xen/pv.c optional xenhvm
|
||||
|
||||
# zfs blake3 hash support
|
||||
contrib/openzfs/module/icp/asm-x86_64/blake3/blake3_avx2.S optional zfs compile-with "${ZFS_S}"
|
||||
contrib/openzfs/module/icp/asm-x86_64/blake3/blake3_avx512.S optional zfs compile-with "${ZFS_S}"
|
||||
contrib/openzfs/module/icp/asm-x86_64/blake3/blake3_sse2.S optional zfs compile-with "${ZFS_S}"
|
||||
contrib/openzfs/module/icp/asm-x86_64/blake3/blake3_sse41.S optional zfs compile-with "${ZFS_S}"
|
||||
|
||||
# zfs sha2 hash support
|
||||
zfs-sha256-x86_64.o optional zfs \
|
||||
dependency "$S/contrib/openzfs/module/icp/asm-x86_64/sha2/sha256-x86_64.S" \
|
||||
compile-with "${CC} -c ${ZFS_ASM_CFLAGS} -o ${.TARGET} ${WERROR} $S/contrib/openzfs/module/icp/asm-x86_64/sha2/sha256-x86_64.S" \
|
||||
no-implicit-rule \
|
||||
clean "zfs-sha256-x86_64.o"
|
||||
|
||||
zfs-sha512-x86_64.o optional zfs \
|
||||
dependency "$S/contrib/openzfs/module/icp/asm-x86_64/sha2/sha512-x86_64.S" \
|
||||
compile-with "${CC} -c ${ZFS_ASM_CFLAGS} -o ${.TARGET} ${WERROR} $S/contrib/openzfs/module/icp/asm-x86_64/sha2/sha512-x86_64.S" \
|
||||
no-implicit-rule \
|
||||
clean "zfs-sha512-x86_64.o"
|
||||
|
||||
# zfs checksums / zcommon
|
||||
contrib/openzfs/module/zcommon/zfs_fletcher_avx512.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zcommon/zfs_fletcher_intel.c optional zfs compile-with "${ZFS_C}"
|
||||
contrib/openzfs/module/zcommon/zfs_fletcher_sse.c optional zfs compile-with "${ZFS_C}"
|
||||
|
|
|
@ -80,6 +80,11 @@ arm/arm/vfp.c standard
|
|||
cddl/dev/dtrace/arm/dtrace_asm.S optional dtrace compile-with "${DTRACE_S}"
|
||||
cddl/dev/dtrace/arm/dtrace_subr.c optional dtrace compile-with "${DTRACE_C}"
|
||||
cddl/dev/fbt/arm/fbt_isa.c optional dtrace_fbt | dtraceall compile-with "${FBT_C}"
|
||||
|
||||
# zfs sha2 hash support
|
||||
contrib/openzfs/module/icp/asm-arm/sha2/sha256-armv7.S optional zfs compile-with "${ZFS_S}"
|
||||
contrib/openzfs/module/icp/asm-arm/sha2/sha512-armv7.S optional zfs compile-with "${ZFS_S}"
|
||||
|
||||
crypto/des/des_enc.c optional netsmb
|
||||
dev/cpufreq/cpufreq_dt.c optional cpufreq fdt
|
||||
dev/dwc/if_dwc.c optional dwc
|
||||
|
|
|
@ -159,9 +159,24 @@ cddl/dev/dtrace/aarch64/dtrace_asm.S optional dtrace compile-with "${DTRACE_S}"
|
|||
cddl/dev/dtrace/aarch64/dtrace_subr.c optional dtrace compile-with "${DTRACE_C}"
|
||||
cddl/dev/fbt/aarch64/fbt_isa.c optional dtrace_fbt | dtraceall compile-with "${FBT_C}"
|
||||
|
||||
# zfs blake3 hash support
|
||||
contrib/openzfs/module/icp/asm-aarch64/blake3/b3_aarch64_sse2.S optional zfs compile-with "${ZFS_S:N-mgeneral-regs-only}"
|
||||
contrib/openzfs/module/icp/asm-aarch64/blake3/b3_aarch64_sse41.S optional zfs compile-with "${ZFS_S:N-mgeneral-regs-only}"
|
||||
|
||||
# zfs sha2 hash support
|
||||
|
||||
zfs-sha256-armv8.o optional zfs \
|
||||
dependency "$S/contrib/openzfs/module/icp/asm-aarch64/sha2/sha256-armv8.S" \
|
||||
compile-with "${CC} -c ${ZFS_ASM_CFLAGS:N-mgeneral-regs-only} -o ${.TARGET} ${WERROR} $S/contrib/openzfs/module/icp/asm-aarch64/sha2/sha256-armv8.S" \
|
||||
no-implicit-rule \
|
||||
clean "zfs-sha256-armv8.o"
|
||||
|
||||
zfs-sha512-armv8.o optional zfs \
|
||||
dependency "$S/contrib/openzfs/module/icp/asm-aarch64/sha2/sha512-armv8.S" \
|
||||
compile-with "${CC} -c ${ZFS_ASM_CFLAGS:N-mgeneral-regs-only} -o ${.TARGET} ${WERROR} $S/contrib/openzfs/module/icp/asm-aarch64/sha2/sha512-armv8.S" \
|
||||
no-implicit-rule \
|
||||
clean "zfs-sha512-armv8.o"
|
||||
|
||||
##
|
||||
## ASoC support
|
||||
##
|
||||
|
|
|
@ -10,8 +10,17 @@
|
|||
#
|
||||
|
||||
# There is only an asm version on ppc64.
|
||||
|
||||
# zfs blake3 hash support
|
||||
contrib/openzfs/module/icp/asm-ppc64/blake3/b3_ppc64le_sse2.S optional zfs compile-with "${ZFS_S}"
|
||||
contrib/openzfs/module/icp/asm-ppc64/blake3/b3_ppc64le_sse41.S optional zfs compile-with "${ZFS_S}"
|
||||
|
||||
# zfs sha2 hash support
|
||||
contrib/openzfs/module/icp/asm-ppc64/sha2/sha256-p8.S optional zfs compile-with "${ZFS_S}"
|
||||
contrib/openzfs/module/icp/asm-ppc64/sha2/sha512-p8.S optional zfs compile-with "${ZFS_S}"
|
||||
contrib/openzfs/module/icp/asm-ppc64/sha2/sha256-ppc.S optional zfs compile-with "${ZFS_S}"
|
||||
contrib/openzfs/module/icp/asm-ppc64/sha2/sha512-ppc.S optional zfs compile-with "${ZFS_S}"
|
||||
|
||||
cddl/compat/opensolaris/kern/opensolaris_atomic.c optional zfs powerpc | dtrace powerpc | zfs powerpcspe | dtrace powerpcspe compile-with "${ZFS_C}"
|
||||
cddl/dev/dtrace/powerpc/dtrace_asm.S optional dtrace compile-with "${DTRACE_S}"
|
||||
cddl/dev/dtrace/powerpc/dtrace_subr.c optional dtrace compile-with "${DTRACE_C}"
|
||||
|
|
51
sys/contrib/openzfs/.github/workflows/README.md
vendored
Normal file
51
sys/contrib/openzfs/.github/workflows/README.md
vendored
Normal file
|
@ -0,0 +1,51 @@
|
|||
|
||||
## The testings are done this way
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph CleanUp and Summary
|
||||
Part1-20.04-->CleanUp+nice+Summary
|
||||
Part2-20.04-->CleanUp+nice+Summary
|
||||
PartN-20.04-->CleanUp+nice+Summary
|
||||
Part1-22.04-->CleanUp+nice+Summary
|
||||
Part2-22.04-->CleanUp+nice+Summary
|
||||
PartN-22.04-->CleanUp+nice+Summary
|
||||
end
|
||||
|
||||
subgraph Functional Testings
|
||||
functional-testing-20.04-->Part1-20.04
|
||||
functional-testing-20.04-->Part2-20.04
|
||||
functional-testing-20.04-->PartN-20.04
|
||||
functional-testing-22.04-->Part1-22.04
|
||||
functional-testing-22.04-->Part2-22.04
|
||||
functional-testing-22.04-->PartN-22.04
|
||||
end
|
||||
|
||||
subgraph Sanity and zloop Testings
|
||||
sanity-checks-20.04-->functional-testing-20.04
|
||||
sanity-checks-22.04-->functional-testing-22.04
|
||||
zloop-checks-20.04-->functional
|
||||
zloop-checks-22.04-->functional
|
||||
end
|
||||
|
||||
subgraph Code Checking + Building
|
||||
codeql.yml
|
||||
checkstyle.yml
|
||||
Build-Ubuntu-20.04-->sanity-checks-20.04
|
||||
Build-Ubuntu-22.04-->sanity-checks-22.04
|
||||
Build-Ubuntu-20.04-->zloop-checks-20.04
|
||||
Build-Ubuntu-22.04-->zloop-checks-22.04
|
||||
end
|
||||
```
|
||||
|
||||
|
||||
1) build zfs modules for Ubuntu 20.04 and 22.04 (~15m)
|
||||
2) 2x zloop test (~10m) + 2x sanity test (~25m)
|
||||
3) functional testings in parts 1..5 (each ~1h)
|
||||
4) cleanup and create summary
|
||||
- content of summary depends on the results of the steps
|
||||
|
||||
When everything runs fine, the full run should be done in
|
||||
about 2 hours.
|
||||
|
||||
The codeql.yml and checkstyle.yml are not part in this circle.
|
|
@ -13,8 +13,10 @@ jobs:
|
|||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get -qq upgrade
|
||||
# https://github.com/orgs/community/discussions/47863
|
||||
sudo apt-mark hold grub-efi-amd64-signed
|
||||
sudo apt-get update --fix-missing
|
||||
sudo apt-get upgrade
|
||||
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt apt-get install -qq
|
||||
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/checkstyle-dependencies.txt apt-get install -qq
|
||||
sudo python3 -m pip install --quiet flake8
|
||||
|
|
119
sys/contrib/openzfs/.github/workflows/scripts/generate-summary.sh
vendored
Executable file
119
sys/contrib/openzfs/.github/workflows/scripts/generate-summary.sh
vendored
Executable file
|
@ -0,0 +1,119 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# for runtime reasons we split functional testings into N parts
|
||||
# - use a define to check for missing tarfiles
|
||||
FUNCTIONAL_PARTS="4"
|
||||
|
||||
ZTS_REPORT="tests/test-runner/bin/zts-report.py"
|
||||
chmod +x $ZTS_REPORT
|
||||
|
||||
function output() {
|
||||
echo -e $* >> Summary.md
|
||||
}
|
||||
|
||||
function error() {
|
||||
output ":bangbang: $* :bangbang:\n"
|
||||
}
|
||||
|
||||
# this function generates the real summary
|
||||
# - expects a logfile "log" in current directory
|
||||
function generate() {
|
||||
# we issued some error already
|
||||
test ! -s log && return
|
||||
|
||||
# for overview and zts-report
|
||||
cat log | grep '^Test' > list
|
||||
|
||||
# error details
|
||||
awk '/\[FAIL\]|\[KILLED\]/{ show=1; print; next; }
|
||||
/\[SKIP\]|\[PASS\]/{ show=0; } show' log > err
|
||||
|
||||
# summary of errors
|
||||
if [ -s err ]; then
|
||||
output "<pre>"
|
||||
$ZTS_REPORT --no-maybes ./list >> Summary.md
|
||||
output "</pre>"
|
||||
|
||||
# generate seperate error logfile
|
||||
ERRLOGS=$((ERRLOGS+1))
|
||||
errfile="err-$ERRLOGS.md"
|
||||
echo -e "\n## $headline (debugging)\n" >> $errfile
|
||||
echo "<details><summary>Error Listing - with dmesg and dbgmsg</summary><pre>" >> $errfile
|
||||
dd if=err bs=999k count=1 >> $errfile
|
||||
echo "</pre></details>" >> $errfile
|
||||
else
|
||||
output "All tests passed :thumbsup:"
|
||||
fi
|
||||
|
||||
output "<details><summary>Full Listing</summary><pre>"
|
||||
cat list >> Summary.md
|
||||
output "</pre></details>"
|
||||
|
||||
# remove tmp files
|
||||
rm -f err list log
|
||||
}
|
||||
|
||||
# check tarfiles and untar
|
||||
function check_tarfile() {
|
||||
if [ -f "$1" ]; then
|
||||
tar xf "$1" || error "Tarfile $1 returns some error"
|
||||
else
|
||||
error "Tarfile $1 not found"
|
||||
fi
|
||||
}
|
||||
|
||||
# check logfile and concatenate test results
|
||||
function check_logfile() {
|
||||
if [ -f "$1" ]; then
|
||||
cat "$1" >> log
|
||||
else
|
||||
error "Logfile $1 not found"
|
||||
fi
|
||||
}
|
||||
|
||||
# sanity
|
||||
function summarize_s() {
|
||||
headline="$1"
|
||||
output "\n## $headline\n"
|
||||
rm -rf testfiles
|
||||
check_tarfile "$2/sanity.tar"
|
||||
check_logfile "testfiles/log"
|
||||
generate
|
||||
}
|
||||
|
||||
# functional
|
||||
function summarize_f() {
|
||||
headline="$1"
|
||||
output "\n## $headline\n"
|
||||
rm -rf testfiles
|
||||
for i in $(seq 1 $FUNCTIONAL_PARTS); do
|
||||
tarfile="$2/part$i.tar"
|
||||
check_tarfile "$tarfile"
|
||||
check_logfile "testfiles/log"
|
||||
done
|
||||
generate
|
||||
}
|
||||
|
||||
# https://docs.github.com/en/enterprise-server@3.6/actions/using-workflows/workflow-commands-for-github-actions#step-isolation-and-limits
|
||||
# Job summaries are isolated between steps and each step is restricted to a maximum size of 1MiB.
|
||||
# [ ] can not show all error findings here
|
||||
# [x] split files into smaller ones and create additional steps
|
||||
|
||||
ERRLOGS=0
|
||||
if [ ! -f Summary/Summary.md ]; then
|
||||
# first call, we do the default summary (~500k)
|
||||
echo -n > Summary.md
|
||||
summarize_s "Sanity Tests Ubuntu 20.04" Logs-20.04-sanity
|
||||
summarize_s "Sanity Tests Ubuntu 22.04" Logs-22.04-sanity
|
||||
summarize_f "Functional Tests Ubuntu 20.04" Logs-20.04-functional
|
||||
summarize_f "Functional Tests Ubuntu 22.04" Logs-22.04-functional
|
||||
|
||||
cat Summary.md >> $GITHUB_STEP_SUMMARY
|
||||
mkdir -p Summary
|
||||
mv *.md Summary
|
||||
else
|
||||
# here we get, when errors where returned in first call
|
||||
test -f Summary/err-$1.md && cat Summary/err-$1.md >> $GITHUB_STEP_SUMMARY
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -1,20 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -eu
|
||||
|
||||
# remove 4GiB of images
|
||||
sudo systemd-run docker system prune --force --all --volumes
|
||||
|
||||
# remove unused software
|
||||
sudo systemd-run rm -rf \
|
||||
"$AGENT_TOOLSDIRECTORY" \
|
||||
/opt/* \
|
||||
/usr/local/* \
|
||||
/usr/share/az* \
|
||||
/usr/share/dotnet \
|
||||
/usr/share/gradle* \
|
||||
/usr/share/miniconda \
|
||||
/usr/share/swift \
|
||||
/var/lib/gems \
|
||||
/var/lib/mysql \
|
||||
/var/lib/snapd
|
93
sys/contrib/openzfs/.github/workflows/scripts/setup-dependencies.sh
vendored
Executable file
93
sys/contrib/openzfs/.github/workflows/scripts/setup-dependencies.sh
vendored
Executable file
|
@ -0,0 +1,93 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -eu
|
||||
|
||||
function prerun() {
|
||||
echo "::group::Install build dependencies"
|
||||
# remove snap things, update+upgrade will be faster then
|
||||
for x in lxd core20 snapd; do sudo snap remove $x; done
|
||||
sudo apt-get purge snapd google-chrome-stable firefox
|
||||
# https://github.com/orgs/community/discussions/47863
|
||||
sudo apt-get remove grub-efi-amd64-bin grub-efi-amd64-signed shim-signed --allow-remove-essential
|
||||
sudo apt-get update
|
||||
sudo apt upgrade
|
||||
sudo xargs --arg-file=.github/workflows/build-dependencies.txt apt-get install -qq
|
||||
sudo apt-get clean
|
||||
sudo dmesg -c > /var/tmp/dmesg-prerun
|
||||
echo "::endgroup::"
|
||||
}
|
||||
|
||||
function mod_build() {
|
||||
echo "::group::Generate debian packages"
|
||||
./autogen.sh
|
||||
./configure --enable-debug --enable-debuginfo --enable-asan --enable-ubsan
|
||||
make --no-print-directory --silent native-deb-utils native-deb-kmod
|
||||
mv ../*.deb .
|
||||
rm ./openzfs-zfs-dracut*.deb ./openzfs-zfs-dkms*.deb
|
||||
echo "$ImageOS-$ImageVersion" > tests/ImageOS.txt
|
||||
echo "::endgroup::"
|
||||
}
|
||||
|
||||
function mod_install() {
|
||||
# install the pre-built module only on the same runner image
|
||||
MOD=`cat tests/ImageOS.txt`
|
||||
if [ "$MOD" != "$ImageOS-$ImageVersion" ]; then
|
||||
rm -f *.deb
|
||||
mod_build
|
||||
fi
|
||||
|
||||
echo "::group::Install and load modules"
|
||||
# don't use kernel-shipped zfs modules
|
||||
sudo sed -i.bak 's/updates/extra updates/' /etc/depmod.d/ubuntu.conf
|
||||
sudo apt-get install --fix-missing ./*.deb
|
||||
|
||||
# Native Debian packages enable and start the services
|
||||
# Stop zfs-zed daemon, as it may interfere with some ZTS test cases
|
||||
sudo systemctl stop zfs-zed
|
||||
sudo depmod -a
|
||||
sudo modprobe zfs
|
||||
sudo dmesg
|
||||
sudo dmesg -c > /var/tmp/dmesg-module-load
|
||||
echo "::endgroup::"
|
||||
|
||||
echo "::group::Report CPU information"
|
||||
lscpu
|
||||
cat /proc/spl/kstat/zfs/chksum_bench
|
||||
echo "::endgroup::"
|
||||
|
||||
echo "::group::Reclaim and report disk space"
|
||||
# remove 4GiB of images
|
||||
sudo systemd-run docker system prune --force --all --volumes
|
||||
|
||||
# remove unused software
|
||||
sudo systemd-run --wait rm -rf \
|
||||
"$AGENT_TOOLSDIRECTORY" \
|
||||
/opt/* \
|
||||
/usr/local/* \
|
||||
/usr/share/az* \
|
||||
/usr/share/dotnet \
|
||||
/usr/share/gradle* \
|
||||
/usr/share/miniconda \
|
||||
/usr/share/swift \
|
||||
/var/lib/gems \
|
||||
/var/lib/mysql \
|
||||
/var/lib/snapd
|
||||
|
||||
# trim the cleaned space
|
||||
sudo fstrim /
|
||||
|
||||
# disk usage afterwards
|
||||
df -h /
|
||||
echo "::endgroup::"
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
build)
|
||||
prerun
|
||||
mod_build
|
||||
;;
|
||||
tests)
|
||||
prerun
|
||||
mod_install
|
||||
;;
|
||||
esac
|
24
sys/contrib/openzfs/.github/workflows/scripts/setup-functional.sh
vendored
Executable file
24
sys/contrib/openzfs/.github/workflows/scripts/setup-functional.sh
vendored
Executable file
|
@ -0,0 +1,24 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -eu
|
||||
|
||||
TDIR="/usr/share/zfs/zfs-tests/tests/functional"
|
||||
echo -n "TODO="
|
||||
case "$1" in
|
||||
part1)
|
||||
# ~1h 20m
|
||||
echo "cli_root"
|
||||
;;
|
||||
part2)
|
||||
# ~1h
|
||||
ls $TDIR|grep '^[a-m]'|grep -v "cli_root"|xargs|tr -s ' ' ','
|
||||
;;
|
||||
part3)
|
||||
# ~1h
|
||||
ls $TDIR|grep '^[n-qs-z]'|xargs|tr -s ' ' ','
|
||||
;;
|
||||
part4)
|
||||
# ~1h
|
||||
ls $TDIR|grep '^r'|xargs|tr -s ' ' ','
|
||||
;;
|
||||
esac
|
124
sys/contrib/openzfs/.github/workflows/zfs-linux-tests.yml
vendored
Normal file
124
sys/contrib/openzfs/.github/workflows/zfs-linux-tests.yml
vendored
Normal file
|
@ -0,0 +1,124 @@
|
|||
name: zfs-linux-tests
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
os:
|
||||
description: 'The ubuntu version: 20.02 or 22.04'
|
||||
required: true
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
|
||||
zloop:
|
||||
runs-on: ubuntu-${{ inputs.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: modules-${{ inputs.os }}
|
||||
- name: Install modules
|
||||
run: |
|
||||
tar xzf modules-${{ inputs.os }}.tgz
|
||||
.github/workflows/scripts/setup-dependencies.sh tests
|
||||
- name: Tests
|
||||
timeout-minutes: 30
|
||||
run: |
|
||||
sudo mkdir -p /var/tmp/zloop
|
||||
# run for 10 minutes or at most 2 iterations for a maximum runner
|
||||
# time of 20 minutes.
|
||||
sudo /usr/share/zfs/zloop.sh -t 600 -I 2 -l -m1 -- -T 120 -P 60
|
||||
- name: Prepare artifacts
|
||||
if: failure()
|
||||
run: |
|
||||
sudo chmod +r -R /var/tmp/zloop/
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: Zpool-logs-${{ inputs.os }}
|
||||
path: |
|
||||
/var/tmp/zloop/*/
|
||||
!/var/tmp/zloop/*/vdev/
|
||||
retention-days: 14
|
||||
if-no-files-found: ignore
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: Zpool-files-${{ inputs.os }}
|
||||
path: |
|
||||
/var/tmp/zloop/*/vdev/
|
||||
retention-days: 14
|
||||
if-no-files-found: ignore
|
||||
|
||||
sanity:
|
||||
runs-on: ubuntu-${{ inputs.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: modules-${{ inputs.os }}
|
||||
- name: Install modules
|
||||
run: |
|
||||
tar xzf modules-${{ inputs.os }}.tgz
|
||||
.github/workflows/scripts/setup-dependencies.sh tests
|
||||
- name: Tests
|
||||
timeout-minutes: 60
|
||||
shell: bash
|
||||
run: |
|
||||
set -o pipefail
|
||||
/usr/share/zfs/zfs-tests.sh -vKR -s 3G -r sanity | scripts/zfs-tests-color.sh
|
||||
- name: Prepare artifacts
|
||||
if: success() || failure()
|
||||
run: |
|
||||
RESPATH="/var/tmp/test_results"
|
||||
mv -f $RESPATH/current $RESPATH/testfiles
|
||||
tar cf $RESPATH/sanity.tar -h -C $RESPATH testfiles
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: success() || failure()
|
||||
with:
|
||||
name: Logs-${{ inputs.os }}-sanity
|
||||
path: /var/tmp/test_results/sanity.tar
|
||||
if-no-files-found: ignore
|
||||
|
||||
functional:
|
||||
runs-on: ubuntu-${{ inputs.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
tests: [ part1, part2, part3, part4 ]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: modules-${{ inputs.os }}
|
||||
- name: Install modules
|
||||
run: |
|
||||
tar xzf modules-${{ inputs.os }}.tgz
|
||||
.github/workflows/scripts/setup-dependencies.sh tests
|
||||
- name: Setup tests
|
||||
run: |
|
||||
.github/workflows/scripts/setup-functional.sh ${{ matrix.tests }} >> $GITHUB_ENV
|
||||
- name: Tests
|
||||
timeout-minutes: 120
|
||||
shell: bash
|
||||
run: |
|
||||
set -o pipefail
|
||||
/usr/share/zfs/zfs-tests.sh -vKR -s 3G -T ${{ env.TODO }} | scripts/zfs-tests-color.sh
|
||||
- name: Prepare artifacts
|
||||
if: success() || failure()
|
||||
run: |
|
||||
RESPATH="/var/tmp/test_results"
|
||||
mv -f $RESPATH/current $RESPATH/testfiles
|
||||
tar cf $RESPATH/${{ matrix.tests }}.tar -h -C $RESPATH testfiles
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: success() || failure()
|
||||
with:
|
||||
name: Logs-${{ inputs.os }}-functional
|
||||
path: /var/tmp/test_results/${{ matrix.tests }}.tar
|
||||
if-no-files-found: ignore
|
64
sys/contrib/openzfs/.github/workflows/zfs-linux.yml
vendored
Normal file
64
sys/contrib/openzfs/.github/workflows/zfs-linux.yml
vendored
Normal file
|
@ -0,0 +1,64 @@
|
|||
name: zfs-linux
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
name: Build
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [20.04, 22.04]
|
||||
runs-on: ubuntu-${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Build modules
|
||||
run: .github/workflows/scripts/setup-dependencies.sh build
|
||||
- name: Prepare modules upload
|
||||
run: tar czf modules-${{ matrix.os }}.tgz *.deb .github tests/test-runner tests/ImageOS.txt
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: modules-${{ matrix.os }}
|
||||
path: modules-${{ matrix.os }}.tgz
|
||||
retention-days: 14
|
||||
|
||||
testings:
|
||||
name: Testing
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [20.04, 22.04]
|
||||
needs: build
|
||||
uses: ./.github/workflows/zfs-linux-tests.yml
|
||||
with:
|
||||
os: ${{ matrix.os }}
|
||||
|
||||
cleanup:
|
||||
if: always()
|
||||
name: Cleanup
|
||||
runs-on: ubuntu-22.04
|
||||
needs: testings
|
||||
steps:
|
||||
- uses: actions/download-artifact@v3
|
||||
- name: Generating summary
|
||||
run: |
|
||||
tar xzf modules-22.04/modules-22.04.tgz .github tests
|
||||
.github/workflows/scripts/generate-summary.sh
|
||||
# up to 4 steps, each can have 1 MiB output (for debugging log files)
|
||||
- name: Summary for errors #1
|
||||
run: .github/workflows/scripts/generate-summary.sh 1
|
||||
- name: Summary for errors #2
|
||||
run: .github/workflows/scripts/generate-summary.sh 2
|
||||
- name: Summary for errors #3
|
||||
run: .github/workflows/scripts/generate-summary.sh 3
|
||||
- name: Summary for errors #4
|
||||
run: .github/workflows/scripts/generate-summary.sh 4
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Summary Files
|
||||
path: Summary/
|
|
@ -1,84 +0,0 @@
|
|||
name: zfs-tests-functional
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
tests-functional-ubuntu:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [20.04, 22.04]
|
||||
runs-on: ubuntu-${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get -qq upgrade
|
||||
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt apt-get install -qq
|
||||
sudo apt-get clean
|
||||
- name: Autogen.sh
|
||||
run: |
|
||||
./autogen.sh
|
||||
- name: Configure
|
||||
run: |
|
||||
./configure --enable-debug --enable-debuginfo --enable-asan --enable-ubsan
|
||||
- name: Make
|
||||
run: |
|
||||
make --no-print-directory --silent native-deb-utils native-deb-kmod
|
||||
mv ../*.deb .
|
||||
rm ./openzfs-zfs-dkms*.deb ./openzfs-zfs-dracut*.deb
|
||||
- name: Install
|
||||
run: |
|
||||
# Update order of directories to search for modules, otherwise
|
||||
# Ubuntu will load kernel-shipped ones.
|
||||
sudo sed -i.bak 's/updates/extra updates/' /etc/depmod.d/ubuntu.conf
|
||||
sudo dpkg -i *.deb
|
||||
# Native Debian packages enable and start the services
|
||||
# Stop zfs-zed daemon, as it may interfere with some ZTS test cases
|
||||
sudo systemctl stop zfs-zed
|
||||
# Workaround for cloud-init bug
|
||||
# see https://github.com/openzfs/zfs/issues/12644
|
||||
FILE=/lib/udev/rules.d/10-cloud-init-hook-hotplug.rules
|
||||
if [ -r "${FILE}" ]; then
|
||||
HASH=$(md5sum "${FILE}" | awk '{ print $1 }')
|
||||
if [ "${HASH}" = "121ff0ef1936cd2ef65aec0458a35772" ]; then
|
||||
# Just shove a zd* exclusion right above the hotplug hook...
|
||||
sudo sed -i -e s/'LABEL="cloudinit_hook"'/'KERNEL=="zd*", GOTO="cloudinit_end"\n&'/ "${FILE}"
|
||||
sudo udevadm control --reload-rules
|
||||
fi
|
||||
fi
|
||||
- name: Clear the kernel ring buffer
|
||||
run: |
|
||||
sudo dmesg -c >/var/tmp/dmesg-prerun
|
||||
- name: Reclaim and report disk space
|
||||
run: |
|
||||
${{ github.workspace }}/.github/workflows/scripts/reclaim_disk_space.sh
|
||||
df -h /
|
||||
- name: Tests
|
||||
run: |
|
||||
set -o pipefail
|
||||
/usr/share/zfs/zfs-tests.sh -vKR -s 3G | scripts/zfs-tests-color.sh
|
||||
shell: bash
|
||||
timeout-minutes: 330
|
||||
- name: Prepare artifacts
|
||||
if: failure()
|
||||
run: |
|
||||
RESULTS_PATH=$(readlink -f /var/tmp/test_results/current)
|
||||
sudo dmesg > $RESULTS_PATH/dmesg
|
||||
sudo cp /var/log/syslog /var/tmp/dmesg-prerun $RESULTS_PATH/
|
||||
sudo chmod +r $RESULTS_PATH/*
|
||||
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
||||
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: Test logs Ubuntu-${{ matrix.os }}
|
||||
path: |
|
||||
/var/tmp/test_results/*
|
||||
!/var/tmp/test_results/current
|
||||
if-no-files-found: ignore
|
|
@ -1,80 +0,0 @@
|
|||
name: zfs-tests-sanity
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get -qq upgrade
|
||||
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt apt-get install -qq
|
||||
sudo apt-get clean
|
||||
- name: Autogen.sh
|
||||
run: |
|
||||
./autogen.sh
|
||||
- name: Configure
|
||||
run: |
|
||||
./configure --enable-debug --enable-debuginfo --enable-asan --enable-ubsan
|
||||
- name: Make
|
||||
run: |
|
||||
make --no-print-directory --silent native-deb-utils native-deb-kmod
|
||||
mv ../*.deb .
|
||||
rm ./openzfs-zfs-dkms*.deb ./openzfs-zfs-dracut*.deb
|
||||
- name: Install
|
||||
run: |
|
||||
# Update order of directories to search for modules, otherwise
|
||||
# Ubuntu will load kernel-shipped ones.
|
||||
sudo sed -i.bak 's/updates/extra updates/' /etc/depmod.d/ubuntu.conf
|
||||
sudo dpkg -i *.deb
|
||||
# Native Debian packages enable and start the services
|
||||
# Stop zfs-zed daemon, as it may interfere with some ZTS test cases
|
||||
sudo systemctl stop zfs-zed
|
||||
# Workaround for cloud-init bug
|
||||
# see https://github.com/openzfs/zfs/issues/12644
|
||||
FILE=/lib/udev/rules.d/10-cloud-init-hook-hotplug.rules
|
||||
if [ -r "${FILE}" ]; then
|
||||
HASH=$(md5sum "${FILE}" | awk '{ print $1 }')
|
||||
if [ "${HASH}" = "121ff0ef1936cd2ef65aec0458a35772" ]; then
|
||||
# Just shove a zd* exclusion right above the hotplug hook...
|
||||
sudo sed -i -e s/'LABEL="cloudinit_hook"'/'KERNEL=="zd*", GOTO="cloudinit_end"\n&'/ "${FILE}"
|
||||
sudo udevadm control --reload-rules
|
||||
fi
|
||||
fi
|
||||
- name: Clear the kernel ring buffer
|
||||
run: |
|
||||
sudo dmesg -c >/var/tmp/dmesg-prerun
|
||||
- name: Reclaim and report disk space
|
||||
run: |
|
||||
${{ github.workspace }}/.github/workflows/scripts/reclaim_disk_space.sh
|
||||
df -h /
|
||||
- name: Tests
|
||||
run: |
|
||||
set -o pipefail
|
||||
/usr/share/zfs/zfs-tests.sh -vKR -s 3G -r sanity | scripts/zfs-tests-color.sh
|
||||
shell: bash
|
||||
timeout-minutes: 330
|
||||
- name: Prepare artifacts
|
||||
if: failure()
|
||||
run: |
|
||||
RESULTS_PATH=$(readlink -f /var/tmp/test_results/current)
|
||||
sudo dmesg > $RESULTS_PATH/dmesg
|
||||
sudo cp /var/log/syslog /var/tmp/dmesg-prerun $RESULTS_PATH/
|
||||
sudo chmod +r $RESULTS_PATH/*
|
||||
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
||||
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: Test logs Ubuntu-${{ matrix.os }}
|
||||
path: |
|
||||
/var/tmp/test_results/*
|
||||
!/var/tmp/test_results/current
|
||||
if-no-files-found: ignore
|
63
sys/contrib/openzfs/.github/workflows/zloop.yml
vendored
63
sys/contrib/openzfs/.github/workflows/zloop.yml
vendored
|
@ -1,63 +0,0 @@
|
|||
name: zloop
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
TEST_DIR: /var/tmp/zloop
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get -qq upgrade
|
||||
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt apt-get install -qq
|
||||
sudo apt-get clean
|
||||
- name: Autogen.sh
|
||||
run: |
|
||||
./autogen.sh
|
||||
- name: Configure
|
||||
run: |
|
||||
./configure --enable-debug --enable-debuginfo --enable-asan --enable-ubsan
|
||||
- name: Make
|
||||
run: |
|
||||
make -j$(nproc) --no-print-directory --silent pkg-utils pkg-kmod
|
||||
- name: Install
|
||||
run: |
|
||||
sudo dpkg -i *.deb
|
||||
# Update order of directories to search for modules, otherwise
|
||||
# Ubuntu will load kernel-shipped ones.
|
||||
sudo sed -i.bak 's/updates/extra updates/' /etc/depmod.d/ubuntu.conf
|
||||
sudo depmod
|
||||
sudo modprobe zfs
|
||||
- name: Tests
|
||||
run: |
|
||||
sudo mkdir -p $TEST_DIR
|
||||
# run for 10 minutes or at most 2 iterations for a maximum runner
|
||||
# time of 20 minutes.
|
||||
sudo /usr/share/zfs/zloop.sh -t 600 -I 2 -l -m1 -- -T 120 -P 60
|
||||
- name: Prepare artifacts
|
||||
if: failure()
|
||||
run: |
|
||||
sudo chmod +r -R $TEST_DIR/
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: Logs
|
||||
path: |
|
||||
/var/tmp/zloop/*/
|
||||
!/var/tmp/zloop/*/vdev/
|
||||
if-no-files-found: ignore
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: Pool files
|
||||
path: |
|
||||
/var/tmp/zloop/*/vdev/
|
||||
if-no-files-found: ignore
|
|
@ -270,16 +270,14 @@ def draw_graph(kstats_dict):
|
|||
arc_perc = f_perc(arc_stats['size'], arc_stats['c_max'])
|
||||
mfu_size = f_bytes(arc_stats['mfu_size'])
|
||||
mru_size = f_bytes(arc_stats['mru_size'])
|
||||
meta_limit = f_bytes(arc_stats['arc_meta_limit'])
|
||||
meta_size = f_bytes(arc_stats['arc_meta_used'])
|
||||
dnode_limit = f_bytes(arc_stats['arc_dnode_limit'])
|
||||
dnode_size = f_bytes(arc_stats['dnode_size'])
|
||||
|
||||
info_form = ('ARC: {0} ({1}) MFU: {2} MRU: {3} META: {4} ({5}) '
|
||||
'DNODE {6} ({7})')
|
||||
info_form = ('ARC: {0} ({1}) MFU: {2} MRU: {3} META: {4} '
|
||||
'DNODE {5} ({6})')
|
||||
info_line = info_form.format(arc_size, arc_perc, mfu_size, mru_size,
|
||||
meta_size, meta_limit, dnode_size,
|
||||
dnode_limit)
|
||||
meta_size, dnode_size, dnode_limit)
|
||||
info_spc = ' '*int((GRAPH_WIDTH-len(info_line))/2)
|
||||
info_line = GRAPH_INDENT+info_spc+info_line
|
||||
|
||||
|
@ -558,16 +556,28 @@ def section_arc(kstats_dict):
|
|||
arc_target_size = arc_stats['c']
|
||||
arc_max = arc_stats['c_max']
|
||||
arc_min = arc_stats['c_min']
|
||||
anon_size = arc_stats['anon_size']
|
||||
mfu_size = arc_stats['mfu_size']
|
||||
mru_size = arc_stats['mru_size']
|
||||
mfug_size = arc_stats['mfu_ghost_size']
|
||||
mrug_size = arc_stats['mru_ghost_size']
|
||||
unc_size = arc_stats['uncached_size']
|
||||
meta_limit = arc_stats['arc_meta_limit']
|
||||
meta_size = arc_stats['arc_meta_used']
|
||||
meta = arc_stats['meta']
|
||||
pd = arc_stats['pd']
|
||||
pm = arc_stats['pm']
|
||||
anon_data = arc_stats['anon_data']
|
||||
anon_metadata = arc_stats['anon_metadata']
|
||||
mfu_data = arc_stats['mfu_data']
|
||||
mfu_metadata = arc_stats['mfu_metadata']
|
||||
mru_data = arc_stats['mru_data']
|
||||
mru_metadata = arc_stats['mru_metadata']
|
||||
mfug_data = arc_stats['mfu_ghost_data']
|
||||
mfug_metadata = arc_stats['mfu_ghost_metadata']
|
||||
mrug_data = arc_stats['mru_ghost_data']
|
||||
mrug_metadata = arc_stats['mru_ghost_metadata']
|
||||
unc_data = arc_stats['uncached_data']
|
||||
unc_metadata = arc_stats['uncached_metadata']
|
||||
bonus_size = arc_stats['bonus_size']
|
||||
dnode_limit = arc_stats['arc_dnode_limit']
|
||||
dnode_size = arc_stats['dnode_size']
|
||||
dbuf_size = arc_stats['dbuf_size']
|
||||
hdr_size = arc_stats['hdr_size']
|
||||
l2_hdr_size = arc_stats['l2_hdr_size']
|
||||
abd_chunk_waste_size = arc_stats['abd_chunk_waste_size']
|
||||
target_size_ratio = '{0}:1'.format(int(arc_max) // int(arc_min))
|
||||
|
||||
prt_2('ARC size (current):',
|
||||
|
@ -578,25 +588,56 @@ def section_arc(kstats_dict):
|
|||
f_perc(arc_min, arc_max), f_bytes(arc_min))
|
||||
prt_i2('Max size (high water):',
|
||||
target_size_ratio, f_bytes(arc_max))
|
||||
caches_size = int(anon_size)+int(mfu_size)+int(mru_size)+int(unc_size)
|
||||
prt_i2('Anonymouns data size:',
|
||||
f_perc(anon_size, caches_size), f_bytes(anon_size))
|
||||
prt_i2('Most Frequently Used (MFU) cache size:',
|
||||
f_perc(mfu_size, caches_size), f_bytes(mfu_size))
|
||||
prt_i2('Most Recently Used (MRU) cache size:',
|
||||
f_perc(mru_size, caches_size), f_bytes(mru_size))
|
||||
prt_i1('Most Frequently Used (MFU) ghost size:', f_bytes(mfug_size))
|
||||
prt_i1('Most Recently Used (MRU) ghost size:', f_bytes(mrug_size))
|
||||
caches_size = int(anon_data)+int(anon_metadata)+\
|
||||
int(mfu_data)+int(mfu_metadata)+int(mru_data)+int(mru_metadata)+\
|
||||
int(unc_data)+int(unc_metadata)
|
||||
prt_i2('Anonymous data size:',
|
||||
f_perc(anon_data, caches_size), f_bytes(anon_data))
|
||||
prt_i2('Anonymous metadata size:',
|
||||
f_perc(anon_metadata, caches_size), f_bytes(anon_metadata))
|
||||
s = 4294967296
|
||||
v = (s-int(pd))*(s-int(meta))/s
|
||||
prt_i2('MFU data target:', f_perc(v, s),
|
||||
f_bytes(v / 65536 * caches_size / 65536))
|
||||
prt_i2('MFU data size:',
|
||||
f_perc(mfu_data, caches_size), f_bytes(mfu_data))
|
||||
prt_i1('MFU ghost data size:', f_bytes(mfug_data))
|
||||
v = (s-int(pm))*int(meta)/s
|
||||
prt_i2('MFU metadata target:', f_perc(v, s),
|
||||
f_bytes(v / 65536 * caches_size / 65536))
|
||||
prt_i2('MFU metadata size:',
|
||||
f_perc(mfu_metadata, caches_size), f_bytes(mfu_metadata))
|
||||
prt_i1('MFU ghost metadata size:', f_bytes(mfug_metadata))
|
||||
v = int(pd)*(s-int(meta))/s
|
||||
prt_i2('MRU data target:', f_perc(v, s),
|
||||
f_bytes(v / 65536 * caches_size / 65536))
|
||||
prt_i2('MRU data size:',
|
||||
f_perc(mru_data, caches_size), f_bytes(mru_data))
|
||||
prt_i1('MRU ghost data size:', f_bytes(mrug_data))
|
||||
v = int(pm)*int(meta)/s
|
||||
prt_i2('MRU metadata target:', f_perc(v, s),
|
||||
f_bytes(v / 65536 * caches_size / 65536))
|
||||
prt_i2('MRU metadata size:',
|
||||
f_perc(mru_metadata, caches_size), f_bytes(mru_metadata))
|
||||
prt_i1('MRU ghost metadata size:', f_bytes(mrug_metadata))
|
||||
prt_i2('Uncached data size:',
|
||||
f_perc(unc_size, caches_size), f_bytes(unc_size))
|
||||
prt_i2('Metadata cache size (hard limit):',
|
||||
f_perc(meta_limit, arc_max), f_bytes(meta_limit))
|
||||
prt_i2('Metadata cache size (current):',
|
||||
f_perc(meta_size, meta_limit), f_bytes(meta_size))
|
||||
prt_i2('Dnode cache size (hard limit):',
|
||||
f_perc(dnode_limit, meta_limit), f_bytes(dnode_limit))
|
||||
prt_i2('Dnode cache size (current):',
|
||||
f_perc(unc_data, caches_size), f_bytes(unc_data))
|
||||
prt_i2('Uncached metadata size:',
|
||||
f_perc(unc_metadata, caches_size), f_bytes(unc_metadata))
|
||||
prt_i2('Bonus size:',
|
||||
f_perc(bonus_size, arc_size), f_bytes(bonus_size))
|
||||
prt_i2('Dnode cache target:',
|
||||
f_perc(dnode_limit, arc_max), f_bytes(dnode_limit))
|
||||
prt_i2('Dnode cache size:',
|
||||
f_perc(dnode_size, dnode_limit), f_bytes(dnode_size))
|
||||
prt_i2('Dbuf size:',
|
||||
f_perc(dbuf_size, arc_size), f_bytes(dbuf_size))
|
||||
prt_i2('Header size:',
|
||||
f_perc(hdr_size, arc_size), f_bytes(hdr_size))
|
||||
prt_i2('L2 header size:',
|
||||
f_perc(l2_hdr_size, arc_size), f_bytes(l2_hdr_size))
|
||||
prt_i2('ABD chunk waste size:',
|
||||
f_perc(abd_chunk_waste_size, arc_size), f_bytes(abd_chunk_waste_size))
|
||||
print()
|
||||
|
||||
print('ARC hash breakdown:')
|
||||
|
|
|
@ -74,7 +74,7 @@ parse_dataset(const char *target, char **dataset)
|
|||
|
||||
nvlist_t *cfg = NULL;
|
||||
if (zpool_read_label(fd, &cfg, NULL) == 0) {
|
||||
char *nm = NULL;
|
||||
const char *nm = NULL;
|
||||
if (!nvlist_lookup_string(cfg, ZPOOL_CONFIG_POOL_NAME, &nm))
|
||||
strlcpy(*dataset, nm, PATH_MAX);
|
||||
nvlist_free(cfg);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
zdb_CPPFLAGS = $(AM_CPPFLAGS) $(FORCEDEBUG_CPPFLAGS)
|
||||
zdb_CFLAGS = $(AM_CFLAGS) $(LIBCRYPTO_CFLAGS)
|
||||
|
||||
sbin_PROGRAMS += zdb
|
||||
CPPCHECKTARGETS += zdb
|
||||
|
@ -12,3 +13,5 @@ zdb_LDADD = \
|
|||
libzpool.la \
|
||||
libzfs_core.la \
|
||||
libnvpair.la
|
||||
|
||||
zdb_LDADD += $(LIBCRYPTO_LIBS)
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <getopt.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <sys/zfs_context.h>
|
||||
#include <sys/spa.h>
|
||||
#include <sys/spa_impl.h>
|
||||
|
@ -116,7 +117,6 @@ zdb_ot_name(dmu_object_type_t type)
|
|||
|
||||
extern int reference_tracking_enable;
|
||||
extern int zfs_recover;
|
||||
extern unsigned long zfs_arc_meta_min, zfs_arc_meta_limit;
|
||||
extern uint_t zfs_vdev_async_read_max_active;
|
||||
extern boolean_t spa_load_verify_dryrun;
|
||||
extern boolean_t spa_mode_readable_spacemaps;
|
||||
|
@ -785,16 +785,17 @@ usage(void)
|
|||
"Usage:\t%s [-AbcdDFGhikLMPsvXy] [-e [-V] [-p <path> ...]] "
|
||||
"[-I <inflight I/Os>]\n"
|
||||
"\t\t[-o <var>=<value>]... [-t <txg>] [-U <cache>] [-x <dumpdir>]\n"
|
||||
"\t\t[-K <key>]\n"
|
||||
"\t\t[<poolname>[/<dataset | objset id>] [<object | range> ...]]\n"
|
||||
"\t%s [-AdiPv] [-e [-V] [-p <path> ...]] [-U <cache>]\n"
|
||||
"\t%s [-AdiPv] [-e [-V] [-p <path> ...]] [-U <cache>] [-K <key>]\n"
|
||||
"\t\t[<poolname>[/<dataset | objset id>] [<object | range> ...]\n"
|
||||
"\t%s [-v] <bookmark>\n"
|
||||
"\t%s -C [-A] [-U <cache>]\n"
|
||||
"\t%s -l [-Aqu] <device>\n"
|
||||
"\t%s -m [-AFLPX] [-e [-V] [-p <path> ...]] [-t <txg>] "
|
||||
"[-U <cache>]\n\t\t<poolname> [<vdev> [<metaslab> ...]]\n"
|
||||
"\t%s -O <dataset> <path>\n"
|
||||
"\t%s -r <dataset> <path> <destination>\n"
|
||||
"\t%s -O [-K <key>] <dataset> <path>\n"
|
||||
"\t%s -r [-K <key>] <dataset> <path> <destination>\n"
|
||||
"\t%s -R [-A] [-e [-V] [-p <path> ...]] [-U <cache>]\n"
|
||||
"\t\t<poolname> <vdev>:<offset>:<size>[:<flags>]\n"
|
||||
"\t%s -E [-A] word0:word1:...:word15\n"
|
||||
|
@ -879,6 +880,8 @@ usage(void)
|
|||
(void) fprintf(stderr, " -I --inflight=INTEGER "
|
||||
"specify the maximum number of checksumming I/Os "
|
||||
"[default is 200]\n");
|
||||
(void) fprintf(stderr, " -K --key=KEY "
|
||||
"decryption key for encrypted dataset\n");
|
||||
(void) fprintf(stderr, " -o --option=\"OPTION=INTEGER\" "
|
||||
"set global variable to an unsigned 32-bit integer\n");
|
||||
(void) fprintf(stderr, " -p --path==PATH "
|
||||
|
@ -1001,11 +1004,13 @@ dump_histogram(const uint64_t *histo, int size, int offset)
|
|||
uint64_t max = 0;
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
if (histo[i] == 0)
|
||||
continue;
|
||||
if (histo[i] > max)
|
||||
max = histo[i];
|
||||
if (histo[i] > 0 && i > maxidx)
|
||||
if (i > maxidx)
|
||||
maxidx = i;
|
||||
if (histo[i] > 0 && i < minidx)
|
||||
if (i < minidx)
|
||||
minidx = i;
|
||||
}
|
||||
|
||||
|
@ -3023,6 +3028,118 @@ verify_dd_livelist(objset_t *os)
|
|||
return (0);
|
||||
}
|
||||
|
||||
static char *key_material = NULL;
|
||||
|
||||
static boolean_t
|
||||
zdb_derive_key(dsl_dir_t *dd, uint8_t *key_out)
|
||||
{
|
||||
uint64_t keyformat, salt, iters;
|
||||
int i;
|
||||
unsigned char c;
|
||||
|
||||
VERIFY0(zap_lookup(dd->dd_pool->dp_meta_objset, dd->dd_crypto_obj,
|
||||
zfs_prop_to_name(ZFS_PROP_KEYFORMAT), sizeof (uint64_t),
|
||||
1, &keyformat));
|
||||
|
||||
switch (keyformat) {
|
||||
case ZFS_KEYFORMAT_HEX:
|
||||
for (i = 0; i < WRAPPING_KEY_LEN * 2; i += 2) {
|
||||
if (!isxdigit(key_material[i]) ||
|
||||
!isxdigit(key_material[i+1]))
|
||||
return (B_FALSE);
|
||||
if (sscanf(&key_material[i], "%02hhx", &c) != 1)
|
||||
return (B_FALSE);
|
||||
key_out[i / 2] = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case ZFS_KEYFORMAT_PASSPHRASE:
|
||||
VERIFY0(zap_lookup(dd->dd_pool->dp_meta_objset,
|
||||
dd->dd_crypto_obj, zfs_prop_to_name(ZFS_PROP_PBKDF2_SALT),
|
||||
sizeof (uint64_t), 1, &salt));
|
||||
VERIFY0(zap_lookup(dd->dd_pool->dp_meta_objset,
|
||||
dd->dd_crypto_obj, zfs_prop_to_name(ZFS_PROP_PBKDF2_ITERS),
|
||||
sizeof (uint64_t), 1, &iters));
|
||||
|
||||
if (PKCS5_PBKDF2_HMAC_SHA1(key_material, strlen(key_material),
|
||||
((uint8_t *)&salt), sizeof (uint64_t), iters,
|
||||
WRAPPING_KEY_LEN, key_out) != 1)
|
||||
return (B_FALSE);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
fatal("no support for key format %u\n",
|
||||
(unsigned int) keyformat);
|
||||
}
|
||||
|
||||
return (B_TRUE);
|
||||
}
|
||||
|
||||
static char encroot[ZFS_MAX_DATASET_NAME_LEN];
|
||||
static boolean_t key_loaded = B_FALSE;
|
||||
|
||||
static void
|
||||
zdb_load_key(objset_t *os)
|
||||
{
|
||||
dsl_pool_t *dp;
|
||||
dsl_dir_t *dd, *rdd;
|
||||
uint8_t key[WRAPPING_KEY_LEN];
|
||||
uint64_t rddobj;
|
||||
int err;
|
||||
|
||||
dp = spa_get_dsl(os->os_spa);
|
||||
dd = os->os_dsl_dataset->ds_dir;
|
||||
|
||||
dsl_pool_config_enter(dp, FTAG);
|
||||
VERIFY0(zap_lookup(dd->dd_pool->dp_meta_objset, dd->dd_crypto_obj,
|
||||
DSL_CRYPTO_KEY_ROOT_DDOBJ, sizeof (uint64_t), 1, &rddobj));
|
||||
VERIFY0(dsl_dir_hold_obj(dd->dd_pool, rddobj, NULL, FTAG, &rdd));
|
||||
dsl_dir_name(rdd, encroot);
|
||||
dsl_dir_rele(rdd, FTAG);
|
||||
|
||||
if (!zdb_derive_key(dd, key))
|
||||
fatal("couldn't derive encryption key");
|
||||
|
||||
dsl_pool_config_exit(dp, FTAG);
|
||||
|
||||
ASSERT3U(dsl_dataset_get_keystatus(dd), ==, ZFS_KEYSTATUS_UNAVAILABLE);
|
||||
|
||||
dsl_crypto_params_t *dcp;
|
||||
nvlist_t *crypto_args;
|
||||
|
||||
crypto_args = fnvlist_alloc();
|
||||
fnvlist_add_uint8_array(crypto_args, "wkeydata",
|
||||
(uint8_t *)key, WRAPPING_KEY_LEN);
|
||||
VERIFY0(dsl_crypto_params_create_nvlist(DCP_CMD_NONE,
|
||||
NULL, crypto_args, &dcp));
|
||||
err = spa_keystore_load_wkey(encroot, dcp, B_FALSE);
|
||||
|
||||
dsl_crypto_params_free(dcp, (err != 0));
|
||||
fnvlist_free(crypto_args);
|
||||
|
||||
if (err != 0)
|
||||
fatal(
|
||||
"couldn't load encryption key for %s: %s",
|
||||
encroot, err == ZFS_ERR_CRYPTO_NOTSUP ?
|
||||
"crypto params not supported" : strerror(err));
|
||||
|
||||
ASSERT3U(dsl_dataset_get_keystatus(dd), ==, ZFS_KEYSTATUS_AVAILABLE);
|
||||
|
||||
printf("Unlocked encryption root: %s\n", encroot);
|
||||
key_loaded = B_TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
zdb_unload_key(void)
|
||||
{
|
||||
if (!key_loaded)
|
||||
return;
|
||||
|
||||
VERIFY0(spa_keystore_unload_wkey(encroot));
|
||||
key_loaded = B_FALSE;
|
||||
}
|
||||
|
||||
static avl_tree_t idx_tree;
|
||||
static avl_tree_t domain_tree;
|
||||
static boolean_t fuid_table_loaded;
|
||||
|
@ -3037,12 +3154,36 @@ open_objset(const char *path, const void *tag, objset_t **osp)
|
|||
uint64_t version = 0;
|
||||
|
||||
VERIFY3P(sa_os, ==, NULL);
|
||||
|
||||
/*
|
||||
* We can't own an objset if it's redacted. Therefore, we do this
|
||||
* dance: hold the objset, then acquire a long hold on its dataset, then
|
||||
* release the pool (which is held as part of holding the objset).
|
||||
*/
|
||||
err = dmu_objset_hold(path, tag, osp);
|
||||
|
||||
if (dump_opt['K']) {
|
||||
/* decryption requested, try to load keys */
|
||||
err = dmu_objset_hold(path, tag, osp);
|
||||
if (err != 0) {
|
||||
(void) fprintf(stderr, "failed to hold dataset "
|
||||
"'%s': %s\n",
|
||||
path, strerror(err));
|
||||
return (err);
|
||||
}
|
||||
dsl_dataset_long_hold(dmu_objset_ds(*osp), tag);
|
||||
dsl_pool_rele(dmu_objset_pool(*osp), tag);
|
||||
|
||||
/* succeeds or dies */
|
||||
zdb_load_key(*osp);
|
||||
|
||||
/* release it all */
|
||||
dsl_dataset_long_rele(dmu_objset_ds(*osp), tag);
|
||||
dsl_dataset_rele(dmu_objset_ds(*osp), tag);
|
||||
}
|
||||
|
||||
int ds_hold_flags = key_loaded ? DS_HOLD_FLAG_DECRYPT : 0;
|
||||
|
||||
err = dmu_objset_hold_flags(path, ds_hold_flags, tag, osp);
|
||||
if (err != 0) {
|
||||
(void) fprintf(stderr, "failed to hold dataset '%s': %s\n",
|
||||
path, strerror(err));
|
||||
|
@ -3051,7 +3192,8 @@ open_objset(const char *path, const void *tag, objset_t **osp)
|
|||
dsl_dataset_long_hold(dmu_objset_ds(*osp), tag);
|
||||
dsl_pool_rele(dmu_objset_pool(*osp), tag);
|
||||
|
||||
if (dmu_objset_type(*osp) == DMU_OST_ZFS && !(*osp)->os_encrypted) {
|
||||
if (dmu_objset_type(*osp) == DMU_OST_ZFS &&
|
||||
(key_loaded || !(*osp)->os_encrypted)) {
|
||||
(void) zap_lookup(*osp, MASTER_NODE_OBJ, ZPL_VERSION_STR,
|
||||
8, 1, &version);
|
||||
if (version >= ZPL_VERSION_SA) {
|
||||
|
@ -3064,7 +3206,8 @@ open_objset(const char *path, const void *tag, objset_t **osp)
|
|||
(void) fprintf(stderr, "sa_setup failed: %s\n",
|
||||
strerror(err));
|
||||
dsl_dataset_long_rele(dmu_objset_ds(*osp), tag);
|
||||
dsl_dataset_rele(dmu_objset_ds(*osp), tag);
|
||||
dsl_dataset_rele_flags(dmu_objset_ds(*osp),
|
||||
ds_hold_flags, tag);
|
||||
*osp = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -3080,9 +3223,12 @@ close_objset(objset_t *os, const void *tag)
|
|||
if (os->os_sa != NULL)
|
||||
sa_tear_down(os);
|
||||
dsl_dataset_long_rele(dmu_objset_ds(os), tag);
|
||||
dsl_dataset_rele(dmu_objset_ds(os), tag);
|
||||
dsl_dataset_rele_flags(dmu_objset_ds(os),
|
||||
key_loaded ? DS_HOLD_FLAG_DECRYPT : 0, tag);
|
||||
sa_attr_table = NULL;
|
||||
sa_os = NULL;
|
||||
|
||||
zdb_unload_key();
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -3464,7 +3610,7 @@ dump_object(objset_t *os, uint64_t object, int verbosity,
|
|||
if (error)
|
||||
fatal("dmu_object_info() failed, errno %u", error);
|
||||
|
||||
if (os->os_encrypted &&
|
||||
if (!key_loaded && os->os_encrypted &&
|
||||
DMU_OT_IS_ENCRYPTED(doi.doi_bonus_type)) {
|
||||
error = dnode_hold(os, object, FTAG, &dn);
|
||||
if (error)
|
||||
|
@ -3561,7 +3707,8 @@ dump_object(objset_t *os, uint64_t object, int verbosity,
|
|||
(void) printf("\t\t(bonus encrypted)\n");
|
||||
}
|
||||
|
||||
if (!os->os_encrypted || !DMU_OT_IS_ENCRYPTED(doi.doi_type)) {
|
||||
if (key_loaded ||
|
||||
(!os->os_encrypted || !DMU_OT_IS_ENCRYPTED(doi.doi_type))) {
|
||||
object_viewer[ZDB_OT_TYPE(doi.doi_type)](os, object,
|
||||
NULL, 0);
|
||||
} else {
|
||||
|
@ -4062,7 +4209,7 @@ collect_nvlist_stats(nvlist_t *nvl, zdb_nvl_stats_t *stats)
|
|||
{
|
||||
nvlist_t *list, **array;
|
||||
nvpair_t *nvp = NULL;
|
||||
char *name;
|
||||
const char *name;
|
||||
uint_t i, items;
|
||||
|
||||
stats->zns_list_count++;
|
||||
|
@ -7544,7 +7691,7 @@ dump_mos_leaks(spa_t *spa)
|
|||
mos_obj_refd(spa->spa_errlog_last);
|
||||
mos_obj_refd(spa->spa_errlog_scrub);
|
||||
|
||||
if (!spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
|
||||
if (spa_feature_is_enabled(spa, SPA_FEATURE_HEAD_ERRLOG)) {
|
||||
errorlog_count_refd(mos, spa->spa_errlog_last);
|
||||
errorlog_count_refd(mos, spa->spa_errlog_scrub);
|
||||
}
|
||||
|
@ -8516,6 +8663,7 @@ main(int argc, char **argv)
|
|||
{"intent-logs", no_argument, NULL, 'i'},
|
||||
{"inflight", required_argument, NULL, 'I'},
|
||||
{"checkpointed-state", no_argument, NULL, 'k'},
|
||||
{"key", required_argument, NULL, 'K'},
|
||||
{"label", no_argument, NULL, 'l'},
|
||||
{"disable-leak-tracking", no_argument, NULL, 'L'},
|
||||
{"metaslabs", no_argument, NULL, 'm'},
|
||||
|
@ -8544,7 +8692,7 @@ main(int argc, char **argv)
|
|||
};
|
||||
|
||||
while ((c = getopt_long(argc, argv,
|
||||
"AbcCdDeEFGhiI:klLmMNo:Op:PqrRsSt:uU:vVx:XYyZ",
|
||||
"AbcCdDeEFGhiI:kK:lLmMNo:Op:PqrRsSt:uU:vVx:XYyZ",
|
||||
long_options, NULL)) != -1) {
|
||||
switch (c) {
|
||||
case 'b':
|
||||
|
@ -8595,6 +8743,12 @@ main(int argc, char **argv)
|
|||
usage();
|
||||
}
|
||||
break;
|
||||
case 'K':
|
||||
dump_opt[c]++;
|
||||
key_material = strdup(optarg);
|
||||
/* redact key material in process table */
|
||||
while (*optarg != '\0') { *optarg++ = '*'; }
|
||||
break;
|
||||
case 'o':
|
||||
error = set_global_var(optarg);
|
||||
if (error != 0)
|
||||
|
@ -8656,8 +8810,8 @@ main(int argc, char **argv)
|
|||
* ZDB does not typically re-read blocks; therefore limit the ARC
|
||||
* to 256 MB, which can be used entirely for metadata.
|
||||
*/
|
||||
zfs_arc_min = zfs_arc_meta_min = 2ULL << SPA_MAXBLOCKSHIFT;
|
||||
zfs_arc_max = zfs_arc_meta_limit = 256 * 1024 * 1024;
|
||||
zfs_arc_min = 2ULL << SPA_MAXBLOCKSHIFT;
|
||||
zfs_arc_max = 256 * 1024 * 1024;
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -8689,7 +8843,7 @@ main(int argc, char **argv)
|
|||
verbose = MAX(verbose, 1);
|
||||
|
||||
for (c = 0; c < 256; c++) {
|
||||
if (dump_all && strchr("AeEFklLNOPrRSXy", c) == NULL)
|
||||
if (dump_all && strchr("AeEFkKlLNOPrRSXy", c) == NULL)
|
||||
dump_opt[c] = 1;
|
||||
if (dump_opt[c])
|
||||
dump_opt[c] += verbose;
|
||||
|
|
|
@ -307,6 +307,23 @@ zil_prt_rec_acl(zilog_t *zilog, int txtype, const void *arg)
|
|||
(u_longlong_t)lr->lr_foid, (u_longlong_t)lr->lr_aclcnt);
|
||||
}
|
||||
|
||||
static void
|
||||
zil_prt_rec_clone_range(zilog_t *zilog, int txtype, const void *arg)
|
||||
{
|
||||
(void) zilog, (void) txtype;
|
||||
const lr_clone_range_t *lr = arg;
|
||||
|
||||
(void) printf("%sfoid %llu, offset %llx, length %llx, blksize %llx\n",
|
||||
tab_prefix, (u_longlong_t)lr->lr_foid, (u_longlong_t)lr->lr_offset,
|
||||
(u_longlong_t)lr->lr_length, (u_longlong_t)lr->lr_blksz);
|
||||
|
||||
for (unsigned int i = 0; i < lr->lr_nbps; i++) {
|
||||
(void) printf("%s[%u/%llu] ", tab_prefix, i + 1,
|
||||
(u_longlong_t)lr->lr_nbps);
|
||||
print_log_bp(&lr->lr_bps[i], "");
|
||||
}
|
||||
}
|
||||
|
||||
typedef void (*zil_prt_rec_func_t)(zilog_t *, int, const void *);
|
||||
typedef struct zil_rec_info {
|
||||
zil_prt_rec_func_t zri_print;
|
||||
|
@ -340,6 +357,8 @@ static zil_rec_info_t zil_rec_info[TX_MAX_TYPE] = {
|
|||
.zri_name = "TX_SETSAXATTR "},
|
||||
{.zri_print = zil_prt_rec_rename, .zri_name = "TX_RENAME_EXCHANGE "},
|
||||
{.zri_print = zil_prt_rec_rename, .zri_name = "TX_RENAME_WHITEOUT "},
|
||||
{.zri_print = zil_prt_rec_clone_range,
|
||||
.zri_name = "TX_CLONE_RANGE "},
|
||||
};
|
||||
|
||||
static int
|
||||
|
|
|
@ -359,7 +359,7 @@ static void
|
|||
zed_log_fault(nvlist_t *nvl, const char *uuid, const char *code)
|
||||
{
|
||||
nvlist_t *rsrc;
|
||||
char *strval;
|
||||
const char *strval;
|
||||
uint64_t guid;
|
||||
uint8_t byte;
|
||||
|
||||
|
@ -389,7 +389,7 @@ zed_log_fault(nvlist_t *nvl, const char *uuid, const char *code)
|
|||
static const char *
|
||||
fmd_fault_mkcode(nvlist_t *fault)
|
||||
{
|
||||
char *class;
|
||||
const char *class;
|
||||
const char *code = "-";
|
||||
|
||||
/*
|
||||
|
@ -708,7 +708,7 @@ int
|
|||
fmd_nvl_class_match(fmd_hdl_t *hdl, nvlist_t *nvl, const char *pattern)
|
||||
{
|
||||
(void) hdl;
|
||||
char *class;
|
||||
const char *class;
|
||||
|
||||
return (nvl != NULL &&
|
||||
nvlist_lookup_string(nvl, FM_CLASS, &class) == 0 &&
|
||||
|
|
|
@ -64,7 +64,7 @@ typedef enum device_type {
|
|||
typedef struct guid_search {
|
||||
uint64_t gs_pool_guid;
|
||||
uint64_t gs_vdev_guid;
|
||||
char *gs_devid;
|
||||
const char *gs_devid;
|
||||
device_type_t gs_vdev_type;
|
||||
uint64_t gs_vdev_expandtime; /* vdev expansion time */
|
||||
} guid_search_t;
|
||||
|
@ -77,7 +77,7 @@ static boolean_t
|
|||
zfs_agent_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *arg)
|
||||
{
|
||||
guid_search_t *gsp = arg;
|
||||
char *path = NULL;
|
||||
const char *path = NULL;
|
||||
uint_t c, children;
|
||||
nvlist_t **child;
|
||||
uint64_t vdev_guid;
|
||||
|
@ -211,7 +211,7 @@ zfs_agent_post_event(const char *class, const char *subclass, nvlist_t *nvl)
|
|||
uint64_t pool_guid = 0, vdev_guid = 0;
|
||||
guid_search_t search = { 0 };
|
||||
device_type_t devtype = DEVICE_TYPE_PRIMARY;
|
||||
char *devid = NULL;
|
||||
const char *devid = NULL;
|
||||
|
||||
class = "resource.fs.zfs.removed";
|
||||
subclass = "";
|
||||
|
|
|
@ -464,7 +464,7 @@ zfs_fm_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class)
|
|||
nvlist_t *detector;
|
||||
boolean_t pool_found = B_FALSE;
|
||||
boolean_t isresource;
|
||||
char *type;
|
||||
const char *type;
|
||||
|
||||
/*
|
||||
* We subscribe to notifications for vdev or pool removal. In these
|
||||
|
@ -780,7 +780,7 @@ zfs_fm_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class)
|
|||
ZFS_MAKE_EREPORT(FM_EREPORT_ZFS_IO_FAILURE)) ||
|
||||
fmd_nvl_class_match(hdl, nvl,
|
||||
ZFS_MAKE_EREPORT(FM_EREPORT_ZFS_PROBE_FAILURE))) {
|
||||
char *failmode = NULL;
|
||||
const char *failmode = NULL;
|
||||
boolean_t checkremove = B_FALSE;
|
||||
uint32_t pri = 0;
|
||||
int32_t flags = 0;
|
||||
|
|
|
@ -183,7 +183,7 @@ zfs_unavail_pool(zpool_handle_t *zhp, void *data)
|
|||
static void
|
||||
zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
||||
{
|
||||
char *path;
|
||||
const char *path;
|
||||
vdev_state_t newstate;
|
||||
nvlist_t *nvroot, *newvd;
|
||||
pendingdev_t *device;
|
||||
|
@ -191,7 +191,7 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||
uint64_t offline = 0ULL, faulted = 0ULL;
|
||||
uint64_t guid = 0ULL;
|
||||
uint64_t is_spare = 0;
|
||||
char *physpath = NULL, *new_devid = NULL, *enc_sysfs_path = NULL;
|
||||
const char *physpath = NULL, *new_devid = NULL, *enc_sysfs_path = NULL;
|
||||
char rawpath[PATH_MAX], fullpath[PATH_MAX];
|
||||
char devpath[PATH_MAX];
|
||||
int ret;
|
||||
|
@ -549,7 +549,7 @@ static void
|
|||
zfs_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *data)
|
||||
{
|
||||
dev_data_t *dp = data;
|
||||
char *path = NULL;
|
||||
const char *path = NULL;
|
||||
uint_t c, children;
|
||||
nvlist_t **child;
|
||||
uint64_t guid = 0;
|
||||
|
@ -851,7 +851,7 @@ guid_iter(uint64_t pool_guid, uint64_t vdev_guid, const char *devid,
|
|||
static int
|
||||
zfs_deliver_add(nvlist_t *nvl)
|
||||
{
|
||||
char *devpath = NULL, *devid = NULL;
|
||||
const char *devpath = NULL, *devid = NULL;
|
||||
uint64_t pool_guid = 0, vdev_guid = 0;
|
||||
boolean_t is_slice;
|
||||
|
||||
|
@ -999,7 +999,8 @@ zfsdle_vdev_online(zpool_handle_t *zhp, void *data)
|
|||
nvlist_t *tgt;
|
||||
int error;
|
||||
|
||||
char *tmp_devname, devname[MAXPATHLEN] = "";
|
||||
const char *tmp_devname;
|
||||
char devname[MAXPATHLEN] = "";
|
||||
uint64_t guid;
|
||||
|
||||
if (nvlist_lookup_uint64(udev_nvl, ZFS_EV_VDEV_GUID, &guid) == 0) {
|
||||
|
@ -1017,7 +1018,8 @@ zfsdle_vdev_online(zpool_handle_t *zhp, void *data)
|
|||
|
||||
if ((tgt = zpool_find_vdev_by_physpath(zhp, devname,
|
||||
&avail_spare, &l2cache, NULL)) != NULL) {
|
||||
char *path, fullpath[MAXPATHLEN];
|
||||
const char *path;
|
||||
char fullpath[MAXPATHLEN];
|
||||
uint64_t wholedisk = 0;
|
||||
|
||||
error = nvlist_lookup_string(tgt, ZPOOL_CONFIG_PATH, &path);
|
||||
|
@ -1030,10 +1032,11 @@ zfsdle_vdev_online(zpool_handle_t *zhp, void *data)
|
|||
&wholedisk);
|
||||
|
||||
if (wholedisk) {
|
||||
char *tmp;
|
||||
path = strrchr(path, '/');
|
||||
if (path != NULL) {
|
||||
path = zfs_strip_partition(path + 1);
|
||||
if (path == NULL) {
|
||||
tmp = zfs_strip_partition(path + 1);
|
||||
if (tmp == NULL) {
|
||||
zpool_close(zhp);
|
||||
return (0);
|
||||
}
|
||||
|
@ -1042,8 +1045,8 @@ zfsdle_vdev_online(zpool_handle_t *zhp, void *data)
|
|||
return (0);
|
||||
}
|
||||
|
||||
(void) strlcpy(fullpath, path, sizeof (fullpath));
|
||||
free(path);
|
||||
(void) strlcpy(fullpath, tmp, sizeof (fullpath));
|
||||
free(tmp);
|
||||
|
||||
/*
|
||||
* We need to reopen the pool associated with this
|
||||
|
@ -1148,7 +1151,8 @@ zfsdle_vdev_online(zpool_handle_t *zhp, void *data)
|
|||
static int
|
||||
zfs_deliver_dle(nvlist_t *nvl)
|
||||
{
|
||||
char *devname, name[MAXPATHLEN];
|
||||
const char *devname;
|
||||
char name[MAXPATHLEN];
|
||||
uint64_t guid;
|
||||
|
||||
if (nvlist_lookup_uint64(nvl, ZFS_EV_VDEV_GUID, &guid) == 0) {
|
||||
|
|
|
@ -282,7 +282,7 @@ replace_with_spare(fmd_hdl_t *hdl, zpool_handle_t *zhp, nvlist_t *vdev)
|
|||
*/
|
||||
for (s = 0; s < nspares; s++) {
|
||||
boolean_t rebuild = B_FALSE;
|
||||
char *spare_name, *type;
|
||||
const char *spare_name, *type;
|
||||
|
||||
if (nvlist_lookup_string(spares[s], ZPOOL_CONFIG_PATH,
|
||||
&spare_name) != 0)
|
||||
|
@ -377,9 +377,9 @@ zfs_retire_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl,
|
|||
boolean_t is_repair;
|
||||
boolean_t l2arc = B_FALSE;
|
||||
boolean_t spare = B_FALSE;
|
||||
char *scheme;
|
||||
const char *scheme;
|
||||
nvlist_t *vdev = NULL;
|
||||
char *uuid;
|
||||
const char *uuid;
|
||||
int repair_done = 0;
|
||||
boolean_t retire;
|
||||
boolean_t is_disk;
|
||||
|
@ -401,7 +401,7 @@ zfs_retire_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl,
|
|||
if (strcmp(class, "resource.fs.zfs.removed") == 0 ||
|
||||
(strcmp(class, "resource.fs.zfs.statechange") == 0 &&
|
||||
(state == VDEV_STATE_REMOVED || state == VDEV_STATE_FAULTED))) {
|
||||
char *devtype;
|
||||
const char *devtype;
|
||||
char *devname;
|
||||
|
||||
if (nvlist_lookup_string(nvl, FM_EREPORT_PAYLOAD_ZFS_VDEV_TYPE,
|
||||
|
|
|
@ -60,7 +60,7 @@ struct udev_monitor *g_mon;
|
|||
static void
|
||||
zed_udev_event(const char *class, const char *subclass, nvlist_t *nvl)
|
||||
{
|
||||
char *strval;
|
||||
const char *strval;
|
||||
uint64_t numval;
|
||||
|
||||
zed_log_msg(LOG_INFO, "zed_disk_event:");
|
||||
|
@ -178,7 +178,8 @@ static void *
|
|||
zed_udev_monitor(void *arg)
|
||||
{
|
||||
struct udev_monitor *mon = arg;
|
||||
char *tmp, *tmp2;
|
||||
const char *tmp;
|
||||
char *tmp2;
|
||||
|
||||
zed_log_msg(LOG_INFO, "Waiting for new udev disk events...");
|
||||
|
||||
|
@ -336,7 +337,7 @@ zed_udev_monitor(void *arg)
|
|||
if (strcmp(class, EC_DEV_STATUS) == 0 &&
|
||||
udev_device_get_property_value(dev, "DM_UUID") &&
|
||||
udev_device_get_property_value(dev, "MPATH_SBIN_PATH")) {
|
||||
tmp = (char *)udev_device_get_devnode(dev);
|
||||
tmp = udev_device_get_devnode(dev);
|
||||
tmp2 = zfs_get_underlying_path(tmp);
|
||||
if (tmp && tmp2 && (strcmp(tmp, tmp2) != 0)) {
|
||||
/*
|
||||
|
@ -353,8 +354,7 @@ zed_udev_monitor(void *arg)
|
|||
class = EC_DEV_ADD;
|
||||
subclass = ESC_DISK;
|
||||
} else {
|
||||
tmp = (char *)
|
||||
udev_device_get_property_value(dev,
|
||||
tmp = udev_device_get_property_value(dev,
|
||||
"DM_NR_VALID_PATHS");
|
||||
/* treat as a multipath remove */
|
||||
if (tmp != NULL && strcmp(tmp, "0") == 0) {
|
||||
|
|
|
@ -612,7 +612,7 @@ _zed_event_add_string_array(uint64_t eid, zed_strings_t *zsp,
|
|||
char buf[MAXBUF];
|
||||
int buflen = sizeof (buf);
|
||||
const char *name;
|
||||
char **strp;
|
||||
const char **strp;
|
||||
uint_t nelem;
|
||||
uint_t i;
|
||||
char *p;
|
||||
|
@ -652,7 +652,7 @@ _zed_event_add_nvpair(uint64_t eid, zed_strings_t *zsp, nvpair_t *nvp)
|
|||
uint16_t i16;
|
||||
uint32_t i32;
|
||||
uint64_t i64;
|
||||
char *str;
|
||||
const char *str;
|
||||
|
||||
assert(zsp != NULL);
|
||||
assert(nvp != NULL);
|
||||
|
@ -935,7 +935,7 @@ zed_event_service(struct zed_conf *zcp)
|
|||
uint64_t eid;
|
||||
int64_t *etime;
|
||||
uint_t nelem;
|
||||
char *class;
|
||||
const char *class;
|
||||
const char *subclass;
|
||||
int rv;
|
||||
|
||||
|
|
|
@ -348,7 +348,7 @@ zfs_sort(const void *larg, const void *rarg, void *data)
|
|||
|
||||
for (psc = sc; psc != NULL; psc = psc->sc_next) {
|
||||
char lbuf[ZFS_MAXPROPLEN], rbuf[ZFS_MAXPROPLEN];
|
||||
char *lstr, *rstr;
|
||||
const char *lstr, *rstr;
|
||||
uint64_t lnum = 0, rnum = 0;
|
||||
boolean_t lvalid, rvalid;
|
||||
int ret = 0;
|
||||
|
|
|
@ -1049,7 +1049,7 @@ zfs_do_create(int argc, char **argv)
|
|||
int ret = 1;
|
||||
nvlist_t *props;
|
||||
uint64_t intval;
|
||||
char *strval;
|
||||
const char *strval;
|
||||
|
||||
if (nvlist_alloc(&props, NV_UNIQUE_NAME, 0) != 0)
|
||||
nomem();
|
||||
|
@ -1173,11 +1173,12 @@ zfs_do_create(int argc, char **argv)
|
|||
|
||||
if (volblocksize != ZVOL_DEFAULT_BLOCKSIZE &&
|
||||
nvlist_lookup_string(props, prop, &strval) != 0) {
|
||||
if (asprintf(&strval, "%llu",
|
||||
char *tmp;
|
||||
if (asprintf(&tmp, "%llu",
|
||||
(u_longlong_t)volblocksize) == -1)
|
||||
nomem();
|
||||
nvlist_add_string(props, prop, strval);
|
||||
free(strval);
|
||||
nvlist_add_string(props, prop, tmp);
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1252,7 +1253,7 @@ zfs_do_create(int argc, char **argv)
|
|||
dryrun ? "would create %s\n" : "create %s\n", argv[0]);
|
||||
while ((nvp = nvlist_next_nvpair(props, nvp)) != NULL) {
|
||||
uint64_t uval;
|
||||
char *sval;
|
||||
const char *sval;
|
||||
|
||||
switch (nvpair_type(nvp)) {
|
||||
case DATA_TYPE_UINT64:
|
||||
|
@ -2701,8 +2702,8 @@ us_compare(const void *larg, const void *rarg, void *unused)
|
|||
boolean_t lvb, rvb;
|
||||
|
||||
for (; sortcol != NULL; sortcol = sortcol->sc_next) {
|
||||
char *lvstr = (char *)"";
|
||||
char *rvstr = (char *)"";
|
||||
const char *lvstr = "";
|
||||
const char *rvstr = "";
|
||||
uint32_t lv32 = 0;
|
||||
uint32_t rv32 = 0;
|
||||
uint64_t lv64 = 0;
|
||||
|
@ -3440,6 +3441,8 @@ print_header(list_cbdata_t *cb)
|
|||
boolean_t first = B_TRUE;
|
||||
boolean_t right_justify;
|
||||
|
||||
color_start(ANSI_BOLD);
|
||||
|
||||
for (; pl != NULL; pl = pl->pl_next) {
|
||||
if (!first) {
|
||||
(void) printf(" ");
|
||||
|
@ -3466,9 +3469,31 @@ print_header(list_cbdata_t *cb)
|
|||
(void) printf("%-*s", (int)pl->pl_width, header);
|
||||
}
|
||||
|
||||
color_end();
|
||||
|
||||
(void) printf("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Decides on the color that the avail value should be printed in.
|
||||
* > 80% used = yellow
|
||||
* > 90% used = red
|
||||
*/
|
||||
static const char *
|
||||
zfs_list_avail_color(zfs_handle_t *zhp)
|
||||
{
|
||||
uint64_t used = zfs_prop_get_int(zhp, ZFS_PROP_USED);
|
||||
uint64_t avail = zfs_prop_get_int(zhp, ZFS_PROP_AVAILABLE);
|
||||
int percentage = (int)((double)avail / MAX(avail + used, 1) * 100);
|
||||
|
||||
if (percentage > 20)
|
||||
return (NULL);
|
||||
else if (percentage > 10)
|
||||
return (ANSI_YELLOW);
|
||||
else
|
||||
return (ANSI_RED);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a dataset and a list of fields, print out all the properties according
|
||||
* to the described layout.
|
||||
|
@ -3531,6 +3556,9 @@ print_dataset(zfs_handle_t *zhp, list_cbdata_t *cb)
|
|||
right_justify = B_FALSE;
|
||||
}
|
||||
|
||||
if (pl->pl_prop == ZFS_PROP_AVAILABLE)
|
||||
color_start(zfs_list_avail_color(zhp));
|
||||
|
||||
/*
|
||||
* If this is being called in scripted mode, or if this is the
|
||||
* last column and it is left-justified, don't include a width
|
||||
|
@ -3542,6 +3570,9 @@ print_dataset(zfs_handle_t *zhp, list_cbdata_t *cb)
|
|||
(void) printf("%*s", (int)pl->pl_width, propstr);
|
||||
else
|
||||
(void) printf("%-*s", (int)pl->pl_width, propstr);
|
||||
|
||||
if (pl->pl_prop == ZFS_PROP_AVAILABLE)
|
||||
color_end();
|
||||
}
|
||||
|
||||
(void) putchar('\n');
|
||||
|
@ -3882,10 +3913,25 @@ zfs_do_redact(int argc, char **argv)
|
|||
switch (err) {
|
||||
case 0:
|
||||
break;
|
||||
case ENOENT:
|
||||
(void) fprintf(stderr,
|
||||
gettext("provided snapshot %s does not exist\n"), snap);
|
||||
case ENOENT: {
|
||||
zfs_handle_t *zhp = zfs_open(g_zfs, snap, ZFS_TYPE_SNAPSHOT);
|
||||
if (zhp == NULL) {
|
||||
(void) fprintf(stderr, gettext("provided snapshot %s "
|
||||
"does not exist\n"), snap);
|
||||
} else {
|
||||
zfs_close(zhp);
|
||||
}
|
||||
for (int i = 0; i < numrsnaps; i++) {
|
||||
zhp = zfs_open(g_zfs, rsnaps[i], ZFS_TYPE_SNAPSHOT);
|
||||
if (zhp == NULL) {
|
||||
(void) fprintf(stderr, gettext("provided "
|
||||
"snapshot %s does not exist\n"), rsnaps[i]);
|
||||
} else {
|
||||
zfs_close(zhp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EEXIST:
|
||||
(void) fprintf(stderr, gettext("specified redaction bookmark "
|
||||
"(%s) provided already exists\n"), bookname);
|
||||
|
@ -6480,7 +6526,7 @@ print_holds(boolean_t scripted, int nwidth, int tagwidth, nvlist_t *nvl,
|
|||
}
|
||||
|
||||
while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
|
||||
char *zname = nvpair_name(nvp);
|
||||
const char *zname = nvpair_name(nvp);
|
||||
nvlist_t *nvl2;
|
||||
nvpair_t *nvp2 = NULL;
|
||||
(void) nvpair_value_nvlist(nvp, &nvl2);
|
||||
|
@ -8080,7 +8126,7 @@ zfs_do_channel_program(int argc, char **argv)
|
|||
const char *msg = gettext("Channel program execution failed");
|
||||
uint64_t instructions = 0;
|
||||
if (outnvl != NULL && nvlist_exists(outnvl, ZCP_RET_ERROR)) {
|
||||
char *es = NULL;
|
||||
const char *es = NULL;
|
||||
(void) nvlist_lookup_string(outnvl,
|
||||
ZCP_RET_ERROR, &es);
|
||||
if (es == NULL)
|
||||
|
|
|
@ -564,9 +564,9 @@ for_each_vdev_run_cb(void *zhp_data, nvlist_t *nv, void *cb_vcdl)
|
|||
{
|
||||
vdev_cmd_data_list_t *vcdl = cb_vcdl;
|
||||
vdev_cmd_data_t *data;
|
||||
char *path = NULL;
|
||||
const char *path = NULL;
|
||||
char *vname = NULL;
|
||||
char *vdev_enc_sysfs_path = NULL;
|
||||
const char *vdev_enc_sysfs_path = NULL;
|
||||
int i, match = 0;
|
||||
zpool_handle_t *zhp = zhp_data;
|
||||
|
||||
|
|
|
@ -712,7 +712,7 @@ print_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent,
|
|||
|
||||
for (c = 0; c < children; c++) {
|
||||
uint64_t is_log = B_FALSE, is_hole = B_FALSE;
|
||||
char *class = (char *)"";
|
||||
const char *class = "";
|
||||
|
||||
(void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_HOLE,
|
||||
&is_hole);
|
||||
|
@ -724,7 +724,7 @@ print_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent,
|
|||
(void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
|
||||
&is_log);
|
||||
if (is_log)
|
||||
class = (char *)VDEV_ALLOC_BIAS_LOG;
|
||||
class = VDEV_ALLOC_BIAS_LOG;
|
||||
(void) nvlist_lookup_string(child[c],
|
||||
ZPOOL_CONFIG_ALLOCATION_BIAS, &class);
|
||||
if (strcmp(match, class) != 0)
|
||||
|
@ -811,7 +811,7 @@ add_prop_list(const char *propname, const char *propval, nvlist_t **props,
|
|||
zpool_prop_t prop = ZPOOL_PROP_INVAL;
|
||||
nvlist_t *proplist;
|
||||
const char *normnm;
|
||||
char *strval;
|
||||
const char *strval;
|
||||
|
||||
if (*props == NULL &&
|
||||
nvlist_alloc(props, NV_UNIQUE_NAME, 0) != 0) {
|
||||
|
@ -909,7 +909,7 @@ static int
|
|||
add_prop_list_default(const char *propname, const char *propval,
|
||||
nvlist_t **props)
|
||||
{
|
||||
char *pval;
|
||||
const char *pval;
|
||||
|
||||
if (nvlist_lookup_string(*props, propname, &pval) == 0)
|
||||
return (0);
|
||||
|
@ -1288,7 +1288,6 @@ zpool_do_labelclear(int argc, char **argv)
|
|||
{
|
||||
char vdev[MAXPATHLEN];
|
||||
char *name = NULL;
|
||||
struct stat st;
|
||||
int c, fd = -1, ret = 0;
|
||||
nvlist_t *config;
|
||||
pool_state_t state;
|
||||
|
@ -1321,14 +1320,20 @@ zpool_do_labelclear(int argc, char **argv)
|
|||
usage(B_FALSE);
|
||||
}
|
||||
|
||||
(void) strlcpy(vdev, argv[0], sizeof (vdev));
|
||||
|
||||
/*
|
||||
* Check if we were given absolute path and use it as is.
|
||||
* If we cannot open an absolute path, we quit.
|
||||
* Otherwise if the provided vdev name doesn't point to a file,
|
||||
* try prepending expected disk paths and partition numbers.
|
||||
*/
|
||||
(void) strlcpy(vdev, argv[0], sizeof (vdev));
|
||||
if (vdev[0] != '/' && stat(vdev, &st) != 0) {
|
||||
if ((fd = open(vdev, O_RDWR)) < 0) {
|
||||
int error;
|
||||
if (vdev[0] == '/') {
|
||||
(void) fprintf(stderr, gettext("failed to open "
|
||||
"%s: %s\n"), vdev, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
|
||||
error = zfs_resolve_shortname(argv[0], vdev, MAXPATHLEN);
|
||||
if (error == 0 && zfs_dev_is_whole_disk(vdev)) {
|
||||
|
@ -1336,20 +1341,21 @@ zpool_do_labelclear(int argc, char **argv)
|
|||
error = ENOENT;
|
||||
}
|
||||
|
||||
if (error || (stat(vdev, &st) != 0)) {
|
||||
(void) fprintf(stderr, gettext(
|
||||
"failed to find device %s, try specifying absolute "
|
||||
"path instead\n"), argv[0]);
|
||||
if (error || ((fd = open(vdev, O_RDWR)) < 0)) {
|
||||
if (errno == ENOENT) {
|
||||
(void) fprintf(stderr, gettext(
|
||||
"failed to find device %s, try "
|
||||
"specifying absolute path instead\n"),
|
||||
argv[0]);
|
||||
return (1);
|
||||
}
|
||||
|
||||
(void) fprintf(stderr, gettext("failed to open %s:"
|
||||
" %s\n"), vdev, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
if ((fd = open(vdev, O_RDWR)) < 0) {
|
||||
(void) fprintf(stderr, gettext("failed to open %s: %s\n"),
|
||||
vdev, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Flush all dirty pages for the block device. This should not be
|
||||
* fatal when the device does not support BLKFLSBUF as would be the
|
||||
|
@ -1755,7 +1761,7 @@ zpool_do_create(int argc, char **argv)
|
|||
*/
|
||||
for (spa_feature_t i = 0; i < SPA_FEATURES; i++) {
|
||||
char propname[MAXPATHLEN];
|
||||
char *propval;
|
||||
const char *propval;
|
||||
zfeature_info_t *feat = &spa_feature_table[i];
|
||||
|
||||
(void) snprintf(propname, sizeof (propname),
|
||||
|
@ -2083,7 +2089,7 @@ is_blank_str(const char *str)
|
|||
|
||||
/* Print command output lines for specific vdev in a specific pool */
|
||||
static void
|
||||
zpool_print_cmd(vdev_cmd_data_list_t *vcdl, const char *pool, char *path)
|
||||
zpool_print_cmd(vdev_cmd_data_list_t *vcdl, const char *pool, const char *path)
|
||||
{
|
||||
vdev_cmd_data_t *data;
|
||||
int i, j;
|
||||
|
@ -2275,8 +2281,8 @@ print_status_config(zpool_handle_t *zhp, status_cbdata_t *cb, const char *name,
|
|||
uint64_t notpresent;
|
||||
spare_cbdata_t spare_cb;
|
||||
const char *state;
|
||||
char *type;
|
||||
char *path = NULL;
|
||||
const char *type;
|
||||
const char *path = NULL;
|
||||
const char *rcolor = NULL, *wcolor = NULL, *ccolor = NULL;
|
||||
|
||||
if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
|
||||
|
@ -2544,7 +2550,8 @@ print_import_config(status_cbdata_t *cb, const char *name, nvlist_t *nv,
|
|||
nvlist_t **child;
|
||||
uint_t c, children;
|
||||
vdev_stat_t *vs;
|
||||
char *type, *vname;
|
||||
const char *type;
|
||||
char *vname;
|
||||
|
||||
verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
|
||||
if (strcmp(type, VDEV_TYPE_MISSING) == 0 ||
|
||||
|
@ -2672,8 +2679,8 @@ print_class_vdevs(zpool_handle_t *zhp, status_cbdata_t *cb, nvlist_t *nv,
|
|||
|
||||
for (c = 0; c < children; c++) {
|
||||
uint64_t is_log = B_FALSE;
|
||||
char *bias = NULL;
|
||||
char *type = NULL;
|
||||
const char *bias = NULL;
|
||||
const char *type = NULL;
|
||||
|
||||
(void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
|
||||
&is_log);
|
||||
|
@ -2716,7 +2723,7 @@ show_import(nvlist_t *config, boolean_t report_error)
|
|||
{
|
||||
uint64_t pool_state;
|
||||
vdev_stat_t *vs;
|
||||
char *name;
|
||||
const char *name;
|
||||
uint64_t guid;
|
||||
uint64_t hostid = 0;
|
||||
const char *msgid;
|
||||
|
@ -2726,7 +2733,7 @@ show_import(nvlist_t *config, boolean_t report_error)
|
|||
zpool_errata_t errata;
|
||||
const char *health;
|
||||
uint_t vsc;
|
||||
char *comment;
|
||||
const char *comment;
|
||||
status_cbdata_t cb = { 0 };
|
||||
|
||||
verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
|
||||
|
@ -3279,7 +3286,7 @@ import_pools(nvlist_t *pools, nvlist_t *props, char *mntopts, int flags,
|
|||
(void) show_import(config, B_TRUE);
|
||||
}
|
||||
} else if (import->poolname != NULL) {
|
||||
char *name;
|
||||
const char *name;
|
||||
|
||||
/*
|
||||
* We are searching for a pool based on name.
|
||||
|
@ -3354,7 +3361,7 @@ name_or_guid_exists(zpool_handle_t *zhp, void *data)
|
|||
return (0);
|
||||
|
||||
if (args->poolname != NULL) {
|
||||
char *pool_name;
|
||||
const char *pool_name;
|
||||
|
||||
verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
|
||||
&pool_name) == 0);
|
||||
|
@ -4214,6 +4221,8 @@ print_iostat_header_impl(iostat_cbdata_t *cb, unsigned int force_column_width,
|
|||
unsigned int namewidth;
|
||||
const char *title;
|
||||
|
||||
color_start(ANSI_BOLD);
|
||||
|
||||
if (cb->cb_flags & IOS_ANYHISTO_M) {
|
||||
title = histo_to_title[IOS_HISTO_IDX(cb->cb_flags)];
|
||||
} else if (cb->cb_vdevs.cb_names_count) {
|
||||
|
@ -4247,6 +4256,8 @@ print_iostat_header_impl(iostat_cbdata_t *cb, unsigned int force_column_width,
|
|||
if (cb->vcdl != NULL)
|
||||
print_cmd_columns(cb->vcdl, 1);
|
||||
|
||||
color_end();
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
@ -4256,6 +4267,35 @@ print_iostat_header(iostat_cbdata_t *cb)
|
|||
print_iostat_header_impl(cb, 0, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Prints a size string (i.e. 120M) with the suffix ("M") colored
|
||||
* by order of magnitude. Uses column_size to add padding.
|
||||
*/
|
||||
static void
|
||||
print_stat_color(char *statbuf, unsigned int column_size)
|
||||
{
|
||||
fputs(" ", stdout);
|
||||
if (*statbuf == '0') {
|
||||
color_start(ANSI_GRAY);
|
||||
fputc('0', stdout);
|
||||
column_size--;
|
||||
} else {
|
||||
for (; *statbuf; statbuf++) {
|
||||
if (*statbuf == 'K') color_start(ANSI_GREEN);
|
||||
else if (*statbuf == 'M') color_start(ANSI_YELLOW);
|
||||
else if (*statbuf == 'G') color_start(ANSI_RED);
|
||||
else if (*statbuf == 'T') color_start(ANSI_BOLD_BLUE);
|
||||
else if (*statbuf == 'P') color_start(ANSI_MAGENTA);
|
||||
else if (*statbuf == 'E') color_start(ANSI_CYAN);
|
||||
fputc(*statbuf, stdout);
|
||||
if (--column_size <= 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
color_end();
|
||||
for (; column_size > 0; column_size--)
|
||||
fputc(' ', stdout);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display a single statistic.
|
||||
|
@ -4271,7 +4311,7 @@ print_one_stat(uint64_t value, enum zfs_nicenum_format format,
|
|||
if (scripted)
|
||||
printf("\t%s", buf);
|
||||
else
|
||||
printf(" %*s", column_size, buf);
|
||||
print_stat_color(buf, column_size);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -4790,7 +4830,7 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
|||
}
|
||||
|
||||
if (cb->vcdl != NULL) {
|
||||
char *path;
|
||||
const char *path;
|
||||
if (nvlist_lookup_string(newnv, ZPOOL_CONFIG_PATH,
|
||||
&path) == 0) {
|
||||
printf(" ");
|
||||
|
@ -4855,13 +4895,13 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
|||
|
||||
for (c = 0; c < children; c++) {
|
||||
uint64_t islog = B_FALSE;
|
||||
char *bias = NULL;
|
||||
char *type = NULL;
|
||||
const char *bias = NULL;
|
||||
const char *type = NULL;
|
||||
|
||||
(void) nvlist_lookup_uint64(newchild[c],
|
||||
ZPOOL_CONFIG_IS_LOG, &islog);
|
||||
if (islog) {
|
||||
bias = (char *)VDEV_ALLOC_CLASS_LOGS;
|
||||
bias = VDEV_ALLOC_CLASS_LOGS;
|
||||
} else {
|
||||
(void) nvlist_lookup_string(newchild[c],
|
||||
ZPOOL_CONFIG_ALLOCATION_BIAS, &bias);
|
||||
|
@ -6221,12 +6261,12 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
|
|||
boolean_t printed = B_FALSE;
|
||||
|
||||
for (c = 0; c < children; c++) {
|
||||
char *bias = NULL;
|
||||
char *type = NULL;
|
||||
const char *bias = NULL;
|
||||
const char *type = NULL;
|
||||
|
||||
if (nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
|
||||
&islog) == 0 && islog) {
|
||||
bias = (char *)VDEV_ALLOC_CLASS_LOGS;
|
||||
bias = VDEV_ALLOC_CLASS_LOGS;
|
||||
} else {
|
||||
(void) nvlist_lookup_string(child[c],
|
||||
ZPOOL_CONFIG_ALLOCATION_BIAS, &bias);
|
||||
|
@ -9525,7 +9565,8 @@ typedef struct ev_opts {
|
|||
static void
|
||||
zpool_do_events_short(nvlist_t *nvl, ev_opts_t *opts)
|
||||
{
|
||||
char ctime_str[26], str[32], *ptr;
|
||||
char ctime_str[26], str[32];
|
||||
const char *ptr;
|
||||
int64_t *tv;
|
||||
uint_t n;
|
||||
|
||||
|
@ -9561,7 +9602,7 @@ zpool_do_events_nvprint(nvlist_t *nvl, int depth)
|
|||
uint16_t i16;
|
||||
uint32_t i32;
|
||||
uint64_t i64;
|
||||
char *str;
|
||||
const char *str;
|
||||
nvlist_t *cnv;
|
||||
|
||||
printf(gettext("%*s%s = "), depth, "", name);
|
||||
|
@ -9759,7 +9800,7 @@ zpool_do_events_nvprint(nvlist_t *nvl, int depth)
|
|||
}
|
||||
|
||||
case DATA_TYPE_STRING_ARRAY: {
|
||||
char **str;
|
||||
const char **str;
|
||||
uint_t i, nelem;
|
||||
|
||||
(void) nvpair_value_string_array(nvp, &str, &nelem);
|
||||
|
@ -9788,7 +9829,7 @@ zpool_do_events_next(ev_opts_t *opts)
|
|||
{
|
||||
nvlist_t *nvl;
|
||||
int zevent_fd, ret, dropped;
|
||||
char *pool;
|
||||
const char *pool;
|
||||
|
||||
zevent_fd = open(ZFS_DEV, O_RDWR);
|
||||
VERIFY(zevent_fd >= 0);
|
||||
|
@ -10437,7 +10478,7 @@ vdev_any_spare_replacing(nvlist_t *nv)
|
|||
{
|
||||
nvlist_t **child;
|
||||
uint_t c, children;
|
||||
char *vdev_type;
|
||||
const char *vdev_type;
|
||||
|
||||
(void) nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &vdev_type);
|
||||
|
||||
|
|
|
@ -380,7 +380,7 @@ make_leaf_vdev(nvlist_t *props, const char *arg, boolean_t is_primary)
|
|||
* Override defaults if custom properties are provided.
|
||||
*/
|
||||
if (props != NULL) {
|
||||
char *value = NULL;
|
||||
const char *value = NULL;
|
||||
|
||||
if (nvlist_lookup_string(props,
|
||||
zpool_prop_to_name(ZPOOL_PROP_ASHIFT), &value) == 0) {
|
||||
|
@ -435,7 +435,7 @@ make_leaf_vdev(nvlist_t *props, const char *arg, boolean_t is_primary)
|
|||
* one general purpose vdev.
|
||||
*/
|
||||
typedef struct replication_level {
|
||||
char *zprl_type;
|
||||
const char *zprl_type;
|
||||
uint64_t zprl_children;
|
||||
uint64_t zprl_parity;
|
||||
} replication_level_t;
|
||||
|
@ -489,7 +489,7 @@ get_replication(nvlist_t *nvroot, boolean_t fatal)
|
|||
nvlist_t **child;
|
||||
uint_t c, children;
|
||||
nvlist_t *nv;
|
||||
char *type;
|
||||
const char *type;
|
||||
replication_level_t lastrep = {0};
|
||||
replication_level_t rep;
|
||||
replication_level_t *ret;
|
||||
|
@ -567,10 +567,10 @@ get_replication(nvlist_t *nvroot, boolean_t fatal)
|
|||
vdev_size = -1LL;
|
||||
for (c = 0; c < children; c++) {
|
||||
nvlist_t *cnv = child[c];
|
||||
char *path;
|
||||
const char *path;
|
||||
struct stat64 statbuf;
|
||||
int64_t size = -1LL;
|
||||
char *childtype;
|
||||
const char *childtype;
|
||||
int fd, err;
|
||||
|
||||
rep.zprl_children++;
|
||||
|
@ -904,7 +904,7 @@ check_replication(nvlist_t *config, nvlist_t *newroot)
|
|||
}
|
||||
|
||||
static int
|
||||
zero_label(char *path)
|
||||
zero_label(const char *path)
|
||||
{
|
||||
const int size = 4096;
|
||||
char buf[size];
|
||||
|
@ -951,7 +951,7 @@ make_disks(zpool_handle_t *zhp, nvlist_t *nv)
|
|||
{
|
||||
nvlist_t **child;
|
||||
uint_t c, children;
|
||||
char *type, *path;
|
||||
const char *type, *path;
|
||||
char devpath[MAXPATHLEN];
|
||||
char udevpath[MAXPATHLEN];
|
||||
uint64_t wholedisk;
|
||||
|
@ -1110,7 +1110,7 @@ is_device_in_use(nvlist_t *config, nvlist_t *nv, boolean_t force,
|
|||
{
|
||||
nvlist_t **child;
|
||||
uint_t c, children;
|
||||
char *type, *path;
|
||||
const char *type, *path;
|
||||
int ret = 0;
|
||||
char buf[MAXPATHLEN];
|
||||
uint64_t wholedisk = B_FALSE;
|
||||
|
@ -1329,8 +1329,13 @@ draid_config_by_type(nvlist_t *nv, const char *type, uint64_t children)
|
|||
return (EINVAL);
|
||||
|
||||
nparity = (uint64_t)get_parity(type);
|
||||
if (nparity == 0)
|
||||
if (nparity == 0 || nparity > VDEV_DRAID_MAXPARITY) {
|
||||
fprintf(stderr,
|
||||
gettext("invalid dRAID parity level %llu; must be "
|
||||
"between 1 and %d\n"), (u_longlong_t)nparity,
|
||||
VDEV_DRAID_MAXPARITY);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
char *p = (char *)type;
|
||||
while ((p = strchr(p, ':')) != NULL) {
|
||||
|
@ -1401,14 +1406,6 @@ draid_config_by_type(nvlist_t *nv, const char *type, uint64_t children)
|
|||
return (EINVAL);
|
||||
}
|
||||
|
||||
if (nparity == 0 || nparity > VDEV_DRAID_MAXPARITY) {
|
||||
fprintf(stderr,
|
||||
gettext("invalid dRAID parity level %llu; must be "
|
||||
"between 1 and %d\n"), (u_longlong_t)nparity,
|
||||
VDEV_DRAID_MAXPARITY);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify the requested number of spares can be satisfied.
|
||||
* An arbitrary limit of 100 distributed spares is applied.
|
||||
|
@ -1764,7 +1761,7 @@ split_mirror_vdev(zpool_handle_t *zhp, char *newname, nvlist_t *props,
|
|||
verify(nvlist_lookup_nvlist_array(newroot,
|
||||
ZPOOL_CONFIG_CHILDREN, &child, &children) == 0);
|
||||
for (c = 0; c < children; c++) {
|
||||
char *path;
|
||||
const char *path;
|
||||
const char *type;
|
||||
int min, max;
|
||||
|
||||
|
|
|
@ -264,7 +264,7 @@ get_vdev_name(nvlist_t *nvroot, const char *parent_name)
|
|||
static char vdev_name[256];
|
||||
uint64_t vdev_id = 0;
|
||||
|
||||
char *vdev_type = (char *)"unknown";
|
||||
const char *vdev_type = "unknown";
|
||||
(void) nvlist_lookup_string(nvroot, ZPOOL_CONFIG_TYPE, &vdev_type);
|
||||
|
||||
if (nvlist_lookup_uint64(
|
||||
|
@ -299,9 +299,9 @@ get_vdev_desc(nvlist_t *nvroot, const char *parent_name)
|
|||
char vdev_value[MAXPATHLEN];
|
||||
char *s, *t;
|
||||
|
||||
char *vdev_type = (char *)"unknown";
|
||||
const char *vdev_type = "unknown";
|
||||
uint64_t vdev_id = UINT64_MAX;
|
||||
char *vdev_path = NULL;
|
||||
const char *vdev_path = NULL;
|
||||
(void) nvlist_lookup_string(nvroot, ZPOOL_CONFIG_TYPE, &vdev_type);
|
||||
(void) nvlist_lookup_uint64(nvroot, ZPOOL_CONFIG_ID, &vdev_id);
|
||||
(void) nvlist_lookup_string(nvroot, ZPOOL_CONFIG_PATH, &vdev_path);
|
||||
|
|
|
@ -135,6 +135,7 @@
|
|||
#include <libnvpair.h>
|
||||
#include <libzutil.h>
|
||||
#include <sys/crypto/icp.h>
|
||||
#include <sys/zfs_impl.h>
|
||||
#if (__GLIBC__ && !__UCLIBC__)
|
||||
#include <execinfo.h> /* for backtrace() */
|
||||
#endif
|
||||
|
@ -1901,7 +1902,7 @@ ztest_log_write(ztest_ds_t *zd, dmu_tx_t *tx, lr_write_t *lr)
|
|||
if (zil_replaying(zd->zd_zilog, tx))
|
||||
return;
|
||||
|
||||
if (lr->lr_length > zil_max_log_data(zd->zd_zilog))
|
||||
if (lr->lr_length > zil_max_log_data(zd->zd_zilog, sizeof (lr_write_t)))
|
||||
write_state = WR_INDIRECT;
|
||||
|
||||
itx = zil_itx_create(TX_WRITE,
|
||||
|
@ -4638,8 +4639,11 @@ ztest_dmu_object_alloc_free(ztest_ds_t *zd, uint64_t id)
|
|||
* Destroy the previous batch of objects, create a new batch,
|
||||
* and do some I/O on the new objects.
|
||||
*/
|
||||
if (ztest_object_init(zd, od, size, B_TRUE) != 0)
|
||||
if (ztest_object_init(zd, od, size, B_TRUE) != 0) {
|
||||
zd->zd_od = NULL;
|
||||
umem_free(od, size);
|
||||
return;
|
||||
}
|
||||
|
||||
while (ztest_random(4 * batchsize) != 0)
|
||||
ztest_io(zd, od[ztest_random(batchsize)].od_object,
|
||||
|
@ -6410,6 +6414,7 @@ ztest_blake3(ztest_ds_t *zd, uint64_t id)
|
|||
int i, *ptr;
|
||||
uint32_t size;
|
||||
BLAKE3_CTX ctx;
|
||||
const zfs_impl_t *blake3 = zfs_impl_get_ops("blake3");
|
||||
|
||||
size = ztest_random_blocksize();
|
||||
buf = umem_alloc(size, UMEM_NOFAIL);
|
||||
|
@ -6434,7 +6439,7 @@ ztest_blake3(ztest_ds_t *zd, uint64_t id)
|
|||
void *res2 = &zc_res2;
|
||||
|
||||
/* BLAKE3_KEY_LEN = 32 */
|
||||
VERIFY0(blake3_impl_setname("generic"));
|
||||
VERIFY0(blake3->setname("generic"));
|
||||
templ = abd_checksum_blake3_tmpl_init(&salt);
|
||||
Blake3_InitKeyed(&ctx, salt_ptr);
|
||||
Blake3_Update(&ctx, buf, size);
|
||||
|
@ -6443,7 +6448,7 @@ ztest_blake3(ztest_ds_t *zd, uint64_t id)
|
|||
ZIO_CHECKSUM_BSWAP(&zc_ref2);
|
||||
abd_checksum_blake3_tmpl_free(templ);
|
||||
|
||||
VERIFY0(blake3_impl_setname("cycle"));
|
||||
VERIFY0(blake3->setname("cycle"));
|
||||
while (run_count-- > 0) {
|
||||
|
||||
/* Test current implementation */
|
||||
|
|
|
@ -22,6 +22,9 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_ARCH], [
|
|||
aarch64*)
|
||||
TARGET_CPU=aarch64
|
||||
;;
|
||||
armv*)
|
||||
TARGET_CPU=arm
|
||||
;;
|
||||
sparc64)
|
||||
TARGET_CPU=sparc64
|
||||
;;
|
||||
|
@ -31,7 +34,8 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_ARCH], [
|
|||
esac
|
||||
|
||||
AM_CONDITIONAL([TARGET_CPU_AARCH64], test $TARGET_CPU = aarch64)
|
||||
AM_CONDITIONAL([TARGET_CPU_X86_64], test $TARGET_CPU = x86_64)
|
||||
AM_CONDITIONAL([TARGET_CPU_X86_64], test $TARGET_CPU = x86_64)
|
||||
AM_CONDITIONAL([TARGET_CPU_POWERPC], test $TARGET_CPU = powerpc)
|
||||
AM_CONDITIONAL([TARGET_CPU_SPARC64], test $TARGET_CPU = sparc64)
|
||||
AM_CONDITIONAL([TARGET_CPU_ARM], test $TARGET_CPU = arm)
|
||||
])
|
||||
|
|
|
@ -109,7 +109,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_DISCARD], [
|
|||
int value __attribute__ ((unused));
|
||||
memset(q, 0, sizeof(r));
|
||||
value = blk_queue_discard(q);
|
||||
])
|
||||
],[-Wframe-larger-than=8192])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_DISCARD], [
|
||||
|
@ -155,7 +155,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_SECURE_ERASE], [
|
|||
int value __attribute__ ((unused));
|
||||
memset(q, 0, sizeof(r));
|
||||
value = blk_queue_secure_erase(q);
|
||||
])
|
||||
],[-Wframe-larger-than=8192])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([blk_queue_secdiscard], [
|
||||
#include <linux/blkdev.h>
|
||||
|
|
29
sys/contrib/openzfs/config/kernel-cpu_has_feature.m4
Normal file
29
sys/contrib/openzfs/config/kernel-cpu_has_feature.m4
Normal file
|
@ -0,0 +1,29 @@
|
|||
dnl #
|
||||
dnl # cpu_has_feature() may referencing GPL-only cpu_feature_keys on powerpc
|
||||
dnl #
|
||||
|
||||
dnl #
|
||||
dnl # Checking if cpu_has_feature is exported GPL-only
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE], [
|
||||
ZFS_LINUX_TEST_SRC([cpu_has_feature], [
|
||||
#include <linux/version.h>
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
|
||||
#include <asm/cpu_has_feature.h>
|
||||
#else
|
||||
#include <asm/cputable.h>
|
||||
#endif
|
||||
], [
|
||||
return cpu_has_feature(CPU_FTR_ALTIVEC) ? 0 : 1;
|
||||
], [], [ZFS_META_LICENSE])
|
||||
])
|
||||
AC_DEFUN([ZFS_AC_KERNEL_CPU_HAS_FEATURE], [
|
||||
AC_MSG_CHECKING([whether cpu_has_feature() is GPL-only])
|
||||
ZFS_LINUX_TEST_RESULT([cpu_has_feature_license], [
|
||||
AC_MSG_RESULT(no)
|
||||
], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_CPU_HAS_FEATURE_GPL_ONLY, 1,
|
||||
[cpu_has_feature() is GPL-only])
|
||||
])
|
||||
])
|
26
sys/contrib/openzfs/config/kernel-flush_dcache_page.m4
Normal file
26
sys/contrib/openzfs/config/kernel-flush_dcache_page.m4
Normal file
|
@ -0,0 +1,26 @@
|
|||
dnl #
|
||||
dnl # Starting from Linux 5.13, flush_dcache_page() becomes an inline
|
||||
dnl # function and may indirectly referencing GPL-only cpu_feature_keys on
|
||||
dnl # powerpc
|
||||
dnl #
|
||||
|
||||
dnl #
|
||||
dnl # Checking if flush_dcache_page is exported GPL-only
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE], [
|
||||
ZFS_LINUX_TEST_SRC([flush_dcache_page], [
|
||||
#include <asm/cacheflush.h>
|
||||
], [
|
||||
flush_dcache_page(0);
|
||||
], [], [ZFS_META_LICENSE])
|
||||
])
|
||||
AC_DEFUN([ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE], [
|
||||
AC_MSG_CHECKING([whether flush_dcache_page() is GPL-only])
|
||||
ZFS_LINUX_TEST_RESULT([flush_dcache_page_license], [
|
||||
AC_MSG_RESULT(no)
|
||||
], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_FLUSH_DCACHE_PAGE_GPL_ONLY, 1,
|
||||
[flush_dcache_page() is GPL-only])
|
||||
])
|
||||
])
|
|
@ -2,7 +2,20 @@ dnl #
|
|||
dnl # Check for generic io accounting interface.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
|
||||
ZFS_LINUX_TEST_SRC([bdev_io_acct], [
|
||||
ZFS_LINUX_TEST_SRC([bdev_io_acct_63], [
|
||||
#include <linux/blkdev.h>
|
||||
], [
|
||||
struct block_device *bdev = NULL;
|
||||
struct bio *bio = NULL;
|
||||
unsigned long passed_time = 0;
|
||||
unsigned long start_time;
|
||||
|
||||
start_time = bdev_start_io_acct(bdev, bio_op(bio),
|
||||
passed_time);
|
||||
bdev_end_io_acct(bdev, bio_op(bio), bio_sectors(bio), start_time);
|
||||
])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([bdev_io_acct_old], [
|
||||
#include <linux/blkdev.h>
|
||||
], [
|
||||
struct block_device *bdev = NULL;
|
||||
|
@ -63,74 +76,85 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
|
|||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_GENERIC_IO_ACCT], [
|
||||
dnl #
|
||||
dnl # 5.19 API,
|
||||
dnl # Linux 6.3, and then backports thereof, changed
|
||||
dnl # the signatures on bdev_start_io_acct/bdev_end_io_acct
|
||||
dnl #
|
||||
dnl # disk_start_io_acct() and disk_end_io_acct() have been replaced by
|
||||
dnl # bdev_start_io_acct() and bdev_end_io_acct().
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether generic bdev_*_io_acct() are available])
|
||||
ZFS_LINUX_TEST_RESULT([bdev_io_acct], [
|
||||
AC_MSG_CHECKING([whether 6.3+ bdev_*_io_acct() are available])
|
||||
ZFS_LINUX_TEST_RESULT([bdev_io_acct_63], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_BDEV_IO_ACCT, 1, [bdev_*_io_acct() available])
|
||||
AC_DEFINE(HAVE_BDEV_IO_ACCT_63, 1, [bdev_*_io_acct() available])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
|
||||
dnl #
|
||||
dnl # 5.12 API,
|
||||
dnl # 5.19 API,
|
||||
dnl #
|
||||
dnl # bio_start_io_acct() and bio_end_io_acct() became GPL-exported
|
||||
dnl # so use disk_start_io_acct() and disk_end_io_acct() instead
|
||||
dnl # disk_start_io_acct() and disk_end_io_acct() have been replaced by
|
||||
dnl # bdev_start_io_acct() and bdev_end_io_acct().
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether generic disk_*_io_acct() are available])
|
||||
ZFS_LINUX_TEST_RESULT([disk_io_acct], [
|
||||
AC_MSG_CHECKING([whether pre-6.3 bdev_*_io_acct() are available])
|
||||
ZFS_LINUX_TEST_RESULT([bdev_io_acct_old], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_DISK_IO_ACCT, 1, [disk_*_io_acct() available])
|
||||
AC_DEFINE(HAVE_BDEV_IO_ACCT_OLD, 1, [bdev_*_io_acct() available])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
|
||||
dnl #
|
||||
dnl # 5.7 API,
|
||||
dnl # 5.12 API,
|
||||
dnl #
|
||||
dnl # Added bio_start_io_acct() and bio_end_io_acct() helpers.
|
||||
dnl # bio_start_io_acct() and bio_end_io_acct() became GPL-exported
|
||||
dnl # so use disk_start_io_acct() and disk_end_io_acct() instead
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether generic bio_*_io_acct() are available])
|
||||
ZFS_LINUX_TEST_RESULT([bio_io_acct], [
|
||||
AC_MSG_CHECKING([whether generic disk_*_io_acct() are available])
|
||||
ZFS_LINUX_TEST_RESULT([disk_io_acct], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_BIO_IO_ACCT, 1, [bio_*_io_acct() available])
|
||||
AC_DEFINE(HAVE_DISK_IO_ACCT, 1, [disk_*_io_acct() available])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
|
||||
dnl #
|
||||
dnl # 4.14 API,
|
||||
dnl # 5.7 API,
|
||||
dnl #
|
||||
dnl # generic_start_io_acct/generic_end_io_acct now require
|
||||
dnl # request_queue to be provided. No functional changes,
|
||||
dnl # but preparation for inflight accounting.
|
||||
dnl # Added bio_start_io_acct() and bio_end_io_acct() helpers.
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether generic_*_io_acct wants 4 args])
|
||||
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_4args],
|
||||
[generic_start_io_acct], [block/bio.c], [
|
||||
AC_MSG_CHECKING([whether generic bio_*_io_acct() are available])
|
||||
ZFS_LINUX_TEST_RESULT([bio_io_acct], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_GENERIC_IO_ACCT_4ARG, 1,
|
||||
[generic_*_io_acct() 4 arg available])
|
||||
AC_DEFINE(HAVE_BIO_IO_ACCT, 1, [bio_*_io_acct() available])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
|
||||
dnl #
|
||||
dnl # 3.19 API addition
|
||||
dnl # 4.14 API,
|
||||
dnl #
|
||||
dnl # torvalds/linux@394ffa50 allows us to increment
|
||||
dnl # iostat counters without generic_make_request().
|
||||
dnl # generic_start_io_acct/generic_end_io_acct now require
|
||||
dnl # request_queue to be provided. No functional changes,
|
||||
dnl # but preparation for inflight accounting.
|
||||
dnl #
|
||||
AC_MSG_CHECKING(
|
||||
[whether generic_*_io_acct wants 3 args])
|
||||
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_3args],
|
||||
AC_MSG_CHECKING([whether generic_*_io_acct wants 4 args])
|
||||
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_4args],
|
||||
[generic_start_io_acct], [block/bio.c], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_GENERIC_IO_ACCT_3ARG, 1,
|
||||
[generic_*_io_acct() 3 arg available])
|
||||
AC_DEFINE(HAVE_GENERIC_IO_ACCT_4ARG, 1,
|
||||
[generic_*_io_acct() 4 arg available])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
|
||||
dnl #
|
||||
dnl # 3.19 API addition
|
||||
dnl #
|
||||
dnl # torvalds/linux@394ffa50 allows us to increment
|
||||
dnl # iostat counters without generic_make_request().
|
||||
dnl #
|
||||
AC_MSG_CHECKING(
|
||||
[whether generic_*_io_acct wants 3 args])
|
||||
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_3args],
|
||||
[generic_start_io_acct], [block/bio.c], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_GENERIC_IO_ACCT_3ARG, 1,
|
||||
[generic_*_io_acct() 3 arg available])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
||||
])
|
||||
])
|
||||
|
|
|
@ -151,6 +151,12 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
|||
ZFS_AC_KERNEL_SRC_IDMAP_MNT_API
|
||||
ZFS_AC_KERNEL_SRC_IATTR_VFSID
|
||||
ZFS_AC_KERNEL_SRC_FILEMAP
|
||||
case "$host_cpu" in
|
||||
powerpc*)
|
||||
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
|
||||
ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_MSG_CHECKING([for available kernel interfaces])
|
||||
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
||||
|
@ -275,6 +281,12 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
|||
ZFS_AC_KERNEL_IDMAP_MNT_API
|
||||
ZFS_AC_KERNEL_IATTR_VFSID
|
||||
ZFS_AC_KERNEL_FILEMAP
|
||||
case "$host_cpu" in
|
||||
powerpc*)
|
||||
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
||||
ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
dnl #
|
||||
|
|
|
@ -14,11 +14,11 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [
|
|||
AM_COND_IF([BUILD_LINUX], [
|
||||
ZFS_AC_CONFIG_USER_UDEV
|
||||
ZFS_AC_CONFIG_USER_SYSTEMD
|
||||
ZFS_AC_CONFIG_USER_LIBUDEV
|
||||
ZFS_AC_CONFIG_USER_LIBUUID
|
||||
ZFS_AC_CONFIG_USER_LIBBLKID
|
||||
])
|
||||
ZFS_AC_CONFIG_USER_LIBTIRPC
|
||||
ZFS_AC_CONFIG_USER_LIBUDEV
|
||||
ZFS_AC_CONFIG_USER_LIBCRYPTO
|
||||
ZFS_AC_CONFIG_USER_LIBAIO
|
||||
ZFS_AC_CONFIG_USER_LIBATOMIC
|
||||
|
|
|
@ -124,6 +124,7 @@ usr/share/man/man8/zpool-trim.8
|
|||
usr/share/man/man8/zpool-upgrade.8
|
||||
usr/share/man/man8/zpool-wait.8
|
||||
usr/share/man/man8/zpool.8
|
||||
usr/share/man/man7/vdevprops.7
|
||||
usr/share/man/man7/zpoolconcepts.7
|
||||
usr/share/man/man7/zpoolprops.7
|
||||
usr/share/man/man8/zstream.8
|
||||
|
|
|
@ -194,7 +194,7 @@ import_pool()
|
|||
|
||||
# Verify that the pool isn't already imported
|
||||
# Make as sure as we can to not require '-f' to import.
|
||||
"${ZPOOL}" get name,guid -o value -H 2>/dev/null | grep -Fxq "$pool" && return 0
|
||||
"${ZPOOL}" get -H -o value name,guid 2>/dev/null | grep -Fxq "$pool" && return 0
|
||||
|
||||
# For backwards compatibility, make sure that ZPOOL_IMPORT_PATH is set
|
||||
# to something we can use later with the real import(s). We want to
|
||||
|
@ -359,11 +359,12 @@ mount_fs()
|
|||
# isn't the root fs.
|
||||
return 0
|
||||
fi
|
||||
# Last hail-mary: Hope 'rootmnt' is set!
|
||||
mountpoint=""
|
||||
# Don't use mount.zfs -o zfsutils for legacy mountpoint
|
||||
if [ "$mountpoint" = "legacy" ]; then
|
||||
ZFS_CMD="mount.zfs"
|
||||
fi
|
||||
# Last hail-mary: Hope 'rootmnt' is set!
|
||||
mountpoint=""
|
||||
else
|
||||
mountpoint="$mountpoint1"
|
||||
fi
|
||||
|
@ -902,12 +903,12 @@ mountroot()
|
|||
fi
|
||||
|
||||
# In case the pool was specified as guid, resolve guid to name
|
||||
pool="$("${ZPOOL}" get name,guid -o name,value -H | \
|
||||
pool="$("${ZPOOL}" get -H -o name,value name,guid | \
|
||||
awk -v pool="${ZFS_RPOOL}" '$2 == pool { print $1 }')"
|
||||
if [ -n "$pool" ]; then
|
||||
# If $ZFS_BOOTFS contains guid, replace the guid portion with $pool
|
||||
ZFS_BOOTFS=$(echo "$ZFS_BOOTFS" | \
|
||||
sed -e "s/$("${ZPOOL}" get guid -o value "$pool" -H)/$pool/g")
|
||||
sed -e "s/$("${ZPOOL}" get -H -o value guid "$pool")/$pool/g")
|
||||
ZFS_RPOOL="${pool}"
|
||||
fi
|
||||
|
||||
|
|
|
@ -102,6 +102,7 @@ def enum(*sequential, **named):
|
|||
'ZFS_ERR_VDEV_NOTSUP',
|
||||
'ZFS_ERR_NOT_USER_NAMESPACE',
|
||||
'ZFS_ERR_RESUME_EXISTS',
|
||||
'ZFS_ERR_CRYPTO_NOTSUP',
|
||||
],
|
||||
{}
|
||||
)
|
||||
|
|
|
@ -23,6 +23,7 @@ COMMON_H = \
|
|||
sys/asm_linkage.h \
|
||||
sys/avl.h \
|
||||
sys/avl_impl.h \
|
||||
sys/bitmap.h \
|
||||
sys/bitops.h \
|
||||
sys/blake3.h \
|
||||
sys/blkptr.h \
|
||||
|
@ -31,6 +32,7 @@ COMMON_H = \
|
|||
sys/bptree.h \
|
||||
sys/bqueue.h \
|
||||
sys/btree.h \
|
||||
sys/brt.h \
|
||||
sys/dataset_kstats.h \
|
||||
sys/dbuf.h \
|
||||
sys/ddt.h \
|
||||
|
@ -75,6 +77,7 @@ COMMON_H = \
|
|||
sys/rrwlock.h \
|
||||
sys/sa.h \
|
||||
sys/sa_impl.h \
|
||||
sys/sha2.h \
|
||||
sys/skein.h \
|
||||
sys/spa.h \
|
||||
sys/spa_checkpoint.h \
|
||||
|
@ -124,6 +127,7 @@ COMMON_H = \
|
|||
sys/zfs_delay.h \
|
||||
sys/zfs_file.h \
|
||||
sys/zfs_fuid.h \
|
||||
sys/zfs_impl.h \
|
||||
sys/zfs_project.h \
|
||||
sys/zfs_quota.h \
|
||||
sys/zfs_racct.h \
|
||||
|
|
|
@ -42,9 +42,10 @@ extern "C" {
|
|||
* are all imported from <sys/nvpair.h> included above.
|
||||
*/
|
||||
|
||||
_LIBNVPAIR_H int nvpair_value_match(nvpair_t *, int, char *, char **);
|
||||
_LIBNVPAIR_H int nvpair_value_match_regex(nvpair_t *, int, char *, regex_t *,
|
||||
char **);
|
||||
_LIBNVPAIR_H int nvpair_value_match(nvpair_t *, int, const char *,
|
||||
const char **);
|
||||
_LIBNVPAIR_H int nvpair_value_match_regex(nvpair_t *, int, const char *,
|
||||
regex_t *, const char **);
|
||||
|
||||
_LIBNVPAIR_H void nvlist_print(FILE *, nvlist_t *);
|
||||
_LIBNVPAIR_H int nvlist_print_json(FILE *, nvlist_t *);
|
||||
|
@ -156,7 +157,7 @@ NVLIST_PRINTCTL_SVDECL(nvlist_prtctlop_uint32, uint32_t);
|
|||
NVLIST_PRINTCTL_SVDECL(nvlist_prtctlop_int64, int64_t);
|
||||
NVLIST_PRINTCTL_SVDECL(nvlist_prtctlop_uint64, uint64_t);
|
||||
NVLIST_PRINTCTL_SVDECL(nvlist_prtctlop_double, double);
|
||||
NVLIST_PRINTCTL_SVDECL(nvlist_prtctlop_string, char *);
|
||||
NVLIST_PRINTCTL_SVDECL(nvlist_prtctlop_string, const char *);
|
||||
NVLIST_PRINTCTL_SVDECL(nvlist_prtctlop_hrtime, hrtime_t);
|
||||
NVLIST_PRINTCTL_SVDECL(nvlist_prtctlop_nvlist, nvlist_t *);
|
||||
|
||||
|
@ -185,7 +186,7 @@ NVLIST_PRINTCTL_AVDECL(nvlist_prtctlop_int32_array, int32_t *);
|
|||
NVLIST_PRINTCTL_AVDECL(nvlist_prtctlop_uint32_array, uint32_t *);
|
||||
NVLIST_PRINTCTL_AVDECL(nvlist_prtctlop_int64_array, int64_t *);
|
||||
NVLIST_PRINTCTL_AVDECL(nvlist_prtctlop_uint64_array, uint64_t *);
|
||||
NVLIST_PRINTCTL_AVDECL(nvlist_prtctlop_string_array, char **);
|
||||
NVLIST_PRINTCTL_AVDECL(nvlist_prtctlop_string_array, const char **);
|
||||
NVLIST_PRINTCTL_AVDECL(nvlist_prtctlop_nvlist_array, nvlist_t **);
|
||||
|
||||
#undef NVLIST_PRINTCTL_AVDECL /* was just for "clarity" above */
|
||||
|
|
|
@ -533,7 +533,7 @@ _LIBZFS_H int zfs_prop_get_written(zfs_handle_t *zhp, const char *propname,
|
|||
char *propbuf, int proplen, boolean_t literal);
|
||||
_LIBZFS_H int zfs_prop_get_feature(zfs_handle_t *zhp, const char *propname,
|
||||
char *buf, size_t len);
|
||||
_LIBZFS_H uint64_t getprop_uint64(zfs_handle_t *, zfs_prop_t, char **);
|
||||
_LIBZFS_H uint64_t getprop_uint64(zfs_handle_t *, zfs_prop_t, const char **);
|
||||
_LIBZFS_H uint64_t zfs_prop_get_int(zfs_handle_t *, zfs_prop_t);
|
||||
_LIBZFS_H int zfs_prop_inherit(zfs_handle_t *, const char *, boolean_t);
|
||||
_LIBZFS_H const char *zfs_prop_values(zfs_prop_t);
|
||||
|
|
|
@ -169,10 +169,16 @@ struct zfs_cmd;
|
|||
/*
|
||||
* List of colors to use
|
||||
*/
|
||||
#define ANSI_BLACK "\033[0;30m"
|
||||
#define ANSI_RED "\033[0;31m"
|
||||
#define ANSI_GREEN "\033[0;32m"
|
||||
#define ANSI_YELLOW "\033[0;33m"
|
||||
#define ANSI_BLUE "\033[0;34m"
|
||||
#define ANSI_BOLD_BLUE "\033[1;34m" /* light blue */
|
||||
#define ANSI_MAGENTA "\033[0;35m"
|
||||
#define ANSI_CYAN "\033[0;36m"
|
||||
#define ANSI_GRAY "\033[0;37m"
|
||||
|
||||
#define ANSI_RESET "\033[0m"
|
||||
#define ANSI_BOLD "\033[1m"
|
||||
|
||||
|
|
|
@ -51,6 +51,8 @@ noinst_HEADERS = \
|
|||
%D%/spl/sys/sid.h \
|
||||
%D%/spl/sys/sig.h \
|
||||
%D%/spl/sys/simd.h \
|
||||
%D%/spl/sys/simd_aarch64.h \
|
||||
%D%/spl/sys/simd_arm.h \
|
||||
%D%/spl/sys/simd_powerpc.h \
|
||||
%D%/spl/sys/simd_x86.h \
|
||||
%D%/spl/sys/spl_condvar.h \
|
||||
|
@ -79,7 +81,6 @@ noinst_HEADERS = \
|
|||
%D%/spl/sys/zone.h \
|
||||
\
|
||||
%D%/zfs/sys/freebsd_crypto.h \
|
||||
%D%/zfs/sys/sha2.h \
|
||||
%D%/zfs/sys/vdev_os.h \
|
||||
%D%/zfs/sys/zfs_bootenv_os.h \
|
||||
%D%/zfs/sys/zfs_context_os.h \
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
|
||||
#if !defined(_ASM)
|
||||
#include <sys/_stdarg.h>
|
||||
#include <sys/atomic.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -73,6 +74,38 @@ extern void vuprintf(const char *, __va_list)
|
|||
extern void panic(const char *, ...)
|
||||
__attribute__((format(printf, 1, 2), __noreturn__));
|
||||
|
||||
#define cmn_err_once(ce, ...) \
|
||||
do { \
|
||||
static volatile uint32_t printed = 0; \
|
||||
if (atomic_cas_32(&printed, 0, 1) == 0) { \
|
||||
cmn_err(ce, __VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define vcmn_err_once(ce, fmt, ap) \
|
||||
do { \
|
||||
static volatile uint32_t printed = 0; \
|
||||
if (atomic_cas_32(&printed, 0, 1) == 0) { \
|
||||
vcmn_err(ce, fmt, ap); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define zcmn_err_once(zone, ce, ...) \
|
||||
do { \
|
||||
static volatile uint32_t printed = 0; \
|
||||
if (atomic_cas_32(&printed, 0, 1) == 0) { \
|
||||
zcmn_err(zone, ce, __VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define vzcmn_err_once(zone, ce, fmt, ap) \
|
||||
do { \
|
||||
static volatile uint32_t printed = 0; \
|
||||
if (atomic_cas_32(&printed, 0, 1) == 0) { \
|
||||
vzcmn_err(zone, ce, fmt, ap); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif /* !_ASM */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -97,6 +97,12 @@
|
|||
#define blake3_param_set_args(var) \
|
||||
CTLTYPE_STRING, NULL, 0, blake3_param, "A"
|
||||
|
||||
#define sha256_param_set_args(var) \
|
||||
CTLTYPE_STRING, NULL, 0, sha256_param, "A"
|
||||
|
||||
#define sha512_param_set_args(var) \
|
||||
CTLTYPE_STRING, NULL, 0, sha512_param, "A"
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#define module_init(fn) \
|
||||
static void \
|
||||
|
|
|
@ -32,6 +32,12 @@
|
|||
#if defined(__amd64__) || defined(__i386__)
|
||||
#include <sys/simd_x86.h>
|
||||
|
||||
#elif defined(__arm__)
|
||||
#include <sys/simd_arm.h>
|
||||
|
||||
#elif defined(__aarch64__)
|
||||
#include <sys/simd_aarch64.h>
|
||||
|
||||
#elif defined(__powerpc__)
|
||||
#include <sys/simd_powerpc.h>
|
||||
|
||||
|
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* Copyright (C) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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 AUTHORS 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 AUTHORS 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* SIMD support:
|
||||
*
|
||||
* Following functions should be called to determine whether CPU feature
|
||||
* is supported. All functions are usable in kernel and user space.
|
||||
* If a SIMD algorithm is using more than one instruction set
|
||||
* all relevant feature test functions should be called.
|
||||
*
|
||||
* Supported features:
|
||||
* zfs_neon_available()
|
||||
* zfs_sha256_available()
|
||||
* zfs_sha512_available()
|
||||
*/
|
||||
|
||||
#ifndef _FREEBSD_SIMD_AARCH64_H
|
||||
#define _FREEBSD_SIMD_AARCH64_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <machine/elf.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
#define kfpu_allowed() 1
|
||||
#define kfpu_initialize(tsk) do {} while (0)
|
||||
#define kfpu_begin() do {} while (0)
|
||||
#define kfpu_end() do {} while (0)
|
||||
#define kfpu_init() (0)
|
||||
#define kfpu_fini() do {} while (0)
|
||||
|
||||
/*
|
||||
* Check if NEON is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_neon_available(void)
|
||||
{
|
||||
return (elf_hwcap & HWCAP_FP);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if SHA256 is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_sha256_available(void)
|
||||
{
|
||||
return (elf_hwcap & HWCAP_SHA2);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if SHA512 is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_sha512_available(void)
|
||||
{
|
||||
return (elf_hwcap & HWCAP_SHA512);
|
||||
}
|
||||
|
||||
#endif /* _FREEBSD_SIMD_AARCH64_H */
|
74
sys/contrib/openzfs/include/os/freebsd/spl/sys/simd_arm.h
Normal file
74
sys/contrib/openzfs/include/os/freebsd/spl/sys/simd_arm.h
Normal file
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* Copyright (C) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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 AUTHORS 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 AUTHORS 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* SIMD support:
|
||||
*
|
||||
* Following functions should be called to determine whether CPU feature
|
||||
* is supported. All functions are usable in kernel and user space.
|
||||
* If a SIMD algorithm is using more than one instruction set
|
||||
* all relevant feature test functions should be called.
|
||||
*
|
||||
* Supported features:
|
||||
* zfs_neon_available()
|
||||
* zfs_sha256_available()
|
||||
*/
|
||||
|
||||
#ifndef _FREEBSD_SIMD_ARM_H
|
||||
#define _FREEBSD_SIMD_ARM_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <machine/elf.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
#define kfpu_allowed() 1
|
||||
#define kfpu_initialize(tsk) do {} while (0)
|
||||
#define kfpu_begin() do {} while (0)
|
||||
#define kfpu_end() do {} while (0)
|
||||
#define kfpu_init() (0)
|
||||
#define kfpu_fini() do {} while (0)
|
||||
|
||||
/*
|
||||
* Check if NEON is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_neon_available(void)
|
||||
{
|
||||
return (elf_hwcap & HWCAP_NEON);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if SHA256 is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_sha256_available(void)
|
||||
{
|
||||
return (elf_hwcap2 & HWCAP2_SHA2);
|
||||
}
|
||||
|
||||
#endif /* _FREEBSD_SIMD_ARM_H */
|
|
@ -1,38 +1,32 @@
|
|||
/*
|
||||
* 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 https://opensource.org/licenses/CDDL-1.0.
|
||||
* 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) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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 AUTHORS 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 AUTHORS 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* USER API:
|
||||
*
|
||||
* Kernel fpu methods:
|
||||
* kfpu_allowed()
|
||||
* kfpu_begin()
|
||||
* kfpu_end()
|
||||
* kfpu_init()
|
||||
* kfpu_fini()
|
||||
*
|
||||
* SIMD support:
|
||||
*
|
||||
* Following functions should be called to determine whether CPU feature
|
||||
|
|
|
@ -40,11 +40,16 @@
|
|||
#define kfpu_allowed() 1
|
||||
#define kfpu_initialize(tsk) do {} while (0)
|
||||
|
||||
|
||||
#define kfpu_begin() { \
|
||||
if (__predict_false(!is_fpu_kern_thread(0))) \
|
||||
fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX);\
|
||||
}
|
||||
|
||||
#ifndef PCB_FPUNOSAVE
|
||||
#define PCB_FPUNOSAVE PCB_NPXNOSAVE
|
||||
#endif
|
||||
|
||||
#define kfpu_end() { \
|
||||
if (__predict_false(curpcb->pcb_flags & PCB_FPUNOSAVE)) \
|
||||
fpu_kern_leave(curthread, NULL); \
|
||||
|
@ -173,6 +178,19 @@ zfs_avx2_available(void)
|
|||
return (has_avx2 && __ymm_enabled());
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if SHA_NI instruction set is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_shani_available(void)
|
||||
{
|
||||
boolean_t has_shani;
|
||||
|
||||
has_shani = (cpu_stdext_feature & CPUID_STDEXT_SHA) != 0;
|
||||
|
||||
return (has_shani && __ymm_enabled());
|
||||
}
|
||||
|
||||
/*
|
||||
* AVX-512 family of instruction sets:
|
||||
*
|
||||
|
|
|
@ -143,6 +143,10 @@ vn_flush_cached_data(vnode_t *vp, boolean_t sync)
|
|||
/*
|
||||
* Attributes of interest to the caller of setattr or getattr.
|
||||
*/
|
||||
|
||||
#undef AT_UID
|
||||
#undef AT_GID
|
||||
|
||||
#define AT_MODE 0x00002
|
||||
#define AT_UID 0x00004
|
||||
#define AT_GID 0x00008
|
||||
|
|
|
@ -1,197 +0,0 @@
|
|||
/*
|
||||
* 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 https://opensource.org/licenses/CDDL-1.0.
|
||||
* 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 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
/* Copyright 2013 Saso Kiselkov. All rights reserved. */
|
||||
|
||||
#ifndef _SYS_SHA2_H
|
||||
#define _SYS_SHA2_H
|
||||
|
||||
#include <sys/types.h> /* for uint_* */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SHA256_DIGEST_LENGTH 32 /* SHA256 digest length in bytes */
|
||||
#define SHA384_DIGEST_LENGTH 48 /* SHA384 digest length in bytes */
|
||||
#define SHA512_DIGEST_LENGTH 64 /* SHA512 digest length in bytes */
|
||||
|
||||
/* Truncated versions of SHA-512 according to FIPS-180-4, section 5.3.6 */
|
||||
#define SHA512_224_DIGEST_LENGTH 28 /* SHA512/224 digest length */
|
||||
#define SHA512_256_DIGEST_LENGTH 32 /* SHA512/256 digest length */
|
||||
|
||||
#define SHA256_HMAC_BLOCK_SIZE 64 /* SHA256-HMAC block size */
|
||||
#define SHA512_HMAC_BLOCK_SIZE 128 /* SHA512-HMAC block size */
|
||||
|
||||
#define SHA256 0
|
||||
#define SHA256_HMAC 1
|
||||
#define SHA256_HMAC_GEN 2
|
||||
#define SHA384 3
|
||||
#define SHA384_HMAC 4
|
||||
#define SHA384_HMAC_GEN 5
|
||||
#define SHA512 6
|
||||
#define SHA512_HMAC 7
|
||||
#define SHA512_HMAC_GEN 8
|
||||
#define SHA512_224 9
|
||||
#define SHA512_256 10
|
||||
|
||||
/*
|
||||
* SHA2 context.
|
||||
* The contents of this structure are a private interface between the
|
||||
* Init/Update/Final calls of the functions defined below.
|
||||
* Callers must never attempt to read or write any of the fields
|
||||
* in this structure directly.
|
||||
*/
|
||||
|
||||
#include <crypto/sha2/sha256.h>
|
||||
#include <crypto/sha2/sha384.h>
|
||||
#include <crypto/sha2/sha512.h>
|
||||
#include <crypto/sha2/sha512t.h>
|
||||
typedef struct {
|
||||
uint32_t algotype; /* Algorithm Type */
|
||||
union {
|
||||
SHA256_CTX SHA256_ctx;
|
||||
SHA384_CTX SHA384_ctx;
|
||||
SHA512_CTX SHA512_ctx;
|
||||
};
|
||||
} SHA2_CTX;
|
||||
|
||||
extern void SHA256Init(SHA256_CTX *);
|
||||
|
||||
extern void SHA256Update(SHA256_CTX *, const void *, size_t);
|
||||
|
||||
extern void SHA256Final(void *, SHA256_CTX *);
|
||||
|
||||
extern void SHA384Init(SHA384_CTX *);
|
||||
|
||||
extern void SHA384Update(SHA384_CTX *, const void *, size_t);
|
||||
|
||||
extern void SHA384Final(void *, SHA384_CTX *);
|
||||
|
||||
extern void SHA512Init(SHA512_CTX *);
|
||||
|
||||
extern void SHA512Update(SHA512_CTX *, const void *, size_t);
|
||||
|
||||
extern void SHA512Final(void *, SHA512_CTX *);
|
||||
|
||||
|
||||
static inline void
|
||||
SHA2Init(uint64_t mech, SHA2_CTX *c)
|
||||
{
|
||||
switch (mech) {
|
||||
case SHA256:
|
||||
SHA256_Init(&c->SHA256_ctx);
|
||||
break;
|
||||
case SHA384:
|
||||
SHA384_Init(&c->SHA384_ctx);
|
||||
break;
|
||||
case SHA512:
|
||||
SHA512_Init(&c->SHA512_ctx);
|
||||
break;
|
||||
case SHA512_256:
|
||||
SHA512_256_Init(&c->SHA512_ctx);
|
||||
break;
|
||||
default:
|
||||
panic("unknown mechanism %ju", (uintmax_t)mech);
|
||||
}
|
||||
c->algotype = (uint32_t)mech;
|
||||
}
|
||||
|
||||
static inline void
|
||||
SHA2Update(SHA2_CTX *c, const void *p, size_t s)
|
||||
{
|
||||
switch (c->algotype) {
|
||||
case SHA256:
|
||||
SHA256_Update(&c->SHA256_ctx, p, s);
|
||||
break;
|
||||
case SHA384:
|
||||
SHA384_Update(&c->SHA384_ctx, p, s);
|
||||
break;
|
||||
case SHA512:
|
||||
SHA512_Update(&c->SHA512_ctx, p, s);
|
||||
break;
|
||||
case SHA512_256:
|
||||
SHA512_256_Update(&c->SHA512_ctx, p, s);
|
||||
break;
|
||||
default:
|
||||
panic("unknown mechanism %d", c->algotype);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
SHA2Final(void *p, SHA2_CTX *c)
|
||||
{
|
||||
switch (c->algotype) {
|
||||
case SHA256:
|
||||
SHA256_Final(p, &c->SHA256_ctx);
|
||||
break;
|
||||
case SHA384:
|
||||
SHA384_Final(p, &c->SHA384_ctx);
|
||||
break;
|
||||
case SHA512:
|
||||
SHA512_Final(p, &c->SHA512_ctx);
|
||||
break;
|
||||
case SHA512_256:
|
||||
SHA512_256_Final(p, &c->SHA512_ctx);
|
||||
break;
|
||||
default:
|
||||
panic("unknown mechanism %d", c->algotype);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _SHA2_IMPL
|
||||
/*
|
||||
* The following types/functions are all private to the implementation
|
||||
* of the SHA2 functions and must not be used by consumers of the interface
|
||||
*/
|
||||
|
||||
/*
|
||||
* List of support mechanisms in this module.
|
||||
*
|
||||
* It is important to note that in the module, division or modulus calculations
|
||||
* are used on the enumerated type to determine which mechanism is being used;
|
||||
* therefore, changing the order or additional mechanisms should be done
|
||||
* carefully
|
||||
*/
|
||||
typedef enum sha2_mech_type {
|
||||
SHA256_MECH_INFO_TYPE, /* SUN_CKM_SHA256 */
|
||||
SHA256_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA256_HMAC */
|
||||
SHA256_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA256_HMAC_GENERAL */
|
||||
SHA384_MECH_INFO_TYPE, /* SUN_CKM_SHA384 */
|
||||
SHA384_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA384_HMAC */
|
||||
SHA384_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA384_HMAC_GENERAL */
|
||||
SHA512_MECH_INFO_TYPE, /* SUN_CKM_SHA512 */
|
||||
SHA512_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA512_HMAC */
|
||||
SHA512_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA512_HMAC_GENERAL */
|
||||
SHA512_224_MECH_INFO_TYPE, /* SUN_CKM_SHA512_224 */
|
||||
SHA512_256_MECH_INFO_TYPE /* SUN_CKM_SHA512_256 */
|
||||
} sha2_mech_type_t;
|
||||
|
||||
#endif /* _SHA2_IMPL */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _SYS_SHA2_H */
|
|
@ -119,7 +119,8 @@ typedef struct zfs_soft_state {
|
|||
#define zn_has_cached_data(zp, start, end) \
|
||||
vn_has_cached_data(ZTOV(zp))
|
||||
#define zn_flush_cached_data(zp, sync) vn_flush_cached_data(ZTOV(zp), sync)
|
||||
#define zn_rlimit_fsize(zp, uio) \
|
||||
#define zn_rlimit_fsize(size) zfs_rlimit_fsize(size)
|
||||
#define zn_rlimit_fsize_uio(zp, uio) \
|
||||
vn_rlimit_fsize(ZTOV(zp), GET_UIO_STRUCT(uio), zfs_uio_td(uio))
|
||||
|
||||
/* Called on entry to each ZFS vnode and vfs operation */
|
||||
|
@ -179,6 +180,8 @@ extern zil_replay_func_t *const zfs_replay_vector[TX_MAX_TYPE];
|
|||
|
||||
extern int zfs_znode_parent_and_name(struct znode *zp, struct znode **dzpp,
|
||||
char *buf);
|
||||
|
||||
extern int zfs_rlimit_fsize(off_t fsize);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -10,6 +10,7 @@ kernel_linux_HEADERS = \
|
|||
%D%/kernel/linux/percpu_compat.h \
|
||||
%D%/kernel/linux/simd.h \
|
||||
%D%/kernel/linux/simd_aarch64.h \
|
||||
%D%/kernel/linux/simd_arm.h \
|
||||
%D%/kernel/linux/simd_powerpc.h \
|
||||
%D%/kernel/linux/simd_x86.h \
|
||||
%D%/kernel/linux/utsname_compat.h \
|
||||
|
@ -19,7 +20,6 @@ kernel_linux_HEADERS = \
|
|||
kernel_sysdir = $(kerneldir)/sys
|
||||
kernel_sys_HEADERS = \
|
||||
%D%/zfs/sys/policy.h \
|
||||
%D%/zfs/sys/sha2.h \
|
||||
%D%/zfs/sys/trace_acl.h \
|
||||
%D%/zfs/sys/trace_arc.h \
|
||||
%D%/zfs/sys/trace_common.h \
|
||||
|
|
|
@ -592,7 +592,10 @@ blk_generic_start_io_acct(struct request_queue *q __attribute__((unused)),
|
|||
struct gendisk *disk __attribute__((unused)),
|
||||
int rw __attribute__((unused)), struct bio *bio)
|
||||
{
|
||||
#if defined(HAVE_BDEV_IO_ACCT)
|
||||
#if defined(HAVE_BDEV_IO_ACCT_63)
|
||||
return (bdev_start_io_acct(bio->bi_bdev, bio_op(bio),
|
||||
jiffies));
|
||||
#elif defined(HAVE_BDEV_IO_ACCT_OLD)
|
||||
return (bdev_start_io_acct(bio->bi_bdev, bio_sectors(bio),
|
||||
bio_op(bio), jiffies));
|
||||
#elif defined(HAVE_DISK_IO_ACCT)
|
||||
|
@ -618,7 +621,10 @@ blk_generic_end_io_acct(struct request_queue *q __attribute__((unused)),
|
|||
struct gendisk *disk __attribute__((unused)),
|
||||
int rw __attribute__((unused)), struct bio *bio, unsigned long start_time)
|
||||
{
|
||||
#if defined(HAVE_BDEV_IO_ACCT)
|
||||
#if defined(HAVE_BDEV_IO_ACCT_63)
|
||||
bdev_end_io_acct(bio->bi_bdev, bio_op(bio), bio_sectors(bio),
|
||||
start_time);
|
||||
#elif defined(HAVE_BDEV_IO_ACCT_OLD)
|
||||
bdev_end_io_acct(bio->bi_bdev, bio_op(bio), start_time);
|
||||
#elif defined(HAVE_DISK_IO_ACCT)
|
||||
disk_end_io_acct(disk, bio_op(bio), start_time);
|
||||
|
|
|
@ -39,6 +39,21 @@
|
|||
#define d_alias d_u.d_alias
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Starting from Linux 5.13, flush_dcache_page() becomes an inline function
|
||||
* and under some configurations, may indirectly referencing GPL-only
|
||||
* cpu_feature_keys on powerpc. Override this function when it is detected
|
||||
* being GPL-only.
|
||||
*/
|
||||
#if defined __powerpc__ && defined HAVE_FLUSH_DCACHE_PAGE_GPL_ONLY
|
||||
#include <linux/simd_powerpc.h>
|
||||
#define flush_dcache_page(page) do { \
|
||||
if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE) && \
|
||||
test_bit(PG_dcache_clean, &(page)->flags)) \
|
||||
clear_bit(PG_dcache_clean, &(page)->flags); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 2.6.30 API change,
|
||||
* The const keyword was added to the 'struct dentry_operations' in
|
||||
|
|
|
@ -47,6 +47,7 @@ typedef const struct kernel_param zfs_kernel_param_t;
|
|||
enum scope_prefix_types {
|
||||
zfs,
|
||||
zfs_arc,
|
||||
zfs_brt,
|
||||
zfs_condense,
|
||||
zfs_dbuf,
|
||||
zfs_dbuf_cache,
|
||||
|
|
|
@ -28,13 +28,16 @@
|
|||
#if defined(__x86)
|
||||
#include <linux/simd_x86.h>
|
||||
|
||||
#elif defined(__arm__)
|
||||
#include <linux/simd_arm.h>
|
||||
|
||||
#elif defined(__aarch64__)
|
||||
#include <linux/simd_aarch64.h>
|
||||
|
||||
#elif defined(__powerpc__)
|
||||
#include <linux/simd_powerpc.h>
|
||||
#else
|
||||
|
||||
#else
|
||||
#define kfpu_allowed() 0
|
||||
#define kfpu_begin() do {} while (0)
|
||||
#define kfpu_end() do {} while (0)
|
||||
|
|
|
@ -18,8 +18,11 @@
|
|||
*
|
||||
* CDDL HEADER END
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2016 Romain Dolbeau <romain@dolbeau.org>.
|
||||
* Copyright (C) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
|
||||
* Copyright (C) 2022 Sebastian Gottschall <s.gottschall@dd-wrt.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -31,24 +34,83 @@
|
|||
* kfpu_end()
|
||||
* kfpu_init()
|
||||
* kfpu_fini()
|
||||
*
|
||||
* SIMD support:
|
||||
*
|
||||
* Following functions should be called to determine whether CPU feature
|
||||
* is supported. All functions are usable in kernel and user space.
|
||||
* If a SIMD algorithm is using more than one instruction set
|
||||
* all relevant feature test functions should be called.
|
||||
*
|
||||
* Supported features:
|
||||
* zfs_neon_available()
|
||||
* zfs_sha256_available()
|
||||
* zfs_sha512_available()
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_SIMD_AARCH64_H
|
||||
#define _LINUX_SIMD_AARCH64_H
|
||||
|
||||
#include <sys/isa_defs.h>
|
||||
|
||||
#if defined(__aarch64__)
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <asm/neon.h>
|
||||
#include <asm/elf.h>
|
||||
#include <asm/hwcap.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
|
||||
#include <asm/sysreg.h>
|
||||
#else
|
||||
#define sys_reg(op0, op1, crn, crm, op2) ( \
|
||||
((op0) << Op0_shift) | \
|
||||
((op1) << Op1_shift) | \
|
||||
((crn) << CRn_shift) | \
|
||||
((crm) << CRm_shift) | \
|
||||
((op2) << Op2_shift))
|
||||
#endif
|
||||
|
||||
#define ID_AA64PFR0_EL1 sys_reg(3, 0, 0, 1, 0)
|
||||
#define ID_AA64ISAR0_EL1 sys_reg(3, 0, 0, 6, 0)
|
||||
|
||||
#define kfpu_allowed() 1
|
||||
#define kfpu_begin() kernel_neon_begin()
|
||||
#define kfpu_end() kernel_neon_end()
|
||||
#define kfpu_init() 0
|
||||
#define kfpu_fini() ((void) 0)
|
||||
#define kfpu_init() (0)
|
||||
#define kfpu_fini() do {} while (0)
|
||||
|
||||
#endif /* __aarch64__ */
|
||||
#define get_ftr(id) { \
|
||||
unsigned long __val; \
|
||||
asm("mrs %0, "#id : "=r" (__val)); \
|
||||
__val; \
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if NEON is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_neon_available(void)
|
||||
{
|
||||
unsigned long ftr = ((get_ftr(ID_AA64PFR0_EL1)) >> 16) & 0xf;
|
||||
return (ftr == 0 || ftr == 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if SHA256 is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_sha256_available(void)
|
||||
{
|
||||
unsigned long ftr = ((get_ftr(ID_AA64ISAR0_EL1)) >> 12) & 0x3;
|
||||
return (ftr & 0x1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if SHA512 is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_sha512_available(void)
|
||||
{
|
||||
unsigned long ftr = ((get_ftr(ID_AA64ISAR0_EL1)) >> 12) & 0x3;
|
||||
return (ftr & 0x2);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_SIMD_AARCH64_H */
|
||||
|
|
80
sys/contrib/openzfs/include/os/linux/kernel/linux/simd_arm.h
Normal file
80
sys/contrib/openzfs/include/os/linux/kernel/linux/simd_arm.h
Normal file
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* 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 https://opensource.org/licenses/CDDL-1.0.
|
||||
* 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) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
|
||||
*/
|
||||
|
||||
/*
|
||||
* USER API:
|
||||
*
|
||||
* Kernel fpu methods:
|
||||
* kfpu_allowed()
|
||||
* kfpu_begin()
|
||||
* kfpu_end()
|
||||
* kfpu_init()
|
||||
* kfpu_fini()
|
||||
*
|
||||
* SIMD support:
|
||||
*
|
||||
* Following functions should be called to determine whether CPU feature
|
||||
* is supported. All functions are usable in kernel and user space.
|
||||
* If a SIMD algorithm is using more than one instruction set
|
||||
* all relevant feature test functions should be called.
|
||||
*
|
||||
* Supported features:
|
||||
* zfs_neon_available()
|
||||
* zfs_sha256_available()
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_SIMD_ARM_H
|
||||
#define _LINUX_SIMD_ARM_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <asm/neon.h>
|
||||
#include <asm/elf.h>
|
||||
#include <asm/hwcap.h>
|
||||
|
||||
#define kfpu_allowed() 1
|
||||
#define kfpu_begin() kernel_neon_begin()
|
||||
#define kfpu_end() kernel_neon_end()
|
||||
#define kfpu_init() (0)
|
||||
#define kfpu_fini() do {} while (0)
|
||||
|
||||
/*
|
||||
* Check if NEON is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_neon_available(void)
|
||||
{
|
||||
return (elf_hwcap & HWCAP_NEON);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if SHA256 is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_sha256_available(void)
|
||||
{
|
||||
return (elf_hwcap2 & HWCAP2_SHA2);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_SIMD_ARM_H */
|
|
@ -50,9 +50,6 @@
|
|||
#ifndef _LINUX_SIMD_POWERPC_H
|
||||
#define _LINUX_SIMD_POWERPC_H
|
||||
|
||||
/* only for __powerpc__ */
|
||||
#if defined(__powerpc__)
|
||||
|
||||
#include <linux/preempt.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/sched.h>
|
||||
|
@ -69,44 +66,61 @@
|
|||
#define kfpu_allowed() 1
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
|
||||
#ifdef CONFIG_SPE
|
||||
#define kfpu_begin() \
|
||||
{ \
|
||||
preempt_disable(); \
|
||||
enable_kernel_altivec(); \
|
||||
enable_kernel_vsx(); \
|
||||
enable_kernel_spe(); \
|
||||
}
|
||||
#define kfpu_end() \
|
||||
{ \
|
||||
disable_kernel_spe(); \
|
||||
disable_kernel_vsx(); \
|
||||
disable_kernel_altivec(); \
|
||||
preempt_enable(); \
|
||||
}
|
||||
#else /* CONFIG_SPE */
|
||||
#define kfpu_begin() \
|
||||
{ \
|
||||
preempt_disable(); \
|
||||
enable_kernel_altivec(); \
|
||||
enable_kernel_vsx(); \
|
||||
}
|
||||
#define kfpu_end() \
|
||||
{ \
|
||||
disable_kernel_vsx(); \
|
||||
disable_kernel_altivec(); \
|
||||
preempt_enable(); \
|
||||
}
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
#define ENABLE_KERNEL_ALTIVEC enable_kernel_altivec();
|
||||
#define DISABLE_KERNEL_ALTIVEC disable_kernel_altivec();
|
||||
#else
|
||||
#define ENABLE_KERNEL_ALTIVEC
|
||||
#define DISABLE_KERNEL_ALTIVEC
|
||||
#endif
|
||||
#ifdef CONFIG_VSX
|
||||
#define ENABLE_KERNEL_VSX enable_kernel_vsx();
|
||||
#define DISABLE_KERNEL_VSX disable_kernel_vsx();
|
||||
#else
|
||||
#define ENABLE_KERNEL_VSX
|
||||
#define DISABLE_KERNEL_VSX
|
||||
#endif
|
||||
#ifdef CONFIG_SPE
|
||||
#define ENABLE_KERNEL_SPE enable_kernel_spe();
|
||||
#define DISABLE_KERNEL_SPE disable_kernel_spe();
|
||||
#else
|
||||
#define ENABLE_KERNEL_SPE
|
||||
#define DISABLE_KERNEL_SPE
|
||||
#endif
|
||||
#define kfpu_begin() \
|
||||
{ \
|
||||
preempt_disable(); \
|
||||
ENABLE_KERNEL_ALTIVEC \
|
||||
ENABLE_KERNEL_VSX \
|
||||
ENABLE_KERNEL_SPE \
|
||||
}
|
||||
#define kfpu_end() \
|
||||
{ \
|
||||
DISABLE_KERNEL_SPE \
|
||||
DISABLE_KERNEL_VSX \
|
||||
DISABLE_KERNEL_ALTIVEC \
|
||||
preempt_enable(); \
|
||||
}
|
||||
#else
|
||||
/* seems that before 4.5 no-one bothered */
|
||||
#define kfpu_begin()
|
||||
#define kfpu_end() preempt_enable()
|
||||
#endif
|
||||
#endif /* Linux version >= 4.5 */
|
||||
|
||||
#define kfpu_init() 0
|
||||
#define kfpu_fini() ((void) 0)
|
||||
|
||||
/*
|
||||
* Linux 4.7 makes cpu_has_feature to use jump labels on powerpc if
|
||||
* CONFIG_JUMP_LABEL_FEATURE_CHECKS is enabled, in this case however it
|
||||
* references GPL-only symbol cpu_feature_keys. Therefore we overrides this
|
||||
* interface when it is detected being GPL-only.
|
||||
*/
|
||||
#if defined(CONFIG_JUMP_LABEL_FEATURE_CHECKS) && \
|
||||
defined(HAVE_CPU_HAS_FEATURE_GPL_ONLY)
|
||||
#define cpu_has_feature(feature) early_cpu_has_feature(feature)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check if AltiVec instruction set is available
|
||||
*/
|
||||
|
@ -134,6 +148,4 @@ zfs_isa207_available(void)
|
|||
return (cpu_has_feature(CPU_FTR_ARCH_207S));
|
||||
}
|
||||
|
||||
#endif /* defined(__powerpc) */
|
||||
|
||||
#endif /* _LINUX_SIMD_POWERPC_H */
|
||||
|
|
|
@ -53,6 +53,8 @@
|
|||
* zfs_bmi1_available()
|
||||
* zfs_bmi2_available()
|
||||
*
|
||||
* zfs_shani_available()
|
||||
*
|
||||
* zfs_avx512f_available()
|
||||
* zfs_avx512cd_available()
|
||||
* zfs_avx512er_available()
|
||||
|
@ -586,6 +588,19 @@ zfs_movbe_available(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if SHA_NI instruction set is available
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_shani_available(void)
|
||||
{
|
||||
#if defined(X86_FEATURE_SHA_NI)
|
||||
return (!!boot_cpu_has(X86_FEATURE_SHA_NI));
|
||||
#else
|
||||
return (B_FALSE);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* AVX-512 family of instruction sets:
|
||||
*
|
||||
|
|
|
@ -75,9 +75,6 @@ struct xdr_bytesrec {
|
|||
void xdrmem_create(XDR *xdrs, const caddr_t addr, const uint_t size,
|
||||
const enum xdr_op op);
|
||||
|
||||
/* Currently not needed. If needed later, we'll add it to struct xdr_ops */
|
||||
#define xdr_destroy(xdrs) ((void) 0)
|
||||
|
||||
#define xdr_control(xdrs, req, info) \
|
||||
(xdrs)->x_ops->xdr_control((xdrs), (req), (info))
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#else
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
#include <sys/atomic.h>
|
||||
|
||||
#define CE_CONT 0 /* continuation */
|
||||
#define CE_NOTE 1 /* notice */
|
||||
|
@ -45,4 +46,20 @@ extern void vpanic(const char *, va_list)
|
|||
|
||||
#define fm_panic panic
|
||||
|
||||
#define cmn_err_once(ce, ...) \
|
||||
do { \
|
||||
static volatile uint32_t printed = 0; \
|
||||
if (atomic_cas_32(&printed, 0, 1) == 0) { \
|
||||
cmn_err(ce, __VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define vcmn_err_once(ce, fmt, ap) \
|
||||
do { \
|
||||
static volatile uint32_t printed = 0; \
|
||||
if (atomic_cas_32(&printed, 0, 1) == 0) { \
|
||||
vcmn_err(ce, fmt, ap); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif /* SPL_CMN_ERR_H */
|
||||
|
|
|
@ -171,6 +171,7 @@ spl_mutex_lockdep_on_maybe(kmutex_t *mp) \
|
|||
*/
|
||||
#define mutex_exit(mp) \
|
||||
{ \
|
||||
ASSERT3P(mutex_owner(mp), ==, current); \
|
||||
spl_mutex_clear_owner(mp); \
|
||||
spin_lock(&(mp)->m_lock); \
|
||||
spl_mutex_lockdep_off_maybe(mp); \
|
||||
|
|
|
@ -1,148 +0,0 @@
|
|||
/*
|
||||
* 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 https://opensource.org/licenses/CDDL-1.0.
|
||||
* 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 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
/* Copyright 2013 Saso Kiselkov. All rights reserved. */
|
||||
|
||||
#ifndef _SYS_SHA2_H
|
||||
#define _SYS_SHA2_H
|
||||
|
||||
#include <sys/types.h> /* for uint_* */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SHA256_DIGEST_LENGTH 32 /* SHA256 digest length in bytes */
|
||||
#define SHA384_DIGEST_LENGTH 48 /* SHA384 digest length in bytes */
|
||||
#define SHA512_DIGEST_LENGTH 64 /* SHA512 digest length in bytes */
|
||||
|
||||
/* Truncated versions of SHA-512 according to FIPS-180-4, section 5.3.6 */
|
||||
#define SHA512_224_DIGEST_LENGTH 28 /* SHA512/224 digest length */
|
||||
#define SHA512_256_DIGEST_LENGTH 32 /* SHA512/256 digest length */
|
||||
|
||||
#define SHA256_HMAC_BLOCK_SIZE 64 /* SHA256-HMAC block size */
|
||||
#define SHA512_HMAC_BLOCK_SIZE 128 /* SHA512-HMAC block size */
|
||||
|
||||
#define SHA256 0
|
||||
#define SHA256_HMAC 1
|
||||
#define SHA256_HMAC_GEN 2
|
||||
#define SHA384 3
|
||||
#define SHA384_HMAC 4
|
||||
#define SHA384_HMAC_GEN 5
|
||||
#define SHA512 6
|
||||
#define SHA512_HMAC 7
|
||||
#define SHA512_HMAC_GEN 8
|
||||
#define SHA512_224 9
|
||||
#define SHA512_256 10
|
||||
|
||||
/*
|
||||
* SHA2 context.
|
||||
* The contents of this structure are a private interface between the
|
||||
* Init/Update/Final calls of the functions defined below.
|
||||
* Callers must never attempt to read or write any of the fields
|
||||
* in this structure directly.
|
||||
*/
|
||||
typedef struct {
|
||||
uint32_t algotype; /* Algorithm Type */
|
||||
|
||||
/* state (ABCDEFGH) */
|
||||
union {
|
||||
uint32_t s32[8]; /* for SHA256 */
|
||||
uint64_t s64[8]; /* for SHA384/512 */
|
||||
} state;
|
||||
/* number of bits */
|
||||
union {
|
||||
uint32_t c32[2]; /* for SHA256 , modulo 2^64 */
|
||||
uint64_t c64[2]; /* for SHA384/512, modulo 2^128 */
|
||||
} count;
|
||||
union {
|
||||
uint8_t buf8[128]; /* undigested input */
|
||||
uint32_t buf32[32]; /* realigned input */
|
||||
uint64_t buf64[16]; /* realigned input */
|
||||
} buf_un;
|
||||
} SHA2_CTX;
|
||||
|
||||
typedef SHA2_CTX SHA256_CTX;
|
||||
typedef SHA2_CTX SHA384_CTX;
|
||||
typedef SHA2_CTX SHA512_CTX;
|
||||
|
||||
extern void SHA2Init(uint64_t mech, SHA2_CTX *);
|
||||
|
||||
extern void SHA2Update(SHA2_CTX *, const void *, size_t);
|
||||
|
||||
extern void SHA2Final(void *, SHA2_CTX *);
|
||||
|
||||
extern void SHA256Init(SHA256_CTX *);
|
||||
|
||||
extern void SHA256Update(SHA256_CTX *, const void *, size_t);
|
||||
|
||||
extern void SHA256Final(void *, SHA256_CTX *);
|
||||
|
||||
extern void SHA384Init(SHA384_CTX *);
|
||||
|
||||
extern void SHA384Update(SHA384_CTX *, const void *, size_t);
|
||||
|
||||
extern void SHA384Final(void *, SHA384_CTX *);
|
||||
|
||||
extern void SHA512Init(SHA512_CTX *);
|
||||
|
||||
extern void SHA512Update(SHA512_CTX *, const void *, size_t);
|
||||
|
||||
extern void SHA512Final(void *, SHA512_CTX *);
|
||||
|
||||
#ifdef _SHA2_IMPL
|
||||
/*
|
||||
* The following types/functions are all private to the implementation
|
||||
* of the SHA2 functions and must not be used by consumers of the interface
|
||||
*/
|
||||
|
||||
/*
|
||||
* List of support mechanisms in this module.
|
||||
*
|
||||
* It is important to note that in the module, division or modulus calculations
|
||||
* are used on the enumerated type to determine which mechanism is being used;
|
||||
* therefore, changing the order or additional mechanisms should be done
|
||||
* carefully
|
||||
*/
|
||||
typedef enum sha2_mech_type {
|
||||
SHA256_MECH_INFO_TYPE, /* SUN_CKM_SHA256 */
|
||||
SHA256_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA256_HMAC */
|
||||
SHA256_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA256_HMAC_GENERAL */
|
||||
SHA384_MECH_INFO_TYPE, /* SUN_CKM_SHA384 */
|
||||
SHA384_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA384_HMAC */
|
||||
SHA384_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA384_HMAC_GENERAL */
|
||||
SHA512_MECH_INFO_TYPE, /* SUN_CKM_SHA512 */
|
||||
SHA512_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA512_HMAC */
|
||||
SHA512_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA512_HMAC_GENERAL */
|
||||
SHA512_224_MECH_INFO_TYPE, /* SUN_CKM_SHA512_224 */
|
||||
SHA512_256_MECH_INFO_TYPE /* SUN_CKM_SHA512_256 */
|
||||
} sha2_mech_type_t;
|
||||
|
||||
#endif /* _SHA2_IMPL */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _SYS_SHA2_H */
|
|
@ -72,7 +72,7 @@ extern void zfs_inactive(struct inode *ip);
|
|||
extern int zfs_space(znode_t *zp, int cmd, flock64_t *bfp, int flag,
|
||||
offset_t offset, cred_t *cr);
|
||||
extern int zfs_fid(struct inode *ip, fid_t *fidp);
|
||||
extern int zfs_getpage(struct inode *ip, struct page *pl[], int nr_pages);
|
||||
extern int zfs_getpage(struct inode *ip, struct page *pp);
|
||||
extern int zfs_putpage(struct inode *ip, struct page *pp,
|
||||
struct writeback_control *wbc, boolean_t for_sync);
|
||||
extern int zfs_dirty_inode(struct inode *ip, int flags);
|
||||
|
|
|
@ -86,7 +86,8 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#define zn_flush_cached_data(zp, sync) write_inode_now(ZTOI(zp), sync)
|
||||
#define zn_rlimit_fsize(zp, uio) (0)
|
||||
#define zn_rlimit_fsize(size) (0)
|
||||
#define zn_rlimit_fsize_uio(zp, uio) (0)
|
||||
|
||||
/*
|
||||
* zhold() wraps igrab() on Linux, and igrab() may fail when the
|
||||
|
|
|
@ -200,7 +200,6 @@ struct arc_buf {
|
|||
};
|
||||
|
||||
typedef enum arc_buf_contents {
|
||||
ARC_BUFC_INVALID, /* invalid type */
|
||||
ARC_BUFC_DATA, /* buffer contains data */
|
||||
ARC_BUFC_METADATA, /* buffer contains metadata */
|
||||
ARC_BUFC_NUMTYPES
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#define _SYS_ARC_IMPL_H
|
||||
|
||||
#include <sys/arc.h>
|
||||
#include <sys/multilist.h>
|
||||
#include <sys/zio_crypt.h>
|
||||
#include <sys/zthr.h>
|
||||
#include <sys/aggsum.h>
|
||||
|
@ -81,15 +82,18 @@ typedef struct arc_state {
|
|||
* supports the "dbufs" kstat
|
||||
*/
|
||||
arc_state_type_t arcs_state;
|
||||
/*
|
||||
* total amount of data in this state.
|
||||
*/
|
||||
zfs_refcount_t arcs_size[ARC_BUFC_NUMTYPES] ____cacheline_aligned;
|
||||
/*
|
||||
* total amount of evictable data in this state
|
||||
*/
|
||||
zfs_refcount_t arcs_esize[ARC_BUFC_NUMTYPES] ____cacheline_aligned;
|
||||
zfs_refcount_t arcs_esize[ARC_BUFC_NUMTYPES];
|
||||
/*
|
||||
* total amount of data in this state; this includes: evictable,
|
||||
* non-evictable, ARC_BUFC_DATA, and ARC_BUFC_METADATA.
|
||||
* amount of hit bytes for this state (counted only for ghost states)
|
||||
*/
|
||||
zfs_refcount_t arcs_size;
|
||||
wmsum_t arcs_hits[ARC_BUFC_NUMTYPES];
|
||||
} arc_state_t;
|
||||
|
||||
typedef struct arc_callback arc_callback_t;
|
||||
|
@ -357,8 +361,9 @@ typedef struct l2arc_lb_ptr_buf {
|
|||
#define L2BLK_SET_PREFETCH(field, x) BF64_SET((field), 39, 1, x)
|
||||
#define L2BLK_GET_CHECKSUM(field) BF64_GET((field), 40, 8)
|
||||
#define L2BLK_SET_CHECKSUM(field, x) BF64_SET((field), 40, 8, x)
|
||||
#define L2BLK_GET_TYPE(field) BF64_GET((field), 48, 8)
|
||||
#define L2BLK_SET_TYPE(field, x) BF64_SET((field), 48, 8, x)
|
||||
/* +/- 1 here are to keep compatibility after ARC_BUFC_INVALID removal. */
|
||||
#define L2BLK_GET_TYPE(field) (BF64_GET((field), 48, 8) - 1)
|
||||
#define L2BLK_SET_TYPE(field, x) BF64_SET((field), 48, 8, (x) + 1)
|
||||
#define L2BLK_GET_PROTECTED(field) BF64_GET((field), 56, 1)
|
||||
#define L2BLK_SET_PROTECTED(field, x) BF64_SET((field), 56, 1, x)
|
||||
#define L2BLK_GET_STATE(field) BF64_GET((field), 57, 4)
|
||||
|
@ -581,7 +586,9 @@ typedef struct arc_stats {
|
|||
kstat_named_t arcstat_hash_collisions;
|
||||
kstat_named_t arcstat_hash_chains;
|
||||
kstat_named_t arcstat_hash_chain_max;
|
||||
kstat_named_t arcstat_p;
|
||||
kstat_named_t arcstat_meta;
|
||||
kstat_named_t arcstat_pd;
|
||||
kstat_named_t arcstat_pm;
|
||||
kstat_named_t arcstat_c;
|
||||
kstat_named_t arcstat_c_min;
|
||||
kstat_named_t arcstat_c_max;
|
||||
|
@ -654,6 +661,8 @@ typedef struct arc_stats {
|
|||
* are all included in this value.
|
||||
*/
|
||||
kstat_named_t arcstat_anon_size;
|
||||
kstat_named_t arcstat_anon_data;
|
||||
kstat_named_t arcstat_anon_metadata;
|
||||
/*
|
||||
* Number of bytes consumed by ARC buffers that meet the
|
||||
* following criteria: backing buffers of type ARC_BUFC_DATA,
|
||||
|
@ -675,6 +684,8 @@ typedef struct arc_stats {
|
|||
* are all included in this value.
|
||||
*/
|
||||
kstat_named_t arcstat_mru_size;
|
||||
kstat_named_t arcstat_mru_data;
|
||||
kstat_named_t arcstat_mru_metadata;
|
||||
/*
|
||||
* Number of bytes consumed by ARC buffers that meet the
|
||||
* following criteria: backing buffers of type ARC_BUFC_DATA,
|
||||
|
@ -699,6 +710,8 @@ typedef struct arc_stats {
|
|||
* buffers *would have* consumed this number of bytes.
|
||||
*/
|
||||
kstat_named_t arcstat_mru_ghost_size;
|
||||
kstat_named_t arcstat_mru_ghost_data;
|
||||
kstat_named_t arcstat_mru_ghost_metadata;
|
||||
/*
|
||||
* Number of bytes that *would have been* consumed by ARC
|
||||
* buffers that are eligible for eviction, of type
|
||||
|
@ -718,6 +731,8 @@ typedef struct arc_stats {
|
|||
* are all included in this value.
|
||||
*/
|
||||
kstat_named_t arcstat_mfu_size;
|
||||
kstat_named_t arcstat_mfu_data;
|
||||
kstat_named_t arcstat_mfu_metadata;
|
||||
/*
|
||||
* Number of bytes consumed by ARC buffers that are eligible for
|
||||
* eviction, of type ARC_BUFC_DATA, and reside in the arc_mfu
|
||||
|
@ -736,6 +751,8 @@ typedef struct arc_stats {
|
|||
* arcstat_mru_ghost_size for more details.
|
||||
*/
|
||||
kstat_named_t arcstat_mfu_ghost_size;
|
||||
kstat_named_t arcstat_mfu_ghost_data;
|
||||
kstat_named_t arcstat_mfu_ghost_metadata;
|
||||
/*
|
||||
* Number of bytes that *would have been* consumed by ARC
|
||||
* buffers that are eligible for eviction, of type
|
||||
|
@ -753,6 +770,8 @@ typedef struct arc_stats {
|
|||
* ARC_FLAG_UNCACHED being set.
|
||||
*/
|
||||
kstat_named_t arcstat_uncached_size;
|
||||
kstat_named_t arcstat_uncached_data;
|
||||
kstat_named_t arcstat_uncached_metadata;
|
||||
/*
|
||||
* Number of data bytes that are going to be evicted from ARC due to
|
||||
* ARC_FLAG_UNCACHED being set.
|
||||
|
@ -875,10 +894,7 @@ typedef struct arc_stats {
|
|||
kstat_named_t arcstat_loaned_bytes;
|
||||
kstat_named_t arcstat_prune;
|
||||
kstat_named_t arcstat_meta_used;
|
||||
kstat_named_t arcstat_meta_limit;
|
||||
kstat_named_t arcstat_dnode_limit;
|
||||
kstat_named_t arcstat_meta_max;
|
||||
kstat_named_t arcstat_meta_min;
|
||||
kstat_named_t arcstat_async_upgrade_sync;
|
||||
/* Number of predictive prefetch requests. */
|
||||
kstat_named_t arcstat_predictive_prefetch;
|
||||
|
@ -941,7 +957,7 @@ typedef struct arc_sums {
|
|||
wmsum_t arcstat_data_size;
|
||||
wmsum_t arcstat_metadata_size;
|
||||
wmsum_t arcstat_dbuf_size;
|
||||
aggsum_t arcstat_dnode_size;
|
||||
wmsum_t arcstat_dnode_size;
|
||||
wmsum_t arcstat_bonus_size;
|
||||
wmsum_t arcstat_l2_hits;
|
||||
wmsum_t arcstat_l2_misses;
|
||||
|
@ -986,7 +1002,7 @@ typedef struct arc_sums {
|
|||
wmsum_t arcstat_memory_direct_count;
|
||||
wmsum_t arcstat_memory_indirect_count;
|
||||
wmsum_t arcstat_prune;
|
||||
aggsum_t arcstat_meta_used;
|
||||
wmsum_t arcstat_meta_used;
|
||||
wmsum_t arcstat_async_upgrade_sync;
|
||||
wmsum_t arcstat_predictive_prefetch;
|
||||
wmsum_t arcstat_demand_hit_predictive_prefetch;
|
||||
|
@ -1014,7 +1030,9 @@ typedef struct arc_evict_waiter {
|
|||
#define ARCSTAT_BUMPDOWN(stat) ARCSTAT_INCR(stat, -1)
|
||||
|
||||
#define arc_no_grow ARCSTAT(arcstat_no_grow) /* do not grow cache size */
|
||||
#define arc_p ARCSTAT(arcstat_p) /* target size of MRU */
|
||||
#define arc_meta ARCSTAT(arcstat_meta) /* target frac of metadata */
|
||||
#define arc_pd ARCSTAT(arcstat_pd) /* target frac of data MRU */
|
||||
#define arc_pm ARCSTAT(arcstat_pm) /* target frac of meta MRU */
|
||||
#define arc_c ARCSTAT(arcstat_c) /* target size of cache */
|
||||
#define arc_c_min ARCSTAT(arcstat_c_min) /* min target cache size */
|
||||
#define arc_c_max ARCSTAT(arcstat_c_max) /* max target cache size */
|
||||
|
|
93
sys/contrib/openzfs/include/sys/bitmap.h
Normal file
93
sys/contrib/openzfs/include/sys/bitmap.h
Normal file
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* 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 https://opensource.org/licenses/CDDL-1.0.
|
||||
* 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 2006 Sun Microsystems, Inc. All rights reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
|
||||
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
|
||||
/* All Rights Reserved */
|
||||
|
||||
|
||||
#ifndef _SYS_BITMAP_H
|
||||
#define _SYS_BITMAP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Operations on bitmaps of arbitrary size
|
||||
* A bitmap is a vector of 1 or more ulong_t's.
|
||||
* The user of the package is responsible for range checks and keeping
|
||||
* track of sizes.
|
||||
*/
|
||||
|
||||
#ifdef _LP64
|
||||
#define BT_ULSHIFT 6 /* log base 2 of BT_NBIPUL, to extract word index */
|
||||
#define BT_ULSHIFT32 5 /* log base 2 of BT_NBIPUL, to extract word index */
|
||||
#else
|
||||
#define BT_ULSHIFT 5 /* log base 2 of BT_NBIPUL, to extract word index */
|
||||
#endif
|
||||
|
||||
#define BT_NBIPUL (1 << BT_ULSHIFT) /* n bits per ulong_t */
|
||||
#define BT_ULMASK (BT_NBIPUL - 1) /* to extract bit index */
|
||||
|
||||
/*
|
||||
* bitmap is a ulong_t *, bitindex an index_t
|
||||
*
|
||||
* The macros BT_WIM and BT_BIW internal; there is no need
|
||||
* for users of this package to use them.
|
||||
*/
|
||||
|
||||
/*
|
||||
* word in map
|
||||
*/
|
||||
#define BT_WIM(bitmap, bitindex) \
|
||||
((bitmap)[(bitindex) >> BT_ULSHIFT])
|
||||
/*
|
||||
* bit in word
|
||||
*/
|
||||
#define BT_BIW(bitindex) \
|
||||
(1UL << ((bitindex) & BT_ULMASK))
|
||||
|
||||
/*
|
||||
* These are public macros
|
||||
*
|
||||
* BT_BITOUL == n bits to n ulong_t's
|
||||
*/
|
||||
#define BT_BITOUL(nbits) \
|
||||
(((nbits) + BT_NBIPUL - 1l) / BT_NBIPUL)
|
||||
#define BT_SIZEOFMAP(nbits) \
|
||||
(BT_BITOUL(nbits) * sizeof (ulong_t))
|
||||
#define BT_TEST(bitmap, bitindex) \
|
||||
((BT_WIM((bitmap), (bitindex)) & BT_BIW(bitindex)) ? 1 : 0)
|
||||
#define BT_SET(bitmap, bitindex) \
|
||||
{ BT_WIM((bitmap), (bitindex)) |= BT_BIW(bitindex); }
|
||||
#define BT_CLEAR(bitmap, bitindex) \
|
||||
{ BT_WIM((bitmap), (bitindex)) &= ~BT_BIW(bitindex); }
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _SYS_BITMAP_H */
|
|
@ -22,11 +22,11 @@
|
|||
/*
|
||||
* Based on BLAKE3 v1.3.1, https://github.com/BLAKE3-team/BLAKE3
|
||||
* Copyright (c) 2019-2020 Samuel Neves and Jack O'Connor
|
||||
* Copyright (c) 2021 Tino Reichardt <milky-zfs@mcmilk.de>
|
||||
* Copyright (c) 2021-2022 Tino Reichardt <milky-zfs@mcmilk.de>
|
||||
*/
|
||||
|
||||
#ifndef BLAKE3_H
|
||||
#define BLAKE3_H
|
||||
#ifndef _SYS_BLAKE3_H
|
||||
#define _SYS_BLAKE3_H
|
||||
|
||||
#ifdef _KERNEL
|
||||
#include <sys/types.h>
|
||||
|
@ -97,26 +97,8 @@ extern void **blake3_per_cpu_ctx;
|
|||
extern void blake3_per_cpu_ctx_init(void);
|
||||
extern void blake3_per_cpu_ctx_fini(void);
|
||||
|
||||
/* get count of supported implementations */
|
||||
extern uint32_t blake3_impl_getcnt(void);
|
||||
|
||||
/* get id of selected implementation */
|
||||
extern uint32_t blake3_impl_getid(void);
|
||||
|
||||
/* get name of selected implementation */
|
||||
extern const char *blake3_impl_getname(void);
|
||||
|
||||
/* setup id as fastest implementation */
|
||||
extern void blake3_impl_set_fastest(uint32_t id);
|
||||
|
||||
/* set implementation by id */
|
||||
extern void blake3_impl_setid(uint32_t id);
|
||||
|
||||
/* set implementation by name */
|
||||
extern int blake3_impl_setname(const char *name);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* BLAKE3_H */
|
||||
#endif /* _SYS_BLAKE3_H */
|
||||
|
|
62
sys/contrib/openzfs/include/sys/brt.h
Normal file
62
sys/contrib/openzfs/include/sys/brt.h
Normal file
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* 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 https://opensource.org/licenses/CDDL-1.0.
|
||||
* 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) 2020, 2021, 2022 by Pawel Jakub Dawidek
|
||||
*/
|
||||
|
||||
#ifndef _SYS_BRT_H
|
||||
#define _SYS_BRT_H
|
||||
|
||||
#include <sys/sysmacros.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/fs/zfs.h>
|
||||
#include <sys/zio.h>
|
||||
#include <sys/dmu.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern boolean_t brt_entry_decref(spa_t *spa, const blkptr_t *bp);
|
||||
|
||||
extern uint64_t brt_get_dspace(spa_t *spa);
|
||||
extern uint64_t brt_get_used(spa_t *spa);
|
||||
extern uint64_t brt_get_saved(spa_t *spa);
|
||||
extern uint64_t brt_get_ratio(spa_t *spa);
|
||||
|
||||
extern boolean_t brt_maybe_exists(spa_t *spa, const blkptr_t *bp);
|
||||
extern void brt_init(void);
|
||||
extern void brt_fini(void);
|
||||
|
||||
extern void brt_pending_add(spa_t *spa, const blkptr_t *bp, dmu_tx_t *tx);
|
||||
extern void brt_pending_remove(spa_t *spa, const blkptr_t *bp, dmu_tx_t *tx);
|
||||
extern void brt_pending_apply(spa_t *spa, uint64_t txg);
|
||||
|
||||
extern void brt_create(spa_t *spa);
|
||||
extern int brt_load(spa_t *spa);
|
||||
extern void brt_unload(spa_t *spa);
|
||||
extern void brt_sync(spa_t *spa, uint64_t txg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _SYS_BRT_H */
|
|
@ -172,6 +172,7 @@ typedef struct dbuf_dirty_record {
|
|||
override_states_t dr_override_state;
|
||||
uint8_t dr_copies;
|
||||
boolean_t dr_nopwrite;
|
||||
boolean_t dr_brtwrite;
|
||||
boolean_t dr_has_raw_params;
|
||||
|
||||
/*
|
||||
|
@ -381,6 +382,7 @@ void dbuf_assign_arcbuf(dmu_buf_impl_t *db, arc_buf_t *buf, dmu_tx_t *tx);
|
|||
dbuf_dirty_record_t *dbuf_dirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
|
||||
dbuf_dirty_record_t *dbuf_dirty_lightweight(dnode_t *dn, uint64_t blkid,
|
||||
dmu_tx_t *tx);
|
||||
boolean_t dbuf_undirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
|
||||
arc_buf_t *dbuf_loan_arcbuf(dmu_buf_impl_t *db);
|
||||
void dmu_buf_write_embedded(dmu_buf_t *dbuf, void *data,
|
||||
bp_embedded_type_t etype, enum zio_compress comp,
|
||||
|
|
|
@ -248,6 +248,8 @@ extern int ddt_walk(spa_t *spa, ddt_bookmark_t *ddb, ddt_entry_t *dde);
|
|||
extern int ddt_object_update(ddt_t *ddt, enum ddt_type type,
|
||||
enum ddt_class clazz, ddt_entry_t *dde, dmu_tx_t *tx);
|
||||
|
||||
extern boolean_t ddt_addref(spa_t *spa, const blkptr_t *bp);
|
||||
|
||||
extern const ddt_ops_t ddt_zap_ops;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -782,6 +782,8 @@ dmu_tx_t *dmu_tx_create(objset_t *os);
|
|||
void dmu_tx_hold_write(dmu_tx_t *tx, uint64_t object, uint64_t off, int len);
|
||||
void dmu_tx_hold_write_by_dnode(dmu_tx_t *tx, dnode_t *dn, uint64_t off,
|
||||
int len);
|
||||
void dmu_tx_hold_clone_by_dnode(dmu_tx_t *tx, dnode_t *dn, uint64_t off,
|
||||
int len);
|
||||
void dmu_tx_hold_free(dmu_tx_t *tx, uint64_t object, uint64_t off,
|
||||
uint64_t len);
|
||||
void dmu_tx_hold_free_by_dnode(dmu_tx_t *tx, dnode_t *dn, uint64_t off,
|
||||
|
@ -1059,6 +1061,12 @@ int dmu_sync(struct zio *zio, uint64_t txg, dmu_sync_cb_t *done, zgd_t *zgd);
|
|||
int dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole,
|
||||
uint64_t *off);
|
||||
|
||||
int dmu_read_l0_bps(objset_t *os, uint64_t object, uint64_t offset,
|
||||
uint64_t length, dmu_tx_t *tx, struct blkptr *bps, size_t *nbpsp);
|
||||
void dmu_brt_clone(objset_t *os, uint64_t object, uint64_t offset,
|
||||
uint64_t length, dmu_tx_t *tx, const struct blkptr *bps, size_t nbps,
|
||||
boolean_t replay);
|
||||
|
||||
/*
|
||||
* Initial setup and final teardown.
|
||||
*/
|
||||
|
|
|
@ -79,8 +79,8 @@ typedef struct dmu_recv_cookie {
|
|||
objlist_t *drc_ignore_objlist;
|
||||
} dmu_recv_cookie_t;
|
||||
|
||||
int dmu_recv_begin(char *, char *, dmu_replay_record_t *,
|
||||
boolean_t, boolean_t, boolean_t, nvlist_t *, nvlist_t *, char *,
|
||||
int dmu_recv_begin(const char *, const char *, dmu_replay_record_t *,
|
||||
boolean_t, boolean_t, boolean_t, nvlist_t *, nvlist_t *, const char *,
|
||||
dmu_recv_cookie_t *, zfs_file_t *, offset_t *);
|
||||
int dmu_recv_stream(dmu_recv_cookie_t *, offset_t *);
|
||||
int dmu_recv_end(dmu_recv_cookie_t *, void *);
|
||||
|
|
|
@ -90,6 +90,7 @@ enum dmu_tx_hold_type {
|
|||
THT_ZAP,
|
||||
THT_SPACE,
|
||||
THT_SPILL,
|
||||
THT_CLONE,
|
||||
THT_NUMTYPES
|
||||
};
|
||||
|
||||
|
|
|
@ -372,7 +372,6 @@ int dsl_dataset_rename_snapshot(const char *fsname,
|
|||
const char *oldsnapname, const char *newsnapname, boolean_t recursive);
|
||||
int dsl_dataset_snapshot_tmp(const char *fsname, const char *snapname,
|
||||
minor_t cleanup_minor, const char *htag);
|
||||
boolean_t zfeature_active(spa_feature_t f, void *arg);
|
||||
|
||||
blkptr_t *dsl_dataset_get_blkptr(dsl_dataset_t *ds);
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue