Add zstd support to the boot loader.

Add support to the _STANDALONE environment enough bits of the kernel
that we can compile it. We still have a small zstd_shim.c since there
were 3 items that were a bit hard to nail down and may be cleaned up
in the future. These go hand in hand with a number of commits to
sys/sys in the past weeks, should this need be MFCd.

Discussed with: mmacy (in review and on IRC/Slack)
Reviewed by: freqlabs (on openzfs repo)
Differential Revision: https://reviews.freebsd.org/D26218
This commit is contained in:
Warner Losh 2020-10-12 22:19:07 +00:00
parent e59db46854
commit 2fec3ae896
27 changed files with 227 additions and 282 deletions

View File

@ -40,6 +40,7 @@ CFLAGS.zfs_module.c+= -I${SYSDIR}/contrib/openzfs/include
CFLAGS.zfs_module.c+= -I${SYSDIR}/contrib/openzfs/include/os/freebsd/spl CFLAGS.zfs_module.c+= -I${SYSDIR}/contrib/openzfs/include/os/freebsd/spl
CFLAGS.zfs_module.c+= -I${SYSDIR}/contrib/openzfs/include/os/freebsd/zfs CFLAGS.zfs_module.c+= -I${SYSDIR}/contrib/openzfs/include/os/freebsd/zfs
CFLAGS.zfs_module.c+= -I${SYSDIR}/cddl/contrib/opensolaris/common/lz4 CFLAGS.zfs_module.c+= -I${SYSDIR}/cddl/contrib/opensolaris/common/lz4
CFLAGS.zfs_module.c+= -include ${ZFSOSINC}/spl/sys/ccompile.h
CFLAGS+= -DEFI_ZFS_BOOT CFLAGS+= -DEFI_ZFS_BOOT
.endif .endif

View File

@ -1,17 +1,37 @@
# $FreeBSD$ # $FreeBSD$
.PATH: ${ZFSSRC} .PATH: ${ZFSSRC}
SRCS+= zfs.c nvlist.c skein.c skein_block.c list.c
.PATH: ${SYSDIR}/crypto/skein .PATH: ${SYSDIR}/crypto/skein
.PATH: ${SYSDIR}/cddl/contrib/opensolaris/uts/common/os .PATH: ${ZFSOSSRC}/spl
.PATH: ${OZFS}/module/zstd/lib
ZFSSRC= zfs.c nvlist.c skein.c skein_block.c list.c zstd_shim.c zstd.c
SRCS+= ${ZFSSRC}
CFLAGS+= -I${LDRSRC} CFLAGS+= -I${LDRSRC}
CFLAGS+= -I${SYSDIR}/cddl/boot/zfs CFLAGS+= -I${SYSDIR}/cddl/boot/zfs
CFLAGS+= -I${SYSDIR}/cddl/contrib/opensolaris/uts/common
CFLAGS+= -I${SYSDIR}/crypto/skein CFLAGS+= -I${SYSDIR}/crypto/skein
ZFS_EARLY= -I${ZFSOSINC} \
-I${ZFSOSINC}/spl \
-I${ZFSOSINC}/zfs
.for i in ${ZFSSRC}
CFLAGS.$i+= -include ${ZFSOSINC}/spl/sys/ccompile.h
.endfor
CFLAGS_EARLY.list.c+= ${ZFS_EARLY}
CFLAGS_EARLY.zstd_shim.c+= ${ZFS_EARLY}
# Can't use the early flags because there's two conflicting definitions of boolean_t in
# the zfs code that need to be unified.
CFLAGS.nvlist.c+= -I${ZFSOSINC}/spl
CFLAGS.zfs.c+= -I${ZFSOSINC}/spl \
-I${SRCTOP}/sys/cddl/contrib/opensolaris/common/lz4
CFLAGS.zstd_shim.c+= -DIN_BASE -I${OZFS}/include
# Do not unroll skein loops, reduce code size # Do not unroll skein loops, reduce code size
CFLAGS.skein_block.c+= -DSKEIN_LOOP=111 CFLAGS.skein_block.c+= -DSKEIN_LOOP=111
CFLAGS+= -I${SYSDIR}/contrib/openzfs/include CFLAGS+= -I${SYSDIR}/contrib/openzfs/include
CFLAGS+= -I${SYSDIR}/contrib/openzfs/include/os/freebsd/zfs CFLAGS+= -I${SYSDIR}/contrib/openzfs/include/os/freebsd/zfs
CFLAGS.zfs.c+= -I${SYSDIR}/cddl/contrib/opensolaris/common/lz4 CFLAGS.zfs.c+= -I${SYSDIR}/cddl/contrib/opensolaris/common/lz4

View File

@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
#include "zfsimpl.h" #include "zfsimpl.h"
#include "zfssubr.c" #include "zfssubr.c"
extern int zstd_init(void);
struct zfsmount { struct zfsmount {
const spa_t *spa; const spa_t *spa;
@ -170,6 +171,7 @@ zfs_init(void)
dnode_cache_buf = malloc(SPA_MAXBLOCKSIZE); dnode_cache_buf = malloc(SPA_MAXBLOCKSIZE);
zfs_init_crc(); zfs_init_crc();
zstd_init();
} }
static int static int

View File

