fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Common Development and Distribution License (the "License").
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
0e60744c982adecd0a1f146f5637475d07ab1069Pavel Zakharov * Copyright (c) 2012, 2016 by Delphix. All rights reserved.
4e3c9f4489a18514e5e8caeb91d4e6db07c98415Bill Pijewski * Copyright (c) 2012, Joyent, Inc. All rights reserved.
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifndef _SYS_ZFS_CONTEXT_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_ZFS_CONTEXT_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef __cplusplus
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern "C" {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_MUTEX_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_RWLOCK_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_CONDVAR_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_SYSTM_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_T_LOCK_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_VNODE_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_VFS_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_SUNDDI_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_CALLB_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdio.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdlib.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stddef.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdarg.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <fcntl.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <unistd.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <errno.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <string.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <strings.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <synch.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <thread.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <assert.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <alloca.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <umem.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <limits.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <atomic.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <dirent.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <time.h>
cd1c8b85eb30b568e9816221430c479ace7a559dMatthew Ahrens#include <procfs.h>
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens#include <pthread.h>
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens#include <sys/debug.h>
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson#include <libsysevent.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/note.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/types.h>
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks#include <sys/cred.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/sysmacros.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/bitmap.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/resource.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/byteorder.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/list.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/uio.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/zfs_debug.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/sdt.h>
44cb6abc89aa591c23f5e58296c6d2a29302344abmc#include <sys/kstat.h>
de8267e0f723ed2c38ea9def92d465f69a300f56timh#include <sys/u8_textprep.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/sysevent/eventdefs.h>
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson#include <sys/sysevent/dev.h>
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson#include <sys/sunddi.h>
fb09f5aad449c97fe309678f3f604982b563a96fMadhav Suresh#include <sys/debug.h>
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens#include "zfs.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Debugging
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Note that we are not using the debugging levels.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CE_CONT 0 /* continuation */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CE_NOTE 1 /* notice */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CE_WARN 2 /* warning */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CE_PANIC 3 /* panic */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CE_IGNORE 4 /* print nothing */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ZFS debugging
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef ZFS_DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void dprintf_setup(int *argc, char **argv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* ZFS_DEBUG */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void cmn_err(int, const char *, ...);
0125049cd6136d1d2ca9e982382a915b6d7916ceahrensextern void vcmn_err(int, const char *, __va_list);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void panic(const char *, ...);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void vpanic(const char *, __va_list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
0a4e9518a44f226be6d39383330b5b1792d2f184gw#define fm_panic panic
0a4e9518a44f226be6d39383330b5b1792d2f184gw
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkinextern int aok;
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkin
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * DTrace SDT probes have different signatures in userland than they do in
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * the kernel. If they're being used in kernel code, re-define them out of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * existence for their counterparts in libzpool.
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie *
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * Here's an example of how to use the set-error probes in userland:
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * zfs$target:::set-error /arg0 == EBUSY/ {stack();}
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie *
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * Here's an example of how to use DTRACE_PROBE probes in userland:
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * If there is a probe declared as follows:
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * DTRACE_PROBE2(zfs__probe_name, uint64_t, blkid, dnode_t *, dn);
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * Then you can use it as follows:
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * zfs$target:::probe2 /copyinstr(arg0) == "zfs__probe_name"/
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * {printf("%u %p\n", arg1, arg2);}
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
05715f945c5c007fc4bb6a4e7cf4a749c9b30038Mark Maybee#ifdef DTRACE_PROBE
05715f945c5c007fc4bb6a4e7cf4a749c9b30038Mark Maybee#undef DTRACE_PROBE
05715f945c5c007fc4bb6a4e7cf4a749c9b30038Mark Maybee#endif /* DTRACE_PROBE */
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens#define DTRACE_PROBE(a) \
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens ZFS_PROBE0(#a)
05715f945c5c007fc4bb6a4e7cf4a749c9b30038Mark Maybee
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DTRACE_PROBE1
fa9e4066f08beec538e775443c5be79dd423fcabahrens#undef DTRACE_PROBE1
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* DTRACE_PROBE1 */
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens#define DTRACE_PROBE1(a, b, c) \
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens ZFS_PROBE1(#a, (unsigned long)c)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DTRACE_PROBE2
fa9e4066f08beec538e775443c5be79dd423fcabahrens#undef DTRACE_PROBE2
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* DTRACE_PROBE2 */
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens#define DTRACE_PROBE2(a, b, c, d, e) \
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens ZFS_PROBE2(#a, (unsigned long)c, (unsigned long)e)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c543ec060d1359f6c8a9507242521f344a2ac3efahrens#ifdef DTRACE_PROBE3
c543ec060d1359f6c8a9507242521f344a2ac3efahrens#undef DTRACE_PROBE3
c543ec060d1359f6c8a9507242521f344a2ac3efahrens#endif /* DTRACE_PROBE3 */
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens#define DTRACE_PROBE3(a, b, c, d, e, f, g) \
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens ZFS_PROBE3(#a, (unsigned long)c, (unsigned long)e, (unsigned long)g)
c543ec060d1359f6c8a9507242521f344a2ac3efahrens
faafa6e33cc19afb09172d9a365a59da0dbfd965ahrens#ifdef DTRACE_PROBE4
faafa6e33cc19afb09172d9a365a59da0dbfd965ahrens#undef DTRACE_PROBE4
faafa6e33cc19afb09172d9a365a59da0dbfd965ahrens#endif /* DTRACE_PROBE4 */
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens#define DTRACE_PROBE4(a, b, c, d, e, f, g, h, i) \
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens ZFS_PROBE4(#a, (unsigned long)c, (unsigned long)e, (unsigned long)g, \
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens (unsigned long)i)
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens/*
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens * We use the comma operator so that this macro can be used without much
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens * additional code. For example, "return (EINVAL);" becomes
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens * "return (SET_ERROR(EINVAL));". Note that the argument will be evaluated
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens * twice, so it should not have side effects (e.g. something like:
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens * "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice).
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens */
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens#define SET_ERROR(err) (ZFS_SET_ERROR(err), err)
faafa6e33cc19afb09172d9a365a59da0dbfd965ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Threads
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define curthread ((void *)(uintptr_t)thr_self())
fa9e4066f08beec538e775443c5be79dd423fcabahrens
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens#define kpreempt(x) yield()
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct kthread kthread_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define thread_create(stk, stksize, func, arg, len, pp, state, pri) \
8fc922875ed266f52ccd5cc6f973b9ad0839c710Eli Rosenthal zk_thread_create(func, arg, len)
5ad820458efd0fdb914baff9c1447c22b819fa23nd#define thread_exit() thr_exit(NULL)
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams#define thread_join(t) panic("libzpool cannot join threads")
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams#define newproc(f, a, cid, pri, ctp, pid) (ENOSYS)
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams/* in libzpool, p0 exists only to have its address taken */
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adamsstruct proc {
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams uintptr_t this_is_never_used_dont_dereference_it;
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams};
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adamsextern struct proc p0;
4e3c9f4489a18514e5e8caeb91d4e6db07c98415Bill Pijewski#define curproc (&p0)
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams#define PS_NONE -1
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8fc922875ed266f52ccd5cc6f973b9ad0839c710Eli Rosenthalextern kthread_t *zk_thread_create(void (*func)(), void *arg, uint64_t len);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define issig(why) (FALSE)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define ISSIG(thr, why) (FALSE)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Mutexes
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct kmutex {
c25056de36a33f2a76f79dcf64593f731d258013gw void *m_owner;
c25056de36a33f2a76f79dcf64593f731d258013gw boolean_t initialized;
c25056de36a33f2a76f79dcf64593f731d258013gw mutex_t m_lock;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} kmutex_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define MUTEX_DEFAULT USYNC_THREAD
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#undef MUTEX_HELD
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#undef MUTEX_NOT_HELD
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define MUTEX_HELD(m) _mutex_held(&(m)->m_lock)
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define MUTEX_NOT_HELD(m) (!MUTEX_HELD(m))
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Argh -- we have to get cheesy here because the kernel and userland
fa9e4066f08beec538e775443c5be79dd423fcabahrens * have different signatures for the same routine.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int _mutex_init(mutex_t *mp, int type, void *arg);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int _mutex_destroy(mutex_t *mp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define mutex_init(mp, b, c, d) zmutex_init((kmutex_t *)(mp))
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define mutex_destroy(mp) zmutex_destroy((kmutex_t *)(mp))
0d045c0d0cb001d79480ee33be28514e847f8612Robert Mustacchi#define mutex_enter(mp) zmutex_enter(mp)
0d045c0d0cb001d79480ee33be28514e847f8612Robert Mustacchi#define mutex_exit(mp) zmutex_exit(mp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void zmutex_init(kmutex_t *mp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void zmutex_destroy(kmutex_t *mp);
0d045c0d0cb001d79480ee33be28514e847f8612Robert Mustacchiextern void zmutex_enter(kmutex_t *mp);
0d045c0d0cb001d79480ee33be28514e847f8612Robert Mustacchiextern void zmutex_exit(kmutex_t *mp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int mutex_tryenter(kmutex_t *mp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void *mutex_owner(kmutex_t *mp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * RW locks
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct krwlock {
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *rw_owner;
c25056de36a33f2a76f79dcf64593f731d258013gw boolean_t initialized;
fa9e4066f08beec538e775443c5be79dd423fcabahrens rwlock_t rw_lock;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} krwlock_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef int krw_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define RW_READER 0
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define RW_WRITER 1
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define RW_DEFAULT USYNC_THREAD
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#undef RW_READ_HELD
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define RW_READ_HELD(x) _rw_read_held(&(x)->rw_lock)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#undef RW_WRITE_HELD
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define RW_WRITE_HELD(x) _rw_write_held(&(x)->rw_lock)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens#undef RW_LOCK_HELD
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens#define RW_LOCK_HELD(x) (RW_READ_HELD(x) || RW_WRITE_HELD(x))
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void rw_init(krwlock_t *rwlp, char *name, int type, void *arg);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void rw_destroy(krwlock_t *rwlp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void rw_enter(krwlock_t *rwlp, krw_t rw);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int rw_tryenter(krwlock_t *rwlp, krw_t rw);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int rw_tryupgrade(krwlock_t *rwlp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void rw_exit(krwlock_t *rwlp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define rw_downgrade(rwlp) do { } while (0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksextern uid_t crgetuid(cred_t *cr);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrensextern uid_t crgetruid(cred_t *cr);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksextern gid_t crgetgid(cred_t *cr);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksextern int crgetngroups(cred_t *cr);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksextern gid_t *crgetgroups(cred_t *cr);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Condition variables
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef cond_t kcondvar_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CV_DEFAULT USYNC_THREAD
41c6413cb54bf338d7a59ed789ec2e0e44c35e6fGeorge Wilson#define CALLOUT_FLAG_ABSOLUTE 0x2
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void cv_init(kcondvar_t *cv, char *name, int type, void *arg);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void cv_destroy(kcondvar_t *cv);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void cv_wait(kcondvar_t *cv, kmutex_t *mp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern clock_t cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime);
0689f76c08c5e553ff25ac43a852b56c430bb61eAdam Leventhalextern clock_t cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t tim,
0689f76c08c5e553ff25ac43a852b56c430bb61eAdam Leventhal hrtime_t res, int flag);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void cv_signal(kcondvar_t *cv);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void cv_broadcast(kcondvar_t *cv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens/*
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens * Thread-specific data
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens */
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens#define tsd_get(k) pthread_getspecific(k)
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens#define tsd_set(k, v) pthread_setspecific(k, v)
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens#define tsd_create(kp, d) pthread_key_create(kp, d)
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens#define tsd_destroy(kp) /* nothing */
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens
44cb6abc89aa591c23f5e58296c6d2a29302344abmc/*
44cb6abc89aa591c23f5e58296c6d2a29302344abmc * kstat creation, installation and deletion
44cb6abc89aa591c23f5e58296c6d2a29302344abmc */
c3a66015199e1814c2af8f7e6929af2004302e7eMatthew Ahrensextern kstat_t *kstat_create(const char *, int,
c3a66015199e1814c2af8f7e6929af2004302e7eMatthew Ahrens const char *, const char *, uchar_t, ulong_t, uchar_t);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsonextern void kstat_named_init(kstat_named_t *, const char *, uchar_t);
44cb6abc89aa591c23f5e58296c6d2a29302344abmcextern void kstat_install(kstat_t *);
44cb6abc89aa591c23f5e58296c6d2a29302344abmcextern void kstat_delete(kstat_t *);
c3a66015199e1814c2af8f7e6929af2004302e7eMatthew Ahrensextern void kstat_waitq_enter(kstat_io_t *);
c3a66015199e1814c2af8f7e6929af2004302e7eMatthew Ahrensextern void kstat_waitq_exit(kstat_io_t *);
c3a66015199e1814c2af8f7e6929af2004302e7eMatthew Ahrensextern void kstat_runq_enter(kstat_io_t *);
c3a66015199e1814c2af8f7e6929af2004302e7eMatthew Ahrensextern void kstat_runq_exit(kstat_io_t *);
c3a66015199e1814c2af8f7e6929af2004302e7eMatthew Ahrensextern void kstat_waitq_to_runq(kstat_io_t *);
c3a66015199e1814c2af8f7e6929af2004302e7eMatthew Ahrensextern void kstat_runq_back_to_waitq(kstat_io_t *);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Kernel memory
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define KM_SLEEP UMEM_NOFAIL
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee#define KM_PUSHPAGE KM_SLEEP
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define KM_NOSLEEP UMEM_DEFAULT
a0965f35d4137b1f6bb1655ae1cb8fee88dfa66fbonwick#define KMC_NODEBUG UMC_NODEBUG
e291592ab12a560fc73b0610963bb3fe66aab341Jonathan Adams#define KMC_NOTOUCH 0 /* not needed for userland caches */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define kmem_alloc(_s, _f) umem_alloc(_s, _f)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define kmem_zalloc(_s, _f) umem_zalloc(_s, _f)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define kmem_free(_b, _s) umem_free(_b, _s)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define kmem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i) \
fa9e4066f08beec538e775443c5be79dd423fcabahrens umem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define kmem_cache_destroy(_c) umem_cache_destroy(_c)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define kmem_cache_alloc(_c, _f) umem_cache_alloc(_c, _f)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define kmem_cache_free(_c, _b) umem_cache_free(_c, _b)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define kmem_debugging() 0
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define kmem_cache_reap_now(_c) /* nothing */
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define kmem_cache_set_move(_c, _cb) /* nothing */
94dd93aee32d1616436eb51fb7b58094b9a8d3e8George Wilson#define vmem_qcache_reap(_v) /* nothing */
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define POINTER_INVALIDATE(_pp) /* nothing */
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define POINTER_IS_VALID(_p) 0
fa9e4066f08beec538e775443c5be79dd423fcabahrens
94dd93aee32d1616436eb51fb7b58094b9a8d3e8George Wilsonextern vmem_t *zio_arena;
94dd93aee32d1616436eb51fb7b58094b9a8d3e8George Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef umem_cache_t kmem_cache_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Ericksontypedef enum kmem_cbrc {
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson KMEM_CBRC_YES,
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson KMEM_CBRC_NO,
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson KMEM_CBRC_LATER,
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson KMEM_CBRC_DONT_NEED,
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson KMEM_CBRC_DONT_KNOW
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson} kmem_cbrc_t;
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Task queues
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct taskq taskq_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef uintptr_t taskqid_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef void (task_func_t)(void *);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amoretypedef struct taskq_ent {
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore struct taskq_ent *tqent_next;
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore struct taskq_ent *tqent_prev;
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore task_func_t *tqent_func;
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore void *tqent_arg;
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore uintptr_t tqent_flags;
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore} taskq_ent_t;
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore#define TQENT_FLAG_PREALLOC 0x1 /* taskq_dispatch_ent used */
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define TASKQ_PREPOPULATE 0x0001
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define TASKQ_CPR_SAFE 0x0002 /* Use CPR safe protocol */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define TASKQ_DYNAMIC 0x0004 /* Use dynamic thread scheduling */
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams#define TASKQ_THREADS_CPU_PCT 0x0008 /* Scale # threads by # cpus */
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams#define TASKQ_DC_BATCH 0x0010 /* Mark threads as batch */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define TQ_SLEEP KM_SLEEP /* Can block for memory */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define TQ_NOSLEEP KM_NOSLEEP /* cannot block for memory; may fail */
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams#define TQ_NOQUEUE 0x02 /* Do not enqueue if can't dispatch */
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams#define TQ_FRONT 0x08 /* Queue in front */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrensextern taskq_t *system_taskq;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern taskq_t *taskq_create(const char *, int, pri_t, int, int, uint_t);
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams#define taskq_create_proc(a, b, c, d, e, p, f) \
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams (taskq_create(a, b, c, d, e, f))
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams#define taskq_create_sysdc(a, b, d, e, p, dc, f) \
35a5a3587fd94b666239c157d3722745250ccbd7Jonathan Adams (taskq_create(a, b, maxclsyspri, d, e, f))
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern taskqid_t taskq_dispatch(taskq_t *, task_func_t, void *, uint_t);
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amoreextern void taskq_dispatch_ent(taskq_t *, task_func_t, void *, uint_t,
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore taskq_ent_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void taskq_destroy(taskq_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void taskq_wait(taskq_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int taskq_member(taskq_t *, void *);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrensextern void system_taskq_init(void);
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correiaextern void system_taskq_fini(void);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define XVA_MAPSIZE 3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define XVA_MAGIC 0x78766174
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * vnodes
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct vnode {
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t v_size;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int v_fd;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *v_path;
df15e419cb7359ba56ddddab9045e438d89e7cbcMatthew Ahrens int v_dump_fd;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} vnode_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
df15e419cb7359ba56ddddab9045e438d89e7cbcMatthew Ahrensextern char *vn_dumpdir;
7a286c471efbab8562f7655a82931904703fffe0Dai Ngo#define AV_SCANSTAMP_SZ 32 /* length of anti-virus scanstamp */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct xoptattr {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw timestruc_t xoa_createtime; /* Create time of file */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_archive;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_system;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_readonly;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_hidden;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_nounlink;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_immutable;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_appendonly;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_nodump;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_settable;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_opaque;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_av_quarantined;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t xoa_av_modified;
7a286c471efbab8562f7655a82931904703fffe0Dai Ngo uint8_t xoa_av_scanstamp[AV_SCANSTAMP_SZ];
7a286c471efbab8562f7655a82931904703fffe0Dai Ngo uint8_t xoa_reparse;
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh uint8_t xoa_offline;
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh uint8_t xoa_sparse;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} xoptattr_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct vattr {
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t va_mask; /* bit-mask of attributes */
fa9e4066f08beec538e775443c5be79dd423fcabahrens u_offset_t va_size; /* file size in bytes */
fa9e4066f08beec538e775443c5be79dd423fcabahrens} vattr_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct xvattr {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw vattr_t xva_vattr; /* Embedded vattr structure */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t xva_magic; /* Magic Number */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t xva_mapsize; /* Size of attr bitmap (32-bit words) */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t *xva_rtnattrmapp; /* Ptr to xva_rtnattrmap[] */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t xva_reqattrmap[XVA_MAPSIZE]; /* Requested attrs */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t xva_rtnattrmap[XVA_MAPSIZE]; /* Returned attrs */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xoptattr_t xva_xoptattrs; /* Optional attributes */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} xvattr_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct vsecattr {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint_t vsa_mask; /* See below */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int vsa_aclcnt; /* ACL entry count */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw void *vsa_aclentp; /* pointer to ACL entries */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int vsa_dfaclcnt; /* default ACL entry count */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw void *vsa_dfaclentp; /* pointer to default ACL entries */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw size_t vsa_aclentsz; /* ACE size in bytes of vsa_aclentp */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} vsecattr_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_TYPE 0x00001
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_MODE 0x00002
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_UID 0x00004
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_GID 0x00008
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_FSID 0x00010
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_NODEID 0x00020
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_NLINK 0x00040
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_SIZE 0x00080
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_ATIME 0x00100
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_MTIME 0x00200
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_CTIME 0x00400
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_RDEV 0x00800
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_BLKSIZE 0x01000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_NBLOCKS 0x02000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_SEQ 0x08000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define AT_XVATTR 0x10000
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CRCREAT 0
fa9e4066f08beec538e775443c5be79dd423fcabahrens
095bcd6622e3b3520eb3b71039a3be5cfab25b74George Wilsonextern int fop_getattr(vnode_t *vp, vattr_t *vap);
095bcd6622e3b3520eb3b71039a3be5cfab25b74George Wilson
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define VOP_CLOSE(vp, f, c, o, cr, ct) 0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define VOP_PUTPAGE(vp, of, sz, fl, cr, ct) 0
095bcd6622e3b3520eb3b71039a3be5cfab25b74George Wilson#define VOP_GETATTR(vp, vap, fl, cr, ct) fop_getattr((vp), (vap));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define VOP_FSYNC(vp, f, cr, ct) fsync((vp)->v_fd)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define VN_RELE(vp) vn_close(vp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int vn_open(char *path, int x1, int oflags, int mode, vnode_t **vpp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens int x2, int x3);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int vn_openat(char *path, int x1, int oflags, int mode, vnode_t **vpp,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int x2, int x3, vnode_t *vp, int fd);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int vn_rdwr(int uio, vnode_t *vp, void *addr, ssize_t len,
fa9e4066f08beec538e775443c5be79dd423fcabahrens offset_t offset, int x1, int x2, rlim64_t x3, void *x4, ssize_t *residp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void vn_close(vnode_t *vp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define vn_remove(path, x1, x2) remove(path)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define vn_rename(from, to, seg) rename((from), (to))
0373e76b3c3643df49ef3483e0f293fdea61d8c6bonwick#define vn_is_readonly(vp) B_FALSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern vnode_t *rootdir;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/file.h> /* for FREAD, FWRITE, etc */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Random stuff
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni#define ddi_get_lbolt() (gethrtime() >> 23)
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni#define ddi_get_lbolt64() (gethrtime() >> 23)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define hz 119 /* frequency when using gethrtime() >> 23 for lbolt */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void delay(clock_t ticks);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson#define SEC_TO_TICK(sec) ((sec) * hz)
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson#define NSEC_TO_TICK(usec) ((usec) / (NANOSEC / hz))
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define gethrestime_sec() time(NULL)
71eb05381846ad14a2087631474e832d0f316654Chris Kirby#define gethrestime(t) \
71eb05381846ad14a2087631474e832d0f316654Chris Kirby do {\
71eb05381846ad14a2087631474e832d0f316654Chris Kirby (t)->tv_sec = gethrestime_sec();\
71eb05381846ad14a2087631474e832d0f316654Chris Kirby (t)->tv_nsec = 0;\
71eb05381846ad14a2087631474e832d0f316654Chris Kirby } while (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define max_ncpus 64
244781f10dcd82684fd8163c016540667842f203Prakash Surya#define boot_ncpus (sysconf(_SC_NPROCESSORS_ONLN))
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define minclsyspri 60
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define maxclsyspri 99
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CPU_SEQID (thr_self() & (max_ncpus - 1))
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define kcred NULL
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CRED() NULL
fa9e4066f08beec538e775443c5be79dd423fcabahrens
05715f945c5c007fc4bb6a4e7cf4a749c9b30038Mark Maybee#define ptob(x) ((x) * PAGESIZE)
05715f945c5c007fc4bb6a4e7cf4a749c9b30038Mark Maybee
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern uint64_t physmem;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
bf16b11e8deb633dd6c4296d46e92399d1582df4Matthew Ahrensextern int highbit64(uint64_t i);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int random_get_bytes(uint8_t *ptr, size_t len);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern int random_get_pseudo_bytes(uint8_t *ptr, size_t len);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void kernel_init(int);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void kernel_fini(void);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstruct spa;
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void nicenum(uint64_t num, char *buf);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void show_pool_stats(struct spa *);
0e60744c982adecd0a1f146f5637475d07ab1069Pavel Zakharovextern int set_global_var(char *arg);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct callb_cpr {
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmutex_t *cc_lockp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} callb_cpr_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CALLB_CPR_INIT(cp, lockp, func, name) { \
fa9e4066f08beec538e775443c5be79dd423fcabahrens (cp)->cc_lockp = lockp; \
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CALLB_CPR_SAFE_BEGIN(cp) { \
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(MUTEX_HELD((cp)->cc_lockp)); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CALLB_CPR_SAFE_END(cp, lockp) { \
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(MUTEX_HELD((cp)->cc_lockp)); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CALLB_CPR_EXIT(cp) { \
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(MUTEX_HELD((cp)->cc_lockp)); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_exit((cp)->cc_lockp); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define zone_dataset_visible(x, y) (1)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define INGLOBALZONE(z) (1)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ae46e4c775f2becc5343ff90b60a95acb79735f9Matthew Ahrensextern char *kmem_asprintf(const char *fmt, ...);
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens#define strfree(str) kmem_free((str), strlen(str) + 1)
ae46e4c775f2becc5343ff90b60a95acb79735f9Matthew Ahrens
95173954d2b811ceb583a9012c3b16e1d0dd6438ek/*
95173954d2b811ceb583a9012c3b16e1d0dd6438ek * Hostname information
95173954d2b811ceb583a9012c3b16e1d0dd6438ek */
5679c89fcd2facbb4334df8870d3d7a4d2b11673jvextern char hw_serial[]; /* for userland-emulated hostid access */
95173954d2b811ceb583a9012c3b16e1d0dd6438ekextern int ddi_strtoul(const char *str, char **nptr, int base,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek unsigned long *result);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumextern int ddi_strtoull(const char *str, char **nptr, int base,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum u_longlong_t *result);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/* ZFS Boot Related stuff. */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstruct _buf {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock intptr_t _fd;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock};
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstruct bootstat {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint64_t st_size;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock};
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct ace_object {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uid_t a_who;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t a_access_mask;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint16_t a_flags;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint16_t a_type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t a_obj_type[16];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t a_inherit_obj_type[16];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} ace_object_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE 0x05
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define ACE_ACCESS_DENIED_OBJECT_ACE_TYPE 0x06
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE 0x07
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE 0x08
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockextern struct _buf *kobj_open_file(char *name);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockextern int kobj_read_file(struct _buf *file, char *buf, unsigned size,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock unsigned off);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockextern void kobj_close_file(struct _buf *file);
b1b8ab34de515a5e83206da22c3d7e563241b021llingextern int kobj_get_filesize(struct _buf *file, uint64_t *size);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksextern int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksextern int zfs_secpolicy_rename_perms(const char *from, const char *to,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks cred_t *cr);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksextern int zfs_secpolicy_destroy_perms(const char *name, cred_t *cr);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksextern zoneid_t getzoneid(void);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69marks/* SID stuff */
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69markstypedef struct ksiddomain {
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69marks uint_t kd_ref;
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69marks uint_t kd_len;
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69marks char *kd_name;
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69marks} ksiddomain_t;
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69marks
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69marksksiddomain_t *ksid_lookupdomain(const char *);
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69marksvoid ksiddomain_rele(ksiddomain_t *);
e0d35c4478bf9fd4080951b5b9d1f9a38948ba69marks
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson#define DDI_SLEEP KM_SLEEP
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson#define ddi_log_sysevent(_a, _b, _c, _d, _e, _f, _g) \
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson sysevent_post_event(_c, _d, _b, "libzpool", _e, _f)
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson/*
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson * Cyclic information
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson */
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilsonextern kmutex_t cpu_lock;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilsontypedef uintptr_t cyclic_id_t;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilsontypedef uint16_t cyc_level_t;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilsontypedef void (*cyc_func_t)(void *);
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson#define CY_LOW_LEVEL 0
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson#define CY_INFINITY INT64_MAX
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson#define CYCLIC_NONE ((cyclic_id_t)0)
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilsontypedef struct cyc_time {
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson hrtime_t cyt_when;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson hrtime_t cyt_interval;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson} cyc_time_t;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilsontypedef struct cyc_handler {
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson cyc_func_t cyh_func;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson void *cyh_arg;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson cyc_level_t cyh_level;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson} cyc_handler_t;
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilsonextern cyclic_id_t cyclic_add(cyc_handler_t *, cyc_time_t *);
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilsonextern void cyclic_remove(cyclic_id_t);
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilsonextern int cyclic_reprogram(cyclic_id_t, hrtime_t);
283b84606b6fc326692c03273de1774e8c122f9aGeorge.Wilson
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson/*
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson * Buf structure
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson */
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson#define B_BUSY 0x0001
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson#define B_DONE 0x0002
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson#define B_ERROR 0x0004
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson#define B_READ 0x0040 /* read when I/O occurs */
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson#define B_WRITE 0x0100 /* non-read pseudo-flag */
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilsontypedef struct buf {
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson int b_flags;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson size_t b_bcount;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson union {
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson caddr_t b_addr;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson } b_un;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson lldaddr_t _b_blkno;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson#define b_lblkno _b_blkno._f
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson size_t b_resid;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson size_t b_bufsize;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson int (*b_iodone)(struct buf *);
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson int b_error;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson void *b_private;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson} buf_t;
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilsonextern void bioinit(buf_t *);
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilsonextern void biodone(buf_t *);
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilsonextern void bioerror(buf_t *, int);
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilsonextern int geterror(buf_t *);
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson
f05471646f8ccee9dbeb3d68f8bd68b50eec9c9dlling#ifdef __cplusplus
f05471646f8ccee9dbeb3d68f8bd68b50eec9c9dlling}
f05471646f8ccee9dbeb3d68f8bd68b50eec9c9dlling#endif
f05471646f8ccee9dbeb3d68f8bd68b50eec9c9dlling
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* _SYS_ZFS_CONTEXT_H */