xref: /onnv-gate/usr/src/lib/libzpool/common/sys/zfs_context.h (revision 13146:f3dd638d3435)
1789Sahrens /*
2789Sahrens  * CDDL HEADER START
3789Sahrens  *
4789Sahrens  * The contents of this file are subject to the terms of the
51544Seschrock  * Common Development and Distribution License (the "License").
61544Seschrock  * You may not use this file except in compliance with the License.
7789Sahrens  *
8789Sahrens  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9789Sahrens  * or http://www.opensolaris.org/os/licensing.
10789Sahrens  * See the License for the specific language governing permissions
11789Sahrens  * and limitations under the License.
12789Sahrens  *
13789Sahrens  * When distributing Covered Code, include this CDDL HEADER in each
14789Sahrens  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15789Sahrens  * If applicable, add the following below this CDDL HEADER, with the
16789Sahrens  * fields enclosed by brackets "[]" replaced with your own identifying
17789Sahrens  * information: Portions Copyright [yyyy] [name of copyright owner]
18789Sahrens  *
19789Sahrens  * CDDL HEADER END
20789Sahrens  */
21789Sahrens /*
2212684STom.Erickson@Sun.COM  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23789Sahrens  */
24789Sahrens 
25789Sahrens #ifndef _SYS_ZFS_CONTEXT_H
26789Sahrens #define	_SYS_ZFS_CONTEXT_H
27789Sahrens 
28789Sahrens #ifdef	__cplusplus
29789Sahrens extern "C" {
30789Sahrens #endif
31789Sahrens 
32789Sahrens #define	_SYS_MUTEX_H
33789Sahrens #define	_SYS_RWLOCK_H
34789Sahrens #define	_SYS_CONDVAR_H
35789Sahrens #define	_SYS_SYSTM_H
36789Sahrens #define	_SYS_DEBUG_H
37789Sahrens #define	_SYS_T_LOCK_H
38789Sahrens #define	_SYS_VNODE_H
39789Sahrens #define	_SYS_VFS_H
40789Sahrens #define	_SYS_SUNDDI_H
41789Sahrens #define	_SYS_CALLB_H
42789Sahrens 
43789Sahrens #include <stdio.h>
44789Sahrens #include <stdlib.h>
45789Sahrens #include <stddef.h>
46789Sahrens #include <stdarg.h>
47789Sahrens #include <fcntl.h>
48789Sahrens #include <unistd.h>
49789Sahrens #include <errno.h>
50789Sahrens #include <string.h>
51789Sahrens #include <strings.h>
52789Sahrens #include <synch.h>
53789Sahrens #include <thread.h>
54789Sahrens #include <assert.h>
55789Sahrens #include <alloca.h>
56789Sahrens #include <umem.h>
57789Sahrens #include <limits.h>
58789Sahrens #include <atomic.h>
59789Sahrens #include <dirent.h>
60789Sahrens #include <time.h>
619816SGeorge.Wilson@Sun.COM #include <libsysevent.h>
62789Sahrens #include <sys/note.h>
63789Sahrens #include <sys/types.h>
644543Smarks #include <sys/cred.h>
65789Sahrens #include <sys/sysmacros.h>
66789Sahrens #include <sys/bitmap.h>
67789Sahrens #include <sys/resource.h>
68789Sahrens #include <sys/byteorder.h>
69789Sahrens #include <sys/list.h>
70789Sahrens #include <sys/uio.h>
71789Sahrens #include <sys/zfs_debug.h>
72789Sahrens #include <sys/sdt.h>
733403Sbmc #include <sys/kstat.h>
745498Stimh #include <sys/u8_textprep.h>
754451Seschrock #include <sys/sysevent/eventdefs.h>
769816SGeorge.Wilson@Sun.COM #include <sys/sysevent/dev.h>
7711022STom.Erickson@Sun.COM #include <sys/sunddi.h>
78789Sahrens 
79789Sahrens /*
80789Sahrens  * Debugging
81789Sahrens  */
82789Sahrens 
83789Sahrens /*
84789Sahrens  * Note that we are not using the debugging levels.
85789Sahrens  */
86789Sahrens 
87789Sahrens #define	CE_CONT		0	/* continuation		*/
88789Sahrens #define	CE_NOTE		1	/* notice		*/
89789Sahrens #define	CE_WARN		2	/* warning		*/
90789Sahrens #define	CE_PANIC	3	/* panic		*/
91789Sahrens #define	CE_IGNORE	4	/* print nothing	*/
92789Sahrens 
93789Sahrens /*
94789Sahrens  * ZFS debugging
95789Sahrens  */
96789Sahrens 
97789Sahrens #ifdef ZFS_DEBUG
98789Sahrens extern void dprintf_setup(int *argc, char **argv);
99789Sahrens #endif /* ZFS_DEBUG */
100789Sahrens 
101789Sahrens extern void cmn_err(int, const char *, ...);
1023713Sahrens extern void vcmn_err(int, const char *, __va_list);
103789Sahrens extern void panic(const char *, ...);
104789Sahrens extern void vpanic(const char *, __va_list);
105789Sahrens 
1065329Sgw25295 #define	fm_panic	panic
1075329Sgw25295 
10811726SVictor.Latushkin@Sun.COM extern int aok;
10911726SVictor.Latushkin@Sun.COM 
110789Sahrens /* This definition is copied from assert.h. */
111789Sahrens #if defined(__STDC__)
112789Sahrens #if __STDC_VERSION__ - 0 >= 199901L
11311726SVictor.Latushkin@Sun.COM #define	zverify(EX) (void)((EX) || (aok) || \
114789Sahrens 	(__assert_c99(#EX, __FILE__, __LINE__, __func__), 0))
115789Sahrens #else
11611726SVictor.Latushkin@Sun.COM #define	zverify(EX) (void)((EX) || (aok) || \
11711726SVictor.Latushkin@Sun.COM 	(__assert(#EX, __FILE__, __LINE__), 0))
118789Sahrens #endif /* __STDC_VERSION__ - 0 >= 199901L */
119789Sahrens #else
12011726SVictor.Latushkin@Sun.COM #define	zverify(EX) (void)((EX) || (aok) || \
12111726SVictor.Latushkin@Sun.COM 	(_assert("EX", __FILE__, __LINE__), 0))
122789Sahrens #endif	/* __STDC__ */
123789Sahrens 
124789Sahrens 
12511726SVictor.Latushkin@Sun.COM #define	VERIFY	zverify
12611726SVictor.Latushkin@Sun.COM #define	ASSERT	zverify
12711726SVictor.Latushkin@Sun.COM #undef	assert
12811726SVictor.Latushkin@Sun.COM #define	assert	zverify
129789Sahrens 
130789Sahrens extern void __assert(const char *, const char *, int);
131789Sahrens 
132789Sahrens #ifdef lint
133789Sahrens #define	VERIFY3_IMPL(x, y, z, t)	if (x == z) ((void)0)
134789Sahrens #else
135789Sahrens /* BEGIN CSTYLED */
136789Sahrens #define	VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE) do { \
137789Sahrens 	const TYPE __left = (TYPE)(LEFT); \
138789Sahrens 	const TYPE __right = (TYPE)(RIGHT); \
13911726SVictor.Latushkin@Sun.COM 	if (!(__left OP __right) && (!aok)) { \
140789Sahrens 		char *__buf = alloca(256); \
141789Sahrens 		(void) snprintf(__buf, 256, "%s %s %s (0x%llx %s 0x%llx)", \
142789Sahrens 			#LEFT, #OP, #RIGHT, \
143789Sahrens 			(u_longlong_t)__left, #OP, (u_longlong_t)__right); \
144789Sahrens 		__assert(__buf, __FILE__, __LINE__); \
145789Sahrens 	} \
146789Sahrens _NOTE(CONSTCOND) } while (0)
147789Sahrens /* END CSTYLED */
148789Sahrens #endif /* lint */
149789Sahrens 
150789Sahrens #define	VERIFY3S(x, y, z)	VERIFY3_IMPL(x, y, z, int64_t)
151789Sahrens #define	VERIFY3U(x, y, z)	VERIFY3_IMPL(x, y, z, uint64_t)
152789Sahrens #define	VERIFY3P(x, y, z)	VERIFY3_IMPL(x, y, z, uintptr_t)
153789Sahrens 
154789Sahrens #ifdef NDEBUG
155789Sahrens #define	ASSERT3S(x, y, z)	((void)0)
156789Sahrens #define	ASSERT3U(x, y, z)	((void)0)
157789Sahrens #define	ASSERT3P(x, y, z)	((void)0)
158789Sahrens #else
159789Sahrens #define	ASSERT3S(x, y, z)	VERIFY3S(x, y, z)
160789Sahrens #define	ASSERT3U(x, y, z)	VERIFY3U(x, y, z)
161789Sahrens #define	ASSERT3P(x, y, z)	VERIFY3P(x, y, z)
162789Sahrens #endif
163789Sahrens 
164789Sahrens /*
1654451Seschrock  * DTrace SDT probes have different signatures in userland than they do in
166789Sahrens  * kernel.  If they're being used in kernel code, re-define them out of
167789Sahrens  * existence for their counterparts in libzpool.
168789Sahrens  */
169789Sahrens 
1707468SMark.Maybee@Sun.COM #ifdef DTRACE_PROBE
1717468SMark.Maybee@Sun.COM #undef	DTRACE_PROBE
1727468SMark.Maybee@Sun.COM #define	DTRACE_PROBE(a)	((void)0)
1737468SMark.Maybee@Sun.COM #endif	/* DTRACE_PROBE */
1747468SMark.Maybee@Sun.COM 
175789Sahrens #ifdef DTRACE_PROBE1
176789Sahrens #undef	DTRACE_PROBE1
177789Sahrens #define	DTRACE_PROBE1(a, b, c)	((void)0)
178789Sahrens #endif	/* DTRACE_PROBE1 */
179789Sahrens 
180789Sahrens #ifdef DTRACE_PROBE2
181789Sahrens #undef	DTRACE_PROBE2
182789Sahrens #define	DTRACE_PROBE2(a, b, c, d, e)	((void)0)
183789Sahrens #endif	/* DTRACE_PROBE2 */
184789Sahrens 
1851596Sahrens #ifdef DTRACE_PROBE3
1861596Sahrens #undef	DTRACE_PROBE3
1871596Sahrens #define	DTRACE_PROBE3(a, b, c, d, e, f, g)	((void)0)
1881596Sahrens #endif	/* DTRACE_PROBE3 */
1891596Sahrens 
1902981Sahrens #ifdef DTRACE_PROBE4
1912981Sahrens #undef	DTRACE_PROBE4
1922981Sahrens #define	DTRACE_PROBE4(a, b, c, d, e, f, g, h, i)	((void)0)
1932981Sahrens #endif	/* DTRACE_PROBE4 */
1942981Sahrens 
195789Sahrens /*
196789Sahrens  * Threads
197789Sahrens  */
198789Sahrens #define	curthread	((void *)(uintptr_t)thr_self())
199789Sahrens 
200789Sahrens typedef struct kthread kthread_t;
201789Sahrens 
202789Sahrens #define	thread_create(stk, stksize, func, arg, len, pp, state, pri)	\
203789Sahrens 	zk_thread_create(func, arg)
2042856Snd150628 #define	thread_exit() thr_exit(NULL)
20511173SJonathan.Adams@Sun.COM #define	thread_join(t)	panic("libzpool cannot join threads")
20611173SJonathan.Adams@Sun.COM 
20711173SJonathan.Adams@Sun.COM #define	newproc(f, a, cid, pri, ctp, pid)	(ENOSYS)
20811173SJonathan.Adams@Sun.COM 
20911173SJonathan.Adams@Sun.COM /* in libzpool, p0 exists only to have its address taken */
21011173SJonathan.Adams@Sun.COM struct proc {
21111173SJonathan.Adams@Sun.COM 	uintptr_t	this_is_never_used_dont_dereference_it;
21211173SJonathan.Adams@Sun.COM };
21311173SJonathan.Adams@Sun.COM 
21411173SJonathan.Adams@Sun.COM extern struct proc p0;
21511173SJonathan.Adams@Sun.COM 
21611173SJonathan.Adams@Sun.COM #define	PS_NONE		-1
217789Sahrens 
218789Sahrens extern kthread_t *zk_thread_create(void (*func)(), void *arg);
219789Sahrens 
220789Sahrens #define	issig(why)	(FALSE)
221789Sahrens #define	ISSIG(thr, why)	(FALSE)
222789Sahrens 
223789Sahrens /*
224789Sahrens  * Mutexes
225789Sahrens  */
226789Sahrens typedef struct kmutex {
2274831Sgw25295 	void		*m_owner;
2284831Sgw25295 	boolean_t	initialized;
2294831Sgw25295 	mutex_t		m_lock;
230789Sahrens } kmutex_t;
231789Sahrens 
232789Sahrens #define	MUTEX_DEFAULT	USYNC_THREAD
23312684STom.Erickson@Sun.COM #undef	MUTEX_HELD
23412684STom.Erickson@Sun.COM #undef	MUTEX_NOT_HELD
235789Sahrens #define	MUTEX_HELD(m) _mutex_held(&(m)->m_lock)
23612684STom.Erickson@Sun.COM #define	MUTEX_NOT_HELD(m) (!MUTEX_HELD(m))
237789Sahrens 
238789Sahrens /*
239789Sahrens  * Argh -- we have to get cheesy here because the kernel and userland
240789Sahrens  * have different signatures for the same routine.
241789Sahrens  */
242789Sahrens extern int _mutex_init(mutex_t *mp, int type, void *arg);
243789Sahrens extern int _mutex_destroy(mutex_t *mp);
244789Sahrens 
245789Sahrens #define	mutex_init(mp, b, c, d)		zmutex_init((kmutex_t *)(mp))
246789Sahrens #define	mutex_destroy(mp)		zmutex_destroy((kmutex_t *)(mp))
247789Sahrens 
248789Sahrens extern void zmutex_init(kmutex_t *mp);
249789Sahrens extern void zmutex_destroy(kmutex_t *mp);
250789Sahrens extern void mutex_enter(kmutex_t *mp);
251789Sahrens extern void mutex_exit(kmutex_t *mp);
252789Sahrens extern int mutex_tryenter(kmutex_t *mp);
253789Sahrens extern void *mutex_owner(kmutex_t *mp);
254789Sahrens 
255789Sahrens /*
256789Sahrens  * RW locks
257789Sahrens  */
258789Sahrens typedef struct krwlock {
259789Sahrens 	void		*rw_owner;
2604831Sgw25295 	boolean_t	initialized;
261789Sahrens 	rwlock_t	rw_lock;
262789Sahrens } krwlock_t;
263789Sahrens 
264789Sahrens typedef int krw_t;
265789Sahrens 
266789Sahrens #define	RW_READER	0
267789Sahrens #define	RW_WRITER	1
268789Sahrens #define	RW_DEFAULT	USYNC_THREAD
269789Sahrens 
270789Sahrens #undef RW_READ_HELD
271789Sahrens #define	RW_READ_HELD(x)		_rw_read_held(&(x)->rw_lock)
272789Sahrens 
273789Sahrens #undef RW_WRITE_HELD
274789Sahrens #define	RW_WRITE_HELD(x)	_rw_write_held(&(x)->rw_lock)
275789Sahrens 
276789Sahrens extern void rw_init(krwlock_t *rwlp, char *name, int type, void *arg);
277789Sahrens extern void rw_destroy(krwlock_t *rwlp);
278789Sahrens extern void rw_enter(krwlock_t *rwlp, krw_t rw);
279789Sahrens extern int rw_tryenter(krwlock_t *rwlp, krw_t rw);
280789Sahrens extern int rw_tryupgrade(krwlock_t *rwlp);
281789Sahrens extern void rw_exit(krwlock_t *rwlp);
282789Sahrens #define	rw_downgrade(rwlp) do { } while (0)
283789Sahrens 
2844543Smarks extern uid_t crgetuid(cred_t *cr);
2854543Smarks extern gid_t crgetgid(cred_t *cr);
2864543Smarks extern int crgetngroups(cred_t *cr);
2874543Smarks extern gid_t *crgetgroups(cred_t *cr);
2884543Smarks 
289789Sahrens /*
290789Sahrens  * Condition variables
291789Sahrens  */
292789Sahrens typedef cond_t kcondvar_t;
293789Sahrens 
294789Sahrens #define	CV_DEFAULT	USYNC_THREAD
295789Sahrens 
296789Sahrens extern void cv_init(kcondvar_t *cv, char *name, int type, void *arg);
297789Sahrens extern void cv_destroy(kcondvar_t *cv);
298789Sahrens extern void cv_wait(kcondvar_t *cv, kmutex_t *mp);
299789Sahrens extern clock_t cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime);
300789Sahrens extern void cv_signal(kcondvar_t *cv);
301789Sahrens extern void cv_broadcast(kcondvar_t *cv);
302789Sahrens 
303789Sahrens /*
3043403Sbmc  * kstat creation, installation and deletion
3053403Sbmc  */
3063403Sbmc extern kstat_t *kstat_create(char *, int,
3073403Sbmc     char *, char *, uchar_t, ulong_t, uchar_t);
3083403Sbmc extern void kstat_install(kstat_t *);
3093403Sbmc extern void kstat_delete(kstat_t *);
3103403Sbmc 
3113403Sbmc /*
312789Sahrens  * Kernel memory
313789Sahrens  */
314789Sahrens #define	KM_SLEEP		UMEM_NOFAIL
3156245Smaybee #define	KM_PUSHPAGE		KM_SLEEP
316789Sahrens #define	KM_NOSLEEP		UMEM_DEFAULT
317849Sbonwick #define	KMC_NODEBUG		UMC_NODEBUG
318*13146SJonathan.Adams@Sun.COM #define	KMC_NOTOUCH		0	/* not needed for userland caches */
319789Sahrens #define	kmem_alloc(_s, _f)	umem_alloc(_s, _f)
320789Sahrens #define	kmem_zalloc(_s, _f)	umem_zalloc(_s, _f)
321789Sahrens #define	kmem_free(_b, _s)	umem_free(_b, _s)
322789Sahrens #define	kmem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i) \
323789Sahrens 	umem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i)
324789Sahrens #define	kmem_cache_destroy(_c)	umem_cache_destroy(_c)
325789Sahrens #define	kmem_cache_alloc(_c, _f) umem_cache_alloc(_c, _f)
326789Sahrens #define	kmem_cache_free(_c, _b)	umem_cache_free(_c, _b)
327789Sahrens #define	kmem_debugging()	0
32812684STom.Erickson@Sun.COM #define	kmem_cache_reap_now(_c)		/* nothing */
32912684STom.Erickson@Sun.COM #define	kmem_cache_set_move(_c, _cb)	/* nothing */
33012684STom.Erickson@Sun.COM #define	POINTER_INVALIDATE(_pp)		/* nothing */
33112684STom.Erickson@Sun.COM #define	POINTER_IS_VALID(_p)	0
332789Sahrens 
333789Sahrens typedef umem_cache_t kmem_cache_t;
334789Sahrens 
33512684STom.Erickson@Sun.COM typedef enum kmem_cbrc {
33612684STom.Erickson@Sun.COM 	KMEM_CBRC_YES,
33712684STom.Erickson@Sun.COM 	KMEM_CBRC_NO,
33812684STom.Erickson@Sun.COM 	KMEM_CBRC_LATER,
33912684STom.Erickson@Sun.COM 	KMEM_CBRC_DONT_NEED,
34012684STom.Erickson@Sun.COM 	KMEM_CBRC_DONT_KNOW
34112684STom.Erickson@Sun.COM } kmem_cbrc_t;
34212684STom.Erickson@Sun.COM 
343789Sahrens /*
344789Sahrens  * Task queues
345789Sahrens  */
346789Sahrens typedef struct taskq taskq_t;
347789Sahrens typedef uintptr_t taskqid_t;
348789Sahrens typedef void (task_func_t)(void *);
349789Sahrens 
350789Sahrens #define	TASKQ_PREPOPULATE	0x0001
351789Sahrens #define	TASKQ_CPR_SAFE		0x0002	/* Use CPR safe protocol */
352789Sahrens #define	TASKQ_DYNAMIC		0x0004	/* Use dynamic thread scheduling */
35311173SJonathan.Adams@Sun.COM #define	TASKQ_THREADS_CPU_PCT	0x0008	/* Scale # threads by # cpus */
35411173SJonathan.Adams@Sun.COM #define	TASKQ_DC_BATCH		0x0010	/* Mark threads as batch */
355789Sahrens 
356789Sahrens #define	TQ_SLEEP	KM_SLEEP	/* Can block for memory */
357789Sahrens #define	TQ_NOSLEEP	KM_NOSLEEP	/* cannot block for memory; may fail */
35811173SJonathan.Adams@Sun.COM #define	TQ_NOQUEUE	0x02		/* Do not enqueue if can't dispatch */
35911173SJonathan.Adams@Sun.COM #define	TQ_FRONT	0x08		/* Queue in front */
360789Sahrens 
3617837SMatthew.Ahrens@Sun.COM extern taskq_t *system_taskq;
3627837SMatthew.Ahrens@Sun.COM 
363789Sahrens extern taskq_t	*taskq_create(const char *, int, pri_t, int, int, uint_t);
36411173SJonathan.Adams@Sun.COM #define	taskq_create_proc(a, b, c, d, e, p, f) \
36511173SJonathan.Adams@Sun.COM 	    (taskq_create(a, b, c, d, e, f))
36611173SJonathan.Adams@Sun.COM #define	taskq_create_sysdc(a, b, d, e, p, dc, f) \
36711173SJonathan.Adams@Sun.COM 	    (taskq_create(a, b, maxclsyspri, d, e, f))
368789Sahrens extern taskqid_t taskq_dispatch(taskq_t *, task_func_t, void *, uint_t);
369789Sahrens extern void	taskq_destroy(taskq_t *);
370789Sahrens extern void	taskq_wait(taskq_t *);
371789Sahrens extern int	taskq_member(taskq_t *, void *);
3727837SMatthew.Ahrens@Sun.COM extern void	system_taskq_init(void);
37310612SRicardo.M.Correia@Sun.COM extern void	system_taskq_fini(void);
374789Sahrens 
3755331Samw #define	XVA_MAPSIZE	3
3765331Samw #define	XVA_MAGIC	0x78766174
3775331Samw 
378789Sahrens /*
379789Sahrens  * vnodes
380789Sahrens  */
381789Sahrens typedef struct vnode {
382789Sahrens 	uint64_t	v_size;
383789Sahrens 	int		v_fd;
384789Sahrens 	char		*v_path;
385789Sahrens } vnode_t;
386789Sahrens 
38710793Sdai.ngo@sun.com #define	AV_SCANSTAMP_SZ	32		/* length of anti-virus scanstamp */
3885331Samw 
3895331Samw typedef struct xoptattr {
3905331Samw 	timestruc_t	xoa_createtime;	/* Create time of file */
3915331Samw 	uint8_t		xoa_archive;
3925331Samw 	uint8_t		xoa_system;
3935331Samw 	uint8_t		xoa_readonly;
3945331Samw 	uint8_t		xoa_hidden;
3955331Samw 	uint8_t		xoa_nounlink;
3965331Samw 	uint8_t		xoa_immutable;
3975331Samw 	uint8_t		xoa_appendonly;
3985331Samw 	uint8_t		xoa_nodump;
3995331Samw 	uint8_t		xoa_settable;
4005331Samw 	uint8_t		xoa_opaque;
4015331Samw 	uint8_t		xoa_av_quarantined;
4025331Samw 	uint8_t		xoa_av_modified;
40310793Sdai.ngo@sun.com 	uint8_t		xoa_av_scanstamp[AV_SCANSTAMP_SZ];
40410793Sdai.ngo@sun.com 	uint8_t		xoa_reparse;
40513082SJoyce.McIntosh@Sun.COM 	uint8_t		xoa_offline;
40613082SJoyce.McIntosh@Sun.COM 	uint8_t		xoa_sparse;
4075331Samw } xoptattr_t;
4085331Samw 
409789Sahrens typedef struct vattr {
410789Sahrens 	uint_t		va_mask;	/* bit-mask of attributes */
411789Sahrens 	u_offset_t	va_size;	/* file size in bytes */
412789Sahrens } vattr_t;
413789Sahrens 
4145331Samw 
4155331Samw typedef struct xvattr {
4165331Samw 	vattr_t		xva_vattr;	/* Embedded vattr structure */
4175331Samw 	uint32_t	xva_magic;	/* Magic Number */
4185331Samw 	uint32_t	xva_mapsize;	/* Size of attr bitmap (32-bit words) */
4195331Samw 	uint32_t	*xva_rtnattrmapp;	/* Ptr to xva_rtnattrmap[] */
4205331Samw 	uint32_t	xva_reqattrmap[XVA_MAPSIZE];	/* Requested attrs */
4215331Samw 	uint32_t	xva_rtnattrmap[XVA_MAPSIZE];	/* Returned attrs */
4225331Samw 	xoptattr_t	xva_xoptattrs;	/* Optional attributes */
4235331Samw } xvattr_t;
4245331Samw 
4255331Samw typedef struct vsecattr {
4265331Samw 	uint_t		vsa_mask;	/* See below */
4275331Samw 	int		vsa_aclcnt;	/* ACL entry count */
4285331Samw 	void		*vsa_aclentp;	/* pointer to ACL entries */
4295331Samw 	int		vsa_dfaclcnt;	/* default ACL entry count */
4305331Samw 	void		*vsa_dfaclentp;	/* pointer to default ACL entries */
4315331Samw 	size_t		vsa_aclentsz;	/* ACE size in bytes of vsa_aclentp */
4325331Samw } vsecattr_t;
4335331Samw 
4345331Samw #define	AT_TYPE		0x00001
4355331Samw #define	AT_MODE		0x00002
4365331Samw #define	AT_UID		0x00004
4375331Samw #define	AT_GID		0x00008
4385331Samw #define	AT_FSID		0x00010
4395331Samw #define	AT_NODEID	0x00020
4405331Samw #define	AT_NLINK	0x00040
4415331Samw #define	AT_SIZE		0x00080
4425331Samw #define	AT_ATIME	0x00100
4435331Samw #define	AT_MTIME	0x00200
4445331Samw #define	AT_CTIME	0x00400
4455331Samw #define	AT_RDEV		0x00800
4465331Samw #define	AT_BLKSIZE	0x01000
4475331Samw #define	AT_NBLOCKS	0x02000
4485331Samw #define	AT_SEQ		0x08000
4495331Samw #define	AT_XVATTR	0x10000
450789Sahrens 
451789Sahrens #define	CRCREAT		0
452789Sahrens 
45310850SGeorge.Wilson@Sun.COM extern int fop_getattr(vnode_t *vp, vattr_t *vap);
45410850SGeorge.Wilson@Sun.COM 
4555331Samw #define	VOP_CLOSE(vp, f, c, o, cr, ct)	0
4565331Samw #define	VOP_PUTPAGE(vp, of, sz, fl, cr, ct)	0
45710850SGeorge.Wilson@Sun.COM #define	VOP_GETATTR(vp, vap, fl, cr, ct)  fop_getattr((vp), (vap));
458789Sahrens 
4595331Samw #define	VOP_FSYNC(vp, f, cr, ct)	fsync((vp)->v_fd)
460789Sahrens 
461789Sahrens #define	VN_RELE(vp)	vn_close(vp)
462789Sahrens 
463789Sahrens extern int vn_open(char *path, int x1, int oflags, int mode, vnode_t **vpp,
464789Sahrens     int x2, int x3);
465789Sahrens extern int vn_openat(char *path, int x1, int oflags, int mode, vnode_t **vpp,
4665331Samw     int x2, int x3, vnode_t *vp, int fd);
467789Sahrens extern int vn_rdwr(int uio, vnode_t *vp, void *addr, ssize_t len,
468789Sahrens     offset_t offset, int x1, int x2, rlim64_t x3, void *x4, ssize_t *residp);
469789Sahrens extern void vn_close(vnode_t *vp);
470789Sahrens 
471789Sahrens #define	vn_remove(path, x1, x2)		remove(path)
472789Sahrens #define	vn_rename(from, to, seg)	rename((from), (to))
4731635Sbonwick #define	vn_is_readonly(vp)		B_FALSE
474789Sahrens 
475789Sahrens extern vnode_t *rootdir;
476789Sahrens 
477789Sahrens #include <sys/file.h>		/* for FREAD, FWRITE, etc */
478789Sahrens 
479789Sahrens /*
480789Sahrens  * Random stuff
481789Sahrens  */
48211066Srafael.vanoni@sun.com #define	ddi_get_lbolt()		(gethrtime() >> 23)
48311066Srafael.vanoni@sun.com #define	ddi_get_lbolt64()	(gethrtime() >> 23)
484789Sahrens #define	hz	119	/* frequency when using gethrtime() >> 23 for lbolt */
485789Sahrens 
486789Sahrens extern void delay(clock_t ticks);
487789Sahrens 
488789Sahrens #define	gethrestime_sec() time(NULL)
48910373Schris.kirby@sun.com #define	gethrestime(t) \
49010373Schris.kirby@sun.com 	do {\
49110373Schris.kirby@sun.com 		(t)->tv_sec = gethrestime_sec();\
49210373Schris.kirby@sun.com 		(t)->tv_nsec = 0;\
49310373Schris.kirby@sun.com 	} while (0);
494789Sahrens 
495789Sahrens #define	max_ncpus	64
496789Sahrens 
497789Sahrens #define	minclsyspri	60
498789Sahrens #define	maxclsyspri	99
499789Sahrens 
500789Sahrens #define	CPU_SEQID	(thr_self() & (max_ncpus - 1))
501789Sahrens 
502789Sahrens #define	kcred		NULL
503789Sahrens #define	CRED()		NULL
504789Sahrens 
5057468SMark.Maybee@Sun.COM #define	ptob(x)		((x) * PAGESIZE)
5067468SMark.Maybee@Sun.COM 
507789Sahrens extern uint64_t physmem;
508789Sahrens 
509789Sahrens extern int highbit(ulong_t i);
510789Sahrens extern int random_get_bytes(uint8_t *ptr, size_t len);
511789Sahrens extern int random_get_pseudo_bytes(uint8_t *ptr, size_t len);
512789Sahrens 
513789Sahrens extern void kernel_init(int);
514789Sahrens extern void kernel_fini(void);
515789Sahrens 
516789Sahrens struct spa;
517789Sahrens extern void nicenum(uint64_t num, char *buf);
518789Sahrens extern void show_pool_stats(struct spa *);
519789Sahrens 
520789Sahrens typedef struct callb_cpr {
521789Sahrens 	kmutex_t	*cc_lockp;
522789Sahrens } callb_cpr_t;
523789Sahrens 
524789Sahrens #define	CALLB_CPR_INIT(cp, lockp, func, name)	{		\
525789Sahrens 	(cp)->cc_lockp = lockp;					\
526789Sahrens }
527789Sahrens 
528789Sahrens #define	CALLB_CPR_SAFE_BEGIN(cp) {				\
529789Sahrens 	ASSERT(MUTEX_HELD((cp)->cc_lockp));			\
530789Sahrens }
531789Sahrens 
532789Sahrens #define	CALLB_CPR_SAFE_END(cp, lockp) {				\
533789Sahrens 	ASSERT(MUTEX_HELD((cp)->cc_lockp));			\
534789Sahrens }
535789Sahrens 
536789Sahrens #define	CALLB_CPR_EXIT(cp) {					\
537789Sahrens 	ASSERT(MUTEX_HELD((cp)->cc_lockp));			\
538789Sahrens 	mutex_exit((cp)->cc_lockp);				\
539789Sahrens }
540789Sahrens 
541789Sahrens #define	zone_dataset_visible(x, y)	(1)
542789Sahrens #define	INGLOBALZONE(z)			(1)
543789Sahrens 
54410272SMatthew.Ahrens@Sun.COM extern char *kmem_asprintf(const char *fmt, ...);
54510272SMatthew.Ahrens@Sun.COM #define	strfree(str) kmem_free((str), strlen(str)+1)
54610272SMatthew.Ahrens@Sun.COM 
5473975Sek110237 /*
5483975Sek110237  * Hostname information
5493975Sek110237  */
5508662SJordan.Vaughan@Sun.com extern char hw_serial[];	/* for userland-emulated hostid access */
5513975Sek110237 extern int ddi_strtoul(const char *str, char **nptr, int base,
5523975Sek110237     unsigned long *result);
5533975Sek110237 
55411935SMark.Shellenbaum@Sun.COM extern int ddi_strtoull(const char *str, char **nptr, int base,
55511935SMark.Shellenbaum@Sun.COM     u_longlong_t *result);
55611935SMark.Shellenbaum@Sun.COM 
5571544Seschrock /* ZFS Boot Related stuff. */
5581544Seschrock 
5591544Seschrock struct _buf {
5601544Seschrock 	intptr_t	_fd;
5611544Seschrock };
5621544Seschrock 
5631544Seschrock struct bootstat {
5641544Seschrock 	uint64_t st_size;
5651544Seschrock };
5661544Seschrock 
5675331Samw typedef struct ace_object {
5685331Samw 	uid_t		a_who;
5695331Samw 	uint32_t	a_access_mask;
5705331Samw 	uint16_t	a_flags;
5715331Samw 	uint16_t	a_type;
5725331Samw 	uint8_t		a_obj_type[16];
5735331Samw 	uint8_t		a_inherit_obj_type[16];
5745331Samw } ace_object_t;
5755331Samw 
5765331Samw 
5775331Samw #define	ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE	0x05
5785331Samw #define	ACE_ACCESS_DENIED_OBJECT_ACE_TYPE	0x06
5795331Samw #define	ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE	0x07
5805331Samw #define	ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE	0x08
5815331Samw 
5821544Seschrock extern struct _buf *kobj_open_file(char *name);
5831544Seschrock extern int kobj_read_file(struct _buf *file, char *buf, unsigned size,
5841544Seschrock     unsigned off);
5851544Seschrock extern void kobj_close_file(struct _buf *file);
5863912Slling extern int kobj_get_filesize(struct _buf *file, uint64_t *size);
5874543Smarks extern int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr);
5884543Smarks extern int zfs_secpolicy_rename_perms(const char *from, const char *to,
5894543Smarks     cred_t *cr);
5904543Smarks extern int zfs_secpolicy_destroy_perms(const char *name, cred_t *cr);
5914543Smarks extern zoneid_t getzoneid(void);
5921544Seschrock 
5935959Smarks /* SID stuff */
5945959Smarks typedef struct ksiddomain {
5955959Smarks 	uint_t	kd_ref;
5965959Smarks 	uint_t	kd_len;
5975959Smarks 	char	*kd_name;
5985959Smarks } ksiddomain_t;
5995959Smarks 
6005959Smarks ksiddomain_t *ksid_lookupdomain(const char *);
6015959Smarks void ksiddomain_rele(ksiddomain_t *);
6025959Smarks 
6039816SGeorge.Wilson@Sun.COM #define	DDI_SLEEP	KM_SLEEP
6049816SGeorge.Wilson@Sun.COM #define	ddi_log_sysevent(_a, _b, _c, _d, _e, _f, _g) \
6059816SGeorge.Wilson@Sun.COM 	sysevent_post_event(_c, _d, _b, "libzpool", _e, _f)
6069816SGeorge.Wilson@Sun.COM 
6074108Slling #ifdef	__cplusplus
6084108Slling }
6094108Slling #endif
6104108Slling 
611789Sahrens #endif	/* _SYS_ZFS_CONTEXT_H */
612