@ -0,0 +1,40 @@
/*-
* Copyright (c) 2020 M. Warner Losh <imp@FreeBSD.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
/*
* Small amount of shim code needed to get zfs_zstd.c to compile. These items
* here should all be defined in the SPL or as part of libstand somewhere, but
* aren't for reasons that haven't been tracked down yet. Ideally, they would
* all go away and we'd compile zfs_zstd.c directly. Based on an original by
* Matt Macey, but only the #include remains untouched from that.
*/
#define ZFS_MODULE_PARAM_ARGS void
typedef int boolean_t; /* This one may be tough to get rid of */
#include <contrib/openzfs/module/zstd/zfs_zstd.c>

View File

@ -611,9 +611,63 @@ enum zio_compress {
ZIO_COMPRESS_GZIP_9, ZIO_COMPRESS_GZIP_9,
ZIO_COMPRESS_ZLE, ZIO_COMPRESS_ZLE,
ZIO_COMPRESS_LZ4, ZIO_COMPRESS_LZ4,
ZIO_COMPRESS_ZSTD,
ZIO_COMPRESS_FUNCTIONS ZIO_COMPRESS_FUNCTIONS
}; };
enum zio_zstd_levels {
ZIO_ZSTD_LEVEL_INHERIT = 0,
ZIO_ZSTD_LEVEL_1,
#define ZIO_ZSTD_LEVEL_MIN ZIO_ZSTD_LEVEL_1
ZIO_ZSTD_LEVEL_2,
ZIO_ZSTD_LEVEL_3,
#define ZIO_ZSTD_LEVEL_DEFAULT ZIO_ZSTD_LEVEL_3
ZIO_ZSTD_LEVEL_4,
ZIO_ZSTD_LEVEL_5,
ZIO_ZSTD_LEVEL_6,
ZIO_ZSTD_LEVEL_7,
ZIO_ZSTD_LEVEL_8,
ZIO_ZSTD_LEVEL_9,
ZIO_ZSTD_LEVEL_10,
ZIO_ZSTD_LEVEL_11,
ZIO_ZSTD_LEVEL_12,
ZIO_ZSTD_LEVEL_13,
ZIO_ZSTD_LEVEL_14,
ZIO_ZSTD_LEVEL_15,
ZIO_ZSTD_LEVEL_16,
ZIO_ZSTD_LEVEL_17,
ZIO_ZSTD_LEVEL_18,
ZIO_ZSTD_LEVEL_19,
#define ZIO_ZSTD_LEVEL_MAX ZIO_ZSTD_LEVEL_19
ZIO_ZSTD_LEVEL_RESERVE = 101, /* Leave room for new positive levels */
ZIO_ZSTD_LEVEL_FAST, /* Fast levels are negative */
ZIO_ZSTD_LEVEL_FAST_1,
#define ZIO_ZSTD_LEVEL_FAST_DEFAULT ZIO_ZSTD_LEVEL_FAST_1
ZIO_ZSTD_LEVEL_FAST_2,
ZIO_ZSTD_LEVEL_FAST_3,
ZIO_ZSTD_LEVEL_FAST_4,
ZIO_ZSTD_LEVEL_FAST_5,
ZIO_ZSTD_LEVEL_FAST_6,
ZIO_ZSTD_LEVEL_FAST_7,
ZIO_ZSTD_LEVEL_FAST_8,
ZIO_ZSTD_LEVEL_FAST_9,
ZIO_ZSTD_LEVEL_FAST_10,
ZIO_ZSTD_LEVEL_FAST_20,
ZIO_ZSTD_LEVEL_FAST_30,
ZIO_ZSTD_LEVEL_FAST_40,
ZIO_ZSTD_LEVEL_FAST_50,
ZIO_ZSTD_LEVEL_FAST_60,
ZIO_ZSTD_LEVEL_FAST_70,
ZIO_ZSTD_LEVEL_FAST_80,
ZIO_ZSTD_LEVEL_FAST_90,
ZIO_ZSTD_LEVEL_FAST_100,
ZIO_ZSTD_LEVEL_FAST_500,
ZIO_ZSTD_LEVEL_FAST_1000,
#define ZIO_ZSTD_LEVEL_FAST_MAX ZIO_ZSTD_LEVEL_FAST_1000
ZIO_ZSTD_LEVEL_AUTO = 251, /* Reserved for future use */
ZIO_ZSTD_LEVEL_LEVELS
};
#define ZIO_COMPRESS_ON_VALUE ZIO_COMPRESS_LZJB #define ZIO_COMPRESS_ON_VALUE ZIO_COMPRESS_LZJB
#define ZIO_COMPRESS_DEFAULT ZIO_COMPRESS_OFF #define ZIO_COMPRESS_DEFAULT ZIO_COMPRESS_OFF

View File

@ -30,8 +30,6 @@ __FBSDID("$FreeBSD$");
static uint64_t zfs_crc64_table[256]; static uint64_t zfs_crc64_table[256];
#define ECKSUM 666
#define ASSERT3S(x, y, z) ((void)0) #define ASSERT3S(x, y, z) ((void)0)
#define ASSERT3U(x, y, z) ((void)0) #define ASSERT3U(x, y, z) ((void)0)
#define ASSERT3P(x, y, z) ((void)0) #define ASSERT3P(x, y, z) ((void)0)
@ -107,6 +105,10 @@ typedef struct zio_checksum_info {
#include "sha256.c" #include "sha256.c"
#include "skein_zfs.c" #include "skein_zfs.c"
extern int zfs_zstd_decompress(void *s_start, void *d_start, size_t s_len,
size_t d_len, int n);
static zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS] = { static zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS] = {
{{NULL, NULL}, NULL, NULL, 0, "inherit"}, {{NULL, NULL}, NULL, NULL, 0, "inherit"},
{{NULL, NULL}, NULL, NULL, 0, "on"}, {{NULL, NULL}, NULL, NULL, 0, "on"},
@ -181,6 +183,7 @@ static zio_compress_info_t zio_compress_table[ZIO_COMPRESS_FUNCTIONS] = {
{NULL, NULL, 9, "gzip-9"}, {NULL, NULL, 9, "gzip-9"},
{NULL, zle_decompress, 64, "zle"}, {NULL, zle_decompress, 64, "zle"},
{NULL, lz4_decompress, 0, "lz4"}, {NULL, lz4_decompress, 0, "lz4"},
{NULL, zfs_zstd_decompress, ZIO_ZSTD_LEVEL_DEFAULT, "zstd"}
}; };
static void static void

View File

@ -1,243 +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 http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Generic doubly-linked list implementation
*/
#include <sys/list.h>
#include <sys/list_impl.h>
#include <sys/types.h>
#include <sys/sysmacros.h>
#include <sys/debug.h>
#define list_d2l(a, obj) ((list_node_t *)(((char *)obj) + (a)->list_offset))
#define list_object(a, node) ((void *)(((char *)node) - (a)->list_offset))
#define list_empty(a) ((a)->list_head.list_next == &(a)->list_head)
#define list_insert_after_node(list, node, object) { \
list_node_t *lnew = list_d2l(list, object); \
lnew->list_prev = (node); \
lnew->list_next = (node)->list_next; \
(node)->list_next->list_prev = lnew; \
(node)->list_next = lnew; \
}
#define list_insert_before_node(list, node, object) { \
list_node_t *lnew = list_d2l(list, object); \
lnew->list_next = (node); \
lnew->list_prev = (node)->list_prev; \
(node)->list_prev->list_next = lnew; \
(node)->list_prev = lnew; \
}
#define list_remove_node(node) \
(node)->list_prev->list_next = (node)->list_next; \
(node)->list_next->list_prev = (node)->list_prev; \
(node)->list_next = (node)->list_prev = NULL
void
list_create(list_t *list, size_t size, size_t offset)
{
ASSERT(list);
ASSERT(size > 0);
ASSERT(size >= offset + sizeof (list_node_t));
list->list_size = size;
list->list_offset = offset;
list->list_head.list_next = list->list_head.list_prev =
&list->list_head;
}
void
list_destroy(list_t *list)
{
list_node_t *node = &list->list_head;
ASSERT(list);
ASSERT(list->list_head.list_next == node);
ASSERT(list->list_head.list_prev == node);
node->list_next = node->list_prev = NULL;
}
void
list_insert_after(list_t *list, void *object, void *nobject)
{
if (object == NULL) {
list_insert_head(list, nobject);
} else {
list_node_t *lold = list_d2l(list, object);
list_insert_after_node(list, lold, nobject);
}
}
void
list_insert_before(list_t *list, void *object, void *nobject)
{
if (object == NULL) {
list_insert_tail(list, nobject);
} else {
list_node_t *lold = list_d2l(list, object);
list_insert_before_node(list, lold, nobject);
}
}
void
list_insert_head(list_t *list, void *object)
{
list_node_t *lold = &list->list_head;
list_insert_after_node(list, lold, object);
}
void
list_insert_tail(list_t *list, void *object)
{
list_node_t *lold = &list->list_head;
list_insert_before_node(list, lold, object);
}
void
list_remove(list_t *list, void *object)
{
list_node_t *lold = list_d2l(list, object);
ASSERT(!list_empty(list));
ASSERT(lold->list_next != NULL);
list_remove_node(lold);
}
void *
list_remove_head(list_t *list)
{
list_node_t *head = list->list_head.list_next;
if (head == &list->list_head)
return (NULL);
list_remove_node(head);
return (list_object(list, head));
}
void *
list_remove_tail(list_t *list)
{
list_node_t *tail = list->list_head.list_prev;
if (tail == &list->list_head)
return (NULL);
list_remove_node(tail);
return (list_object(list, tail));
}
void *
list_head(list_t *list)
{
if (list_empty(list))
return (NULL);
return (list_object(list, list->list_head.list_next));
}
void *
list_tail(list_t *list)
{
if (list_empty(list))
return (NULL);
return (list_object(list, list->list_head.list_prev));
}
void *
list_next(list_t *list, void *object)
{
list_node_t *node = list_d2l(list, object);
if (node->list_next != &list->list_head)
return (list_object(list, node->list_next));
return (NULL);
}
void *
list_prev(list_t *list, void *object)
{
list_node_t *node = list_d2l(list, object);
if (node->list_prev != &list->list_head)
return (list_object(list, node->list_prev));
return (NULL);
}
/*
* Insert src list after dst list. Empty src list thereafter.
*/
void
list_move_tail(list_t *dst, list_t *src)
{
list_node_t *dstnode = &dst->list_head;
list_node_t *srcnode = &src->list_head;
ASSERT(dst->list_size == src->list_size);
ASSERT(dst->list_offset == src->list_offset);
if (list_empty(src))
return;
dstnode->list_prev->list_next = srcnode->list_next;
srcnode->list_next->list_prev = dstnode->list_prev;
dstnode->list_prev = srcnode->list_prev;
srcnode->list_prev->list_next = dstnode;
/* empty src list */
srcnode->list_next = srcnode->list_prev = srcnode;
}
void
list_link_replace(list_node_t *lold, list_node_t *lnew)
{
ASSERT(list_link_active(lold));
ASSERT(!list_link_active(lnew));
lnew->list_next = lold->list_next;
lnew->list_prev = lold->list_prev;
lold->list_prev->list_next = lnew;
lold->list_next->list_prev = lnew;
lold->list_next = lold->list_prev = NULL;
}
void
list_link_init(list_node_t *link)
{
link->list_next = NULL;
link->list_prev = NULL;
}
int
list_link_active(list_node_t *link)
{
return (link->list_next != NULL);
}
int
list_is_empty(list_t *list)
{
return (list_empty(list));
}

View File

@ -68,7 +68,7 @@
#define noinline __noinline #define noinline __noinline
#define ____cacheline_aligned __aligned(CACHE_LINE_SIZE) #define ____cacheline_aligned __aligned(CACHE_LINE_SIZE)
#ifndef _KERNEL #if !defined(_KERNEL) && !defined(_STANDALONE)
#define likely(x) __builtin_expect(!!(x), 1) #define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0) #define unlikely(x) __builtin_expect(!!(x), 0)
#endif #endif

View File

@ -33,7 +33,7 @@
#include <rpc/types.h> #include <rpc/types.h>
#include_next <rpc/xdr.h> #include_next <rpc/xdr.h>
#ifndef _KERNEL #if !defined(_KERNEL) && !defined(_STANDALONE)
#include <assert.h> #include <assert.h>
@ -66,6 +66,6 @@ xdrmem_control(XDR *xdrs, int request, void *info)
xdrmem_control((xdrs), (req), (op)) : \ xdrmem_control((xdrs), (req), (op)) : \
(*(xdrs)->x_ops->x_control)(xdrs, req, op)) (*(xdrs)->x_ops->x_control)(xdrs, req, op))
#endif /* !_KERNEL */ #endif /* !_KERNEL && !_STANDALONE */
#endif /* !_OPENSOLARIS_RPC_XDR_H_ */ #endif /* !_OPENSOLARIS_RPC_XDR_H_ */

View File

@ -29,6 +29,8 @@
#ifndef _OPENSOLARIS_SYS_ATOMIC_H_ #ifndef _OPENSOLARIS_SYS_ATOMIC_H_
#define _OPENSOLARIS_SYS_ATOMIC_H_ #define _OPENSOLARIS_SYS_ATOMIC_H_
#ifndef _STANDALONE
#include <sys/types.h> #include <sys/types.h>
#include <machine/atomic.h> #include <machine/atomic.h>
@ -179,4 +181,13 @@ atomic_cas_ptr(volatile void *target, void *cmp, void *newval)
} }
#endif /* !defined(COMPAT_32BIT) && defined(__LP64__) */ #endif /* !defined(COMPAT_32BIT) && defined(__LP64__) */
#else /* _STANDALONE */
/*
* sometimes atomic_add_64 is defined, sometimes not, but the
* following is always right for the boot loader.
*/
#undef atomic_add_64
#define atomic_add_64(ptr, val) *(ptr) += val
#endif /* !_STANDALONE */
#endif /* !_OPENSOLARIS_SYS_ATOMIC_H_ */ #endif /* !_OPENSOLARIS_SYS_ATOMIC_H_ */

View File

@ -80,10 +80,11 @@
#define BE_64(x) BSWAP_64(x) #define BE_64(x) BSWAP_64(x)
#endif #endif
#if !defined(_STANDALONE)
#if BYTE_ORDER == _BIG_ENDIAN #if BYTE_ORDER == _BIG_ENDIAN
#define htonll(x) BMASK_64(x) #define htonll(x) BMASK_64(x)
#define ntohll(x) BMASK_64(x) #define ntohll(x) BMASK_64(x)
#else #else /* BYTE_ORDER == _LITTLE_ENDIAN */
#ifndef __LP64__ #ifndef __LP64__
static __inline__ uint64_t static __inline__ uint64_t
htonll(uint64_t n) htonll(uint64_t n)
@ -96,11 +97,12 @@ ntohll(uint64_t n)
{ {
return ((((uint64_t)ntohl(n)) << 32) + ntohl(n >> 32)); return ((((uint64_t)ntohl(n)) << 32) + ntohl(n >> 32));
} }
#else #else /* !__LP64__ */
#define htonll(x) BSWAP_64(x) #define htonll(x) BSWAP_64(x)
#define ntohll(x) BSWAP_64(x) #define ntohll(x) BSWAP_64(x)
#endif #endif /* __LP64__ */
#endif #endif /* BYTE_ORDER */
#endif /* _STANDALONE */
#define BE_IN32(xa) htonl(*((uint32_t *)(void *)(xa))) #define BE_IN32(xa) htonl(*((uint32_t *)(void *)(xa)))

View File

@ -113,9 +113,9 @@ extern "C" {
#define __VPRINTFLIKE(__n) __sun_attr__((__VPRINTFLIKE__(__n))) #define __VPRINTFLIKE(__n) __sun_attr__((__VPRINTFLIKE__(__n)))
#define __KPRINTFLIKE(__n) __sun_attr__((__KPRINTFLIKE__(__n))) #define __KPRINTFLIKE(__n) __sun_attr__((__KPRINTFLIKE__(__n)))
#define __KVPRINTFLIKE(__n) __sun_attr__((__KVPRINTFLIKE__(__n))) #define __KVPRINTFLIKE(__n) __sun_attr__((__KVPRINTFLIKE__(__n)))
#ifdef _KERNEL #if defined(_KERNEL) || defined(_STANDALONE)
#define __NORETURN __sun_attr__((__noreturn__)) #define __NORETURN __sun_attr__((__noreturn__))
#endif #endif /* _KERNEL || _STANDALONE */
#define __CONST __sun_attr__((__const__)) #define __CONST __sun_attr__((__const__))
#define __PURE __sun_attr__((__pure__)) #define __PURE __sun_attr__((__pure__))
@ -174,7 +174,7 @@ typedef int enum_t;
#define __exit #define __exit
#endif #endif
#ifdef _KERNEL #if defined(_KERNEL) || defined(_STANDALONE)
#define param_set_charp(a, b) (0) #define param_set_charp(a, b) (0)
#define ATTR_UID AT_UID #define ATTR_UID AT_UID
#define ATTR_GID AT_GID #define ATTR_GID AT_GID
@ -183,9 +183,15 @@ typedef int enum_t;
#define ATTR_CTIME AT_CTIME #define ATTR_CTIME AT_CTIME
#define ATTR_MTIME AT_MTIME #define ATTR_MTIME AT_MTIME
#define ATTR_ATIME AT_ATIME #define ATTR_ATIME AT_ATIME
#if defined(_STANDALONE)
#define vmem_free kmem_free
#define vmem_zalloc kmem_zalloc
#define vmem_alloc kmem_zalloc
#else
#define vmem_free zfs_kmem_free #define vmem_free zfs_kmem_free
#define vmem_zalloc(size, flags) zfs_kmem_alloc(size, flags | M_ZERO) #define vmem_zalloc(size, flags) zfs_kmem_alloc(size, flags | M_ZERO)
#define vmem_alloc zfs_kmem_alloc #define vmem_alloc zfs_kmem_alloc
#endif
#define MUTEX_NOLOCKDEP 0 #define MUTEX_NOLOCKDEP 0
#define RW_NOLOCKDEP 0 #define RW_NOLOCKDEP 0

View File

@ -52,42 +52,33 @@ extern "C" {
/*PRINTFLIKE2*/ /*PRINTFLIKE2*/
extern void cmn_err(int, const char *, ...) extern void cmn_err(int, const char *, ...)
__KPRINTFLIKE(2); __KPRINTFLIKE(2);
#pragma rarely_called(cmn_err)
extern void vzcmn_err(zoneid_t, int, const char *, __va_list) extern void vzcmn_err(zoneid_t, int, const char *, __va_list)
__KVPRINTFLIKE(3); __KVPRINTFLIKE(3);
#pragma rarely_called(vzcmn_err)
extern void vcmn_err(int, const char *, __va_list) extern void vcmn_err(int, const char *, __va_list)
__KVPRINTFLIKE(2); __KVPRINTFLIKE(2);
#pragma rarely_called(vcmn_err)
/*PRINTFLIKE3*/ /*PRINTFLIKE3*/
extern void zcmn_err(zoneid_t, int, const char *, ...) extern void zcmn_err(zoneid_t, int, const char *, ...)
__KPRINTFLIKE(3); __KPRINTFLIKE(3);
#pragma rarely_called(zcmn_err)
extern void vzprintf(zoneid_t, const char *, __va_list) extern void vzprintf(zoneid_t, const char *, __va_list)
__KVPRINTFLIKE(2); __KVPRINTFLIKE(2);
#pragma rarely_called(vzprintf)
/*PRINTFLIKE2*/ /*PRINTFLIKE2*/
extern void zprintf(zoneid_t, const char *, ...) extern void zprintf(zoneid_t, const char *, ...)
__KPRINTFLIKE(2); __KPRINTFLIKE(2);
#pragma rarely_called(zprintf)
extern void vuprintf(const char *, __va_list) extern void vuprintf(const char *, __va_list)
__KVPRINTFLIKE(1); __KVPRINTFLIKE(1);
#pragma rarely_called(vuprintf)
/*PRINTFLIKE1*/ /*PRINTFLIKE1*/
extern void panic(const char *, ...) extern void panic(const char *, ...)
__KPRINTFLIKE(1) __NORETURN; __KPRINTFLIKE(1) __NORETURN;
#pragma rarely_called(panic)
extern void vpanic(const char *, __va_list) extern void vpanic(const char *, __va_list)
__KVPRINTFLIKE(1) __NORETURN; __KVPRINTFLIKE(1) __NORETURN;
#pragma rarely_called(vpanic)
#endif /* !_ASM */ #endif /* !_ASM */

View File

@ -36,6 +36,7 @@
#include <sys/spl_condvar.h> #include <sys/spl_condvar.h>
#include <sys/mutex.h> #include <sys/mutex.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/errno.h>
/* /*
* cv_timedwait() is similar to cv_wait() except that it additionally expects * cv_timedwait() is similar to cv_wait() except that it additionally expects

View File

@ -29,6 +29,7 @@
#ifndef _OPENSOLARIS_SYS_KMEM_H_ #ifndef _OPENSOLARIS_SYS_KMEM_H_
#define _OPENSOLARIS_SYS_KMEM_H_ #define _OPENSOLARIS_SYS_KMEM_H_
#ifdef _KERNEL
#include <sys/param.h> #include <sys/param.h>
#include <sys/malloc.h> #include <sys/malloc.h>
#include <sys/vmem.h> #include <sys/vmem.h>
@ -93,5 +94,14 @@ void *calloc(size_t n, size_t s);
zfs_kmem_alloc((size), (kmflags) | M_ZERO) zfs_kmem_alloc((size), (kmflags) | M_ZERO)
#define kmem_free(buf, size) zfs_kmem_free((buf), (size)) #define kmem_free(buf, size) zfs_kmem_free((buf), (size))
#endif /* _KERNEL */
#ifdef _STANDALONE
/*
* At the moment, we just need it for the type. We redirect the alloc/free
* routines to the usual Free and Malloc in that environment.
*/
typedef int kmem_cache_t;
#endif /* _STANDALONE */
#endif /* _OPENSOLARIS_SYS_KMEM_H_ */ #endif /* _OPENSOLARIS_SYS_KMEM_H_ */

View File

@ -30,6 +30,7 @@
#ifndef _SPL_KMEM_CACHE_H #ifndef _SPL_KMEM_CACHE_H
#define _SPL_KMEM_CACHE_H #define _SPL_KMEM_CACHE_H
#ifdef _KERNEL
#include <sys/taskq.h> #include <sys/taskq.h>
/* kmem move callback return values */ /* kmem move callback return values */
@ -46,4 +47,6 @@ extern void spl_kmem_cache_set_move(kmem_cache_t *,
#define kmem_cache_set_move(skc, move) spl_kmem_cache_set_move(skc, move) #define kmem_cache_set_move(skc, move) spl_kmem_cache_set_move(skc, move)
#endif /* _KERNEL */
#endif #endif

View File

@ -24,8 +24,11 @@
#ifndef _SPL_KSTAT_H #ifndef _SPL_KSTAT_H
#define _SPL_KSTAT_H #define _SPL_KSTAT_H
#include <sys/types.h> #include <sys/types.h>
#ifndef _STANDALONE
#include <sys/sysctl.h> #include <sys/sysctl.h>
#endif
struct list_head {}; struct list_head {};
#include <sys/mutex.h> #include <sys/mutex.h>
#include <sys/proc.h> #include <sys/proc.h>
@ -129,9 +132,10 @@ struct kstat_s {
kstat_raw_ops_t ks_raw_ops; /* ops table for raw type */ kstat_raw_ops_t ks_raw_ops; /* ops table for raw type */
char *ks_raw_buf; /* buf used for raw ops */ char *ks_raw_buf; /* buf used for raw ops */
size_t ks_raw_bufsize; /* size of raw ops buffer */ size_t ks_raw_bufsize; /* size of raw ops buffer */
#ifndef _STANDALONE
struct sysctl_ctx_list ks_sysctl_ctx; struct sysctl_ctx_list ks_sysctl_ctx;
struct sysctl_oid *ks_sysctl_root; struct sysctl_oid *ks_sysctl_root;
#endif /* _STANDALONE */
}; };
typedef struct kstat_named_s { typedef struct kstat_named_s {
@ -216,10 +220,16 @@ extern void kstat_runq_exit(kstat_io_t *);
__kstat_set_seq_raw_ops(k, h, d, a) __kstat_set_seq_raw_ops(k, h, d, a)
#define kstat_set_raw_ops(k, h, d, a) \ #define kstat_set_raw_ops(k, h, d, a) \
__kstat_set_raw_ops(k, h, d, a) __kstat_set_raw_ops(k, h, d, a)
#ifndef _STANDALONE
#define kstat_create(m, i, n, c, t, s, f) \ #define kstat_create(m, i, n, c, t, s, f) \
__kstat_create(m, i, n, c, t, s, f) __kstat_create(m, i, n, c, t, s, f)
#define kstat_install(k) __kstat_install(k) #define kstat_install(k) __kstat_install(k)
#define kstat_delete(k) __kstat_delete(k) #define kstat_delete(k) __kstat_delete(k)
#else
#define kstat_create(m, i, n, c, t, s, f) ((kstat_t *)0)
#define kstat_install(k)
#define kstat_delete(k)
#endif
#endif /* _SPL_KSTAT_H */ #endif /* _SPL_KSTAT_H */

View File

@ -41,7 +41,7 @@
#include <sys/kmem.h> #include <sys/kmem.h>
#include <sys/malloc.h> #include <sys/malloc.h>
#ifdef _KERNEL
#define CPU curcpu #define CPU curcpu
#define minclsyspri PRIBIO #define minclsyspri PRIBIO
#define defclsyspri minclsyspri #define defclsyspri minclsyspri
@ -111,4 +111,5 @@ zfs_proc_is_caller(proc_t *p)
return (p == curproc); return (p == curproc);
} }
#endif /* _KERNEL */
#endif /* _OPENSOLARIS_SYS_PROC_H_ */ #endif /* _OPENSOLARIS_SYS_PROC_H_ */

View File

@ -25,6 +25,8 @@
#ifndef _SPL_PROCFS_LIST_H #ifndef _SPL_PROCFS_LIST_H
#define _SPL_PROCFS_LIST_H #define _SPL_PROCFS_LIST_H
#ifndef _STANDALONE
#include <sys/kstat.h> #include <sys/kstat.h>
#include <sys/mutex.h> #include <sys/mutex.h>
@ -64,4 +66,8 @@ void procfs_list_uninstall(procfs_list_t *procfs_list);
void procfs_list_destroy(procfs_list_t *procfs_list); void procfs_list_destroy(procfs_list_t *procfs_list);
void procfs_list_add(procfs_list_t *procfs_list, void *p); void procfs_list_add(procfs_list_t *procfs_list, void *p);
#else
typedef int procfs_list_t;
#endif /* !_STANDALONE */
#endif /* _SPL_PROCFS_LIST_H */ #endif /* _SPL_PROCFS_LIST_H */

View File

@ -29,6 +29,8 @@
#ifndef _OPENSOLARIS_SYS_SIG_H_ #ifndef _OPENSOLARIS_SYS_SIG_H_
#define _OPENSOLARIS_SYS_SIG_H_ #define _OPENSOLARIS_SYS_SIG_H_
#ifndef _STANDALONE
#include_next <sys/signal.h> #include_next <sys/signal.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/lock.h> #include <sys/lock.h>
@ -62,4 +64,7 @@ issig(int why)
} }
return (0); return (0);
} }
#endif /* !_STANDALONE */
#endif /* _OPENSOLARIS_SYS_SIG_H_ */ #endif /* _OPENSOLARIS_SYS_SIG_H_ */

View File

@ -31,6 +31,7 @@
#define _SYS_SYSMACROS_H #define _SYS_SYSMACROS_H
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h>
#include <sys/isa_defs.h> #include <sys/isa_defs.h>
#include <sys/libkern.h> #include <sys/libkern.h>
#include <sys/zone.h> #include <sys/zone.h>
@ -71,7 +72,11 @@ extern "C" {
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#endif #endif
#ifdef _STANDALONE
#define boot_ncpus 1
#else /* _STANDALONE */
#define boot_ncpus mp_ncpus #define boot_ncpus mp_ncpus
#endif /* _STANDALONE */
#define kpreempt_disable() critical_enter() #define kpreempt_disable() critical_enter()
#define kpreempt_enable() critical_exit() #define kpreempt_enable() critical_exit()
#define CPU_SEQID curcpu #define CPU_SEQID curcpu
@ -319,7 +324,7 @@ extern unsigned char bcd_to_byte[256];
/* avoid any possibility of clashing with <stddef.h> version */ /* avoid any possibility of clashing with <stddef.h> version */
#define offsetof(s, m) ((size_t)(&(((s *)0)->m))) #define offsetof(type, field) __offsetof(type, field)
#endif #endif
/* /*

View File

@ -26,6 +26,8 @@
#ifndef _SYS_TASKQ_H #ifndef _SYS_TASKQ_H
#define _SYS_TASKQ_H #define _SYS_TASKQ_H
#ifdef _KERNEL
#include <sys/types.h> #include <sys/types.h>
#include <sys/proc.h> #include <sys/proc.h>
#include <sys/taskqueue.h> #include <sys/taskqueue.h>
@ -112,4 +114,11 @@ void taskq_resume(taskq_t *);
} }
#endif #endif
#endif /* _KERNEL */
#ifdef _STANDALONE
typedef int taskq_ent_t;
#define taskq_init_ent(x)
#endif /* _STANDALONE */
#endif /* _SYS_TASKQ_H */ #endif /* _SYS_TASKQ_H */

View File

@ -29,6 +29,8 @@
#ifndef _OPENSOLARIS_SYS_UIO_H_ #ifndef _OPENSOLARIS_SYS_UIO_H_
#define _OPENSOLARIS_SYS_UIO_H_ #define _OPENSOLARIS_SYS_UIO_H_
#ifndef _STANDALONE
#include_next <sys/uio.h> #include_next <sys/uio.h>
#include <sys/_uio.h> #include <sys/_uio.h>
#include <sys/debug.h> #include <sys/debug.h>
@ -107,4 +109,6 @@ uio_index_at_offset(uio_t *uio, offset_t off, uint_t *vec_idx)
return (off); return (off);
} }
#endif /* !_STANDALONE */
#endif /* !_OPENSOLARIS_SYS_UIO_H_ */ #endif /* !_OPENSOLARIS_SYS_UIO_H_ */

View File

@ -62,7 +62,7 @@ typedef enum {
DATA_TYPE_UINT8, DATA_TYPE_UINT8,
DATA_TYPE_BOOLEAN_ARRAY, DATA_TYPE_BOOLEAN_ARRAY,
DATA_TYPE_INT8_ARRAY, DATA_TYPE_INT8_ARRAY,
#if !defined(_KERNEL) #if !defined(_KERNEL) && !defined(_STANDALONE)
DATA_TYPE_UINT8_ARRAY, DATA_TYPE_UINT8_ARRAY,
DATA_TYPE_DOUBLE DATA_TYPE_DOUBLE
#else #else
@ -191,7 +191,7 @@ int nvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *, uint_t);
int nvlist_add_string_array(nvlist_t *, const char *, char *const *, uint_t); int nvlist_add_string_array(nvlist_t *, const char *, char *const *, uint_t);
int nvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint_t); int nvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint_t);
int nvlist_add_hrtime(nvlist_t *, const char *, hrtime_t); int nvlist_add_hrtime(nvlist_t *, const char *, hrtime_t);
#if !defined(_KERNEL) #if !defined(_KERNEL) && !defined(_STANDALONE)
int nvlist_add_double(nvlist_t *, const char *, double); int nvlist_add_double(nvlist_t *, const char *, double);
#endif #endif
@ -228,7 +228,7 @@ int nvlist_lookup_nvlist_array(nvlist_t *, const char *,
nvlist_t ***, uint_t *); nvlist_t ***, uint_t *);
int nvlist_lookup_hrtime(nvlist_t *, const char *, hrtime_t *); int nvlist_lookup_hrtime(nvlist_t *, const char *, hrtime_t *);
int nvlist_lookup_pairs(nvlist_t *, int, ...); int nvlist_lookup_pairs(nvlist_t *, int, ...);
#if !defined(_KERNEL) #if !defined(_KERNEL) && !defined(_STANDALONE)
int nvlist_lookup_double(nvlist_t *, const char *, double *); int nvlist_lookup_double(nvlist_t *, const char *, double *);
#endif #endif
@ -269,7 +269,7 @@ int nvpair_value_uint64_array(nvpair_t *, uint64_t **, uint_t *);
int nvpair_value_string_array(nvpair_t *, char ***, uint_t *); int nvpair_value_string_array(nvpair_t *, char ***, uint_t *);
int nvpair_value_nvlist_array(nvpair_t *, nvlist_t ***, uint_t *); int nvpair_value_nvlist_array(nvpair_t *, nvlist_t ***, uint_t *);
int nvpair_value_hrtime(nvpair_t *, hrtime_t *); int nvpair_value_hrtime(nvpair_t *, hrtime_t *);
#if !defined(_KERNEL) #if !defined(_KERNEL) && !defined(_STANDALONE)
int nvpair_value_double(nvpair_t *, double *); int nvpair_value_double(nvpair_t *, double *);
#endif #endif

View File

@ -32,7 +32,15 @@
extern "C" { extern "C" {
#endif #endif
#ifdef __KERNEL__ /*
* This code compiles in three different contexts. When __KERNEL__ is defined,
* the code uses "unix-like" kernel interfaces. When _STANDALONE is defined, the
* code is running in a reduced capacity environment of the boot loader which is
* generally a subset of both POSIX and kernel interfaces (with a few unique
* interfaces too). When neither are defined, it's in a userland POSIX or
* similar environment.
*/
#if defined(__KERNEL__) || defined(_STANDALONE)
#include <sys/note.h> #include <sys/note.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/atomic.h> #include <sys/atomic.h>
@ -65,7 +73,7 @@ extern "C" {
#include <sys/procfs_list.h> #include <sys/procfs_list.h>
#include <sys/mod.h> #include <sys/mod.h>
#include <sys/zfs_context_os.h> #include <sys/zfs_context_os.h>
#else /* _KERNEL */ #else /* _KERNEL || _STANDALONE */
#define _SYS_MUTEX_H #define _SYS_MUTEX_H
#define _SYS_RWLOCK_H #define _SYS_RWLOCK_H
@ -759,7 +767,7 @@ extern int kmem_cache_reap_active(void);
#define __init #define __init
#define __exit #define __exit
#endif /* _KERNEL */ #endif /* _KERNEL || _STANDALONE */
#ifdef __cplusplus #ifdef __cplusplus
}; };

View File

@ -45,10 +45,6 @@
*/ */
#define MAXNAMELEN 256 #define MAXNAMELEN 256
#ifndef IN_BASE
#define UID_NOBODY 60001 /* user ID no body */
#define GID_NOBODY UID_NOBODY
#endif
#define UID_NOACCESS 60002 /* user ID no access */ #define UID_NOACCESS 60002 /* user ID no access */
#define MAXUID UINT32_MAX /* max user id */ #define MAXUID UINT32_MAX /* max user id */

View File

@ -27,10 +27,10 @@
* Generic doubly-linked list implementation * Generic doubly-linked list implementation
*/ */
#include <sys/param.h>
#include <sys/list.h> #include <sys/list.h>
#include <sys/list_impl.h> #include <sys/list_impl.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/sysmacros.h>
#include <sys/debug.h> #include <sys/debug.h>
#define list_d2l(a, obj) ((list_node_t *)(((char *)obj) + (a)->list_offset)) #define list_d2l(a, obj) ((list_node_t *)(((char *)obj) + (a)->list_offset))