1168404Spjd/* 2168404Spjd * CDDL HEADER START 3168404Spjd * 4168404Spjd * The contents of this file are subject to the terms of the 5168404Spjd * Common Development and Distribution License (the "License"). 6168404Spjd * You may not use this file except in compliance with the License. 7168404Spjd * 8168404Spjd * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9168404Spjd * or http://www.opensolaris.org/os/licensing. 10168404Spjd * See the License for the specific language governing permissions 11168404Spjd * and limitations under the License. 12168404Spjd * 13168404Spjd * When distributing Covered Code, include this CDDL HEADER in each 14168404Spjd * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15168404Spjd * If applicable, add the following below this CDDL HEADER, with the 16168404Spjd * fields enclosed by brackets "[]" replaced with your own identifying 17168404Spjd * information: Portions Copyright [yyyy] [name of copyright owner] 18168404Spjd * 19168404Spjd * CDDL HEADER END 20168404Spjd */ 21168404Spjd/* 22219089Spjd * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 23249195Smm * Copyright (c) 2013 by Delphix. All rights reserved. 24235222Smm * Copyright (c) 2012, Joyent, Inc. All rights reserved. 25168404Spjd */ 26168404Spjd 27168404Spjd#ifndef _SYS_ZFS_CONTEXT_H 28168404Spjd#define _SYS_ZFS_CONTEXT_H 29168404Spjd 30168404Spjd#ifdef __cplusplus 31168404Spjdextern "C" { 32168404Spjd#endif 33168404Spjd 34168404Spjd#define _SYS_MUTEX_H 35168404Spjd#define _SYS_RWLOCK_H 36168404Spjd#define _SYS_CONDVAR_H 37168404Spjd#define _SYS_SYSTM_H 38168404Spjd#define _SYS_T_LOCK_H 39168404Spjd#define _SYS_VNODE_H 40168404Spjd#define _SYS_VFS_H 41168404Spjd#define _SYS_SUNDDI_H 42168404Spjd#define _SYS_CALLB_H 43168404Spjd#define _SYS_SCHED_H_ 44168404Spjd 45168404Spjd#include <solaris.h> 46168404Spjd#include <stdio.h> 47168404Spjd#include <stdlib.h> 48168404Spjd#include <stddef.h> 49168404Spjd#include <stdarg.h> 50168404Spjd#include <fcntl.h> 51168404Spjd#include <unistd.h> 52168404Spjd#include <errno.h> 53168404Spjd#include <string.h> 54168404Spjd#include <strings.h> 55168404Spjd#include <thread.h> 56168404Spjd#include <assert.h> 57168404Spjd#include <limits.h> 58168404Spjd#include <dirent.h> 59168404Spjd#include <time.h> 60168404Spjd#include <math.h> 61168404Spjd#include <umem.h> 62219089Spjd#include <inttypes.h> 63168404Spjd#include <fsshare.h> 64248571Smm#include <pthread.h> 65248571Smm#include <sys/debug.h> 66168404Spjd#include <sys/note.h> 67168404Spjd#include <sys/types.h> 68185029Spjd#include <sys/cred.h> 69168404Spjd#include <sys/atomic.h> 70168404Spjd#include <sys/sysmacros.h> 71168404Spjd#include <sys/bitmap.h> 72168404Spjd#include <sys/resource.h> 73168404Spjd#include <sys/byteorder.h> 74168404Spjd#include <sys/list.h> 75168404Spjd#include <sys/time.h> 76168404Spjd#include <sys/uio.h> 77168404Spjd#include <sys/mntent.h> 78168404Spjd#include <sys/mnttab.h> 79168404Spjd#include <sys/zfs_debug.h> 80168404Spjd#include <sys/sdt.h> 81168404Spjd#include <sys/kstat.h> 82185029Spjd#include <sys/u8_textprep.h> 83168404Spjd#include <sys/kernel.h> 84168722Ssimokawa#include <sys/disk.h> 85219089Spjd#include <sys/sysevent.h> 86185029Spjd#include <sys/sysevent/eventdefs.h> 87219089Spjd#include <sys/sysevent/dev.h> 88168404Spjd#include <machine/atomic.h> 89240415Smm#include <sys/debug.h> 90249195Smm#ifdef illumos 91249195Smm#include "zfs.h" 92249195Smm#endif 93168404Spjd 94168404Spjd#define ZFS_EXPORTS_PATH "/etc/zfs/exports" 95168404Spjd 96168404Spjd/* 97168404Spjd * Debugging 98168404Spjd */ 99168404Spjd 100168404Spjd/* 101168404Spjd * Note that we are not using the debugging levels. 102168404Spjd */ 103168404Spjd 104168404Spjd#define CE_CONT 0 /* continuation */ 105168404Spjd#define CE_NOTE 1 /* notice */ 106168404Spjd#define CE_WARN 2 /* warning */ 107168404Spjd#define CE_PANIC 3 /* panic */ 108168404Spjd#define CE_IGNORE 4 /* print nothing */ 109168404Spjd 110168404Spjd/* 111168404Spjd * ZFS debugging 112168404Spjd */ 113168404Spjd 114168404Spjd#define ZFS_LOG(...) do { } while (0) 115168404Spjd 116168404Spjdtypedef u_longlong_t rlim64_t; 117168404Spjd#define RLIM64_INFINITY ((rlim64_t)-3) 118168404Spjd 119168404Spjd#ifdef ZFS_DEBUG 120168404Spjdextern void dprintf_setup(int *argc, char **argv); 121168404Spjd#endif /* ZFS_DEBUG */ 122168404Spjd 123168404Spjdextern void cmn_err(int, const char *, ...); 124168404Spjdextern void vcmn_err(int, const char *, __va_list); 125168404Spjdextern void panic(const char *, ...); 126168404Spjdextern void vpanic(const char *, __va_list); 127168404Spjd 128185029Spjd#define fm_panic panic 129185029Spjd 130219089Spjdextern int aok; 131219089Spjd 132168404Spjd/* 133185029Spjd * DTrace SDT probes have different signatures in userland than they do in 134168404Spjd * kernel. If they're being used in kernel code, re-define them out of 135168404Spjd * existence for their counterparts in libzpool. 136168404Spjd */ 137168404Spjd 138185029Spjd#ifdef DTRACE_PROBE 139185029Spjd#undef DTRACE_PROBE 140185029Spjd#endif /* DTRACE_PROBE */ 141249195Smm#ifdef illumos 142249195Smm#define DTRACE_PROBE(a) \ 143249195Smm ZFS_PROBE0(#a) 144249195Smm#endif 145185029Spjd 146168404Spjd#ifdef DTRACE_PROBE1 147168404Spjd#undef DTRACE_PROBE1 148168404Spjd#endif /* DTRACE_PROBE1 */ 149249195Smm#ifdef illumos 150249195Smm#define DTRACE_PROBE1(a, b, c) \ 151249195Smm ZFS_PROBE1(#a, (unsigned long)c) 152249195Smm#endif 153168404Spjd 154168404Spjd#ifdef DTRACE_PROBE2 155168404Spjd#undef DTRACE_PROBE2 156168404Spjd#endif /* DTRACE_PROBE2 */ 157249195Smm#ifdef illumos 158249195Smm#define DTRACE_PROBE2(a, b, c, d, e) \ 159249195Smm ZFS_PROBE2(#a, (unsigned long)c, (unsigned long)e) 160249195Smm#endif 161168404Spjd 162168404Spjd#ifdef DTRACE_PROBE3 163168404Spjd#undef DTRACE_PROBE3 164168404Spjd#endif /* DTRACE_PROBE3 */ 165249195Smm#ifdef illumos 166249195Smm#define DTRACE_PROBE3(a, b, c, d, e, f, g) \ 167249195Smm ZFS_PROBE3(#a, (unsigned long)c, (unsigned long)e, (unsigned long)g) 168249195Smm#endif 169168404Spjd 170168404Spjd#ifdef DTRACE_PROBE4 171168404Spjd#undef DTRACE_PROBE4 172168404Spjd#endif /* DTRACE_PROBE4 */ 173249195Smm#ifdef illumos 174249195Smm#define DTRACE_PROBE4(a, b, c, d, e, f, g, h, i) \ 175249195Smm ZFS_PROBE4(#a, (unsigned long)c, (unsigned long)e, (unsigned long)g, \ 176249195Smm (unsigned long)i) 177249195Smm#endif 178168404Spjd 179249195Smm#ifdef illumos 180168404Spjd/* 181249195Smm * We use the comma operator so that this macro can be used without much 182249195Smm * additional code. For example, "return (EINVAL);" becomes 183249195Smm * "return (SET_ERROR(EINVAL));". Note that the argument will be evaluated 184249195Smm * twice, so it should not have side effects (e.g. something like: 185249195Smm * "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice). 186249195Smm */ 187249195Smm#define SET_ERROR(err) (ZFS_SET_ERROR(err), err) 188249195Smm#else /* !illumos */ 189249195Smm 190249195Smm#define DTRACE_PROBE(a) ((void)0) 191249195Smm#define DTRACE_PROBE1(a, b, c) ((void)0) 192249195Smm#define DTRACE_PROBE2(a, b, c, d, e) ((void)0) 193249195Smm#define DTRACE_PROBE3(a, b, c, d, e, f, g) ((void)0) 194249195Smm#define DTRACE_PROBE4(a, b, c, d, e, f, g, h, i) ((void)0) 195249195Smm 196249195Smm#define SET_ERROR(err) (err) 197249195Smm#endif /* !illumos */ 198249195Smm 199249195Smm/* 200168404Spjd * Threads 201168404Spjd */ 202168404Spjd#define curthread ((void *)(uintptr_t)thr_self()) 203168404Spjd 204168404Spjdtypedef struct kthread kthread_t; 205168404Spjd 206168404Spjd#define thread_create(stk, stksize, func, arg, len, pp, state, pri) \ 207168404Spjd zk_thread_create(func, arg) 208168404Spjd#define thread_exit() thr_exit(NULL) 209219089Spjd#define thread_join(t) panic("libzpool cannot join threads") 210168404Spjd 211219089Spjd#define newproc(f, a, cid, pri, ctp, pid) (ENOSYS) 212219089Spjd 213219089Spjd/* in libzpool, p0 exists only to have its address taken */ 214219089Spjdstruct proc { 215219089Spjd uintptr_t this_is_never_used_dont_dereference_it; 216219089Spjd}; 217219089Spjd 218219089Spjdextern struct proc p0; 219235222Smm#define curproc (&p0) 220219089Spjd 221219089Spjd#define PS_NONE -1 222219089Spjd 223168404Spjdextern kthread_t *zk_thread_create(void (*func)(), void *arg); 224168404Spjd 225168404Spjd#define issig(why) (FALSE) 226168404Spjd#define ISSIG(thr, why) (FALSE) 227168404Spjd 228168404Spjd/* 229168404Spjd * Mutexes 230168404Spjd */ 231168404Spjdtypedef struct kmutex { 232185029Spjd void *m_owner; 233185029Spjd boolean_t initialized; 234185029Spjd mutex_t m_lock; 235168404Spjd} kmutex_t; 236168404Spjd 237168404Spjd#define MUTEX_DEFAULT USYNC_THREAD 238219089Spjd#undef MUTEX_HELD 239219089Spjd#undef MUTEX_NOT_HELD 240168404Spjd#define MUTEX_HELD(m) ((m)->m_owner == curthread) 241219089Spjd#define MUTEX_NOT_HELD(m) (!MUTEX_HELD(m)) 242219089Spjd#define _mutex_held(m) pthread_mutex_isowned_np(m) 243168404Spjd 244168404Spjd/* 245168404Spjd * Argh -- we have to get cheesy here because the kernel and userland 246168404Spjd * have different signatures for the same routine. 247168404Spjd */ 248168404Spjd//extern int _mutex_init(mutex_t *mp, int type, void *arg); 249168404Spjd//extern int _mutex_destroy(mutex_t *mp); 250219089Spjd//extern int _mutex_owned(mutex_t *mp); 251168404Spjd 252168404Spjd#define mutex_init(mp, b, c, d) zmutex_init((kmutex_t *)(mp)) 253168404Spjd#define mutex_destroy(mp) zmutex_destroy((kmutex_t *)(mp)) 254195515Spjd#define mutex_owned(mp) zmutex_owned((kmutex_t *)(mp)) 255168404Spjd 256168404Spjdextern void zmutex_init(kmutex_t *mp); 257168404Spjdextern void zmutex_destroy(kmutex_t *mp); 258195515Spjdextern int zmutex_owned(kmutex_t *mp); 259168404Spjdextern void mutex_enter(kmutex_t *mp); 260168404Spjdextern void mutex_exit(kmutex_t *mp); 261168404Spjdextern int mutex_tryenter(kmutex_t *mp); 262168404Spjdextern void *mutex_owner(kmutex_t *mp); 263168404Spjd 264168404Spjd/* 265168404Spjd * RW locks 266168404Spjd */ 267168404Spjdtypedef struct krwlock { 268168404Spjd int rw_count; 269168404Spjd void *rw_owner; 270185029Spjd boolean_t initialized; 271168404Spjd rwlock_t rw_lock; 272168404Spjd} krwlock_t; 273168404Spjd 274168404Spjdtypedef int krw_t; 275168404Spjd 276168404Spjd#define RW_READER 0 277168404Spjd#define RW_WRITER 1 278168404Spjd#define RW_DEFAULT USYNC_THREAD 279168404Spjd 280168404Spjd#undef RW_READ_HELD 281185029Spjd#define RW_READ_HELD(x) ((x)->rw_owner == NULL && (x)->rw_count > 0) 282168404Spjd 283168404Spjd#undef RW_WRITE_HELD 284168404Spjd#define RW_WRITE_HELD(x) ((x)->rw_owner == curthread) 285168404Spjd#define RW_LOCK_HELD(x) rw_lock_held(x) 286168404Spjd 287248571Smm#undef RW_LOCK_HELD 288248571Smm#define RW_LOCK_HELD(x) (RW_READ_HELD(x) || RW_WRITE_HELD(x)) 289248571Smm 290168404Spjdextern void rw_init(krwlock_t *rwlp, char *name, int type, void *arg); 291168404Spjdextern void rw_destroy(krwlock_t *rwlp); 292168404Spjdextern void rw_enter(krwlock_t *rwlp, krw_t rw); 293168404Spjdextern int rw_tryenter(krwlock_t *rwlp, krw_t rw); 294168404Spjdextern int rw_tryupgrade(krwlock_t *rwlp); 295168404Spjdextern void rw_exit(krwlock_t *rwlp); 296168404Spjdextern int rw_lock_held(krwlock_t *rwlp); 297168404Spjd#define rw_downgrade(rwlp) do { } while (0) 298168404Spjd 299185029Spjdextern uid_t crgetuid(cred_t *cr); 300248571Smmextern uid_t crgetruid(cred_t *cr); 301185029Spjdextern gid_t crgetgid(cred_t *cr); 302185029Spjdextern int crgetngroups(cred_t *cr); 303185029Spjdextern gid_t *crgetgroups(cred_t *cr); 304185029Spjd 305168404Spjd/* 306168404Spjd * Condition variables 307168404Spjd */ 308168404Spjdtypedef cond_t kcondvar_t; 309168404Spjd 310168404Spjd#define CV_DEFAULT USYNC_THREAD 311168404Spjd 312168404Spjdextern void cv_init(kcondvar_t *cv, char *name, int type, void *arg); 313168404Spjdextern void cv_destroy(kcondvar_t *cv); 314168404Spjdextern void cv_wait(kcondvar_t *cv, kmutex_t *mp); 315168404Spjdextern clock_t cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime); 316255437Sdelphijextern clock_t cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t tim, 317255437Sdelphij hrtime_t res, int flag); 318168404Spjdextern void cv_signal(kcondvar_t *cv); 319168404Spjdextern void cv_broadcast(kcondvar_t *cv); 320168404Spjd 321168404Spjd/* 322248571Smm * Thread-specific data 323248571Smm */ 324248571Smm#define tsd_get(k) pthread_getspecific(k) 325248571Smm#define tsd_set(k, v) pthread_setspecific(k, v) 326248571Smm#define tsd_create(kp, d) pthread_key_create(kp, d) 327248571Smm#define tsd_destroy(kp) /* nothing */ 328248571Smm 329248571Smm/* 330168404Spjd * Kernel memory 331168404Spjd */ 332168404Spjd#define KM_SLEEP UMEM_NOFAIL 333185029Spjd#define KM_PUSHPAGE KM_SLEEP 334168404Spjd#define KM_NOSLEEP UMEM_DEFAULT 335168404Spjd#define KMC_NODEBUG UMC_NODEBUG 336219089Spjd#define KMC_NOTOUCH 0 /* not needed for userland caches */ 337230629Skmacy#define KM_NODEBUG 0 338168404Spjd#define kmem_alloc(_s, _f) umem_alloc(_s, _f) 339168404Spjd#define kmem_zalloc(_s, _f) umem_zalloc(_s, _f) 340168404Spjd#define kmem_free(_b, _s) umem_free(_b, _s) 341168584Spjd#define kmem_size() (physmem * PAGESIZE) 342168404Spjd#define kmem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i) \ 343168404Spjd umem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i) 344168404Spjd#define kmem_cache_destroy(_c) umem_cache_destroy(_c) 345168404Spjd#define kmem_cache_alloc(_c, _f) umem_cache_alloc(_c, _f) 346168404Spjd#define kmem_cache_free(_c, _b) umem_cache_free(_c, _b) 347168404Spjd#define kmem_debugging() 0 348219089Spjd#define kmem_cache_reap_now(_c) /* nothing */ 349219089Spjd#define kmem_cache_set_move(_c, _cb) /* nothing */ 350219089Spjd#define POINTER_INVALIDATE(_pp) /* nothing */ 351219089Spjd#define POINTER_IS_VALID(_p) 0 352168404Spjd 353168404Spjdtypedef umem_cache_t kmem_cache_t; 354168404Spjd 355219089Spjdtypedef enum kmem_cbrc { 356219089Spjd KMEM_CBRC_YES, 357219089Spjd KMEM_CBRC_NO, 358219089Spjd KMEM_CBRC_LATER, 359219089Spjd KMEM_CBRC_DONT_NEED, 360219089Spjd KMEM_CBRC_DONT_KNOW 361219089Spjd} kmem_cbrc_t; 362219089Spjd 363168404Spjd/* 364168404Spjd * Task queues 365168404Spjd */ 366168404Spjdtypedef struct taskq taskq_t; 367168404Spjdtypedef uintptr_t taskqid_t; 368168404Spjdtypedef void (task_func_t)(void *); 369168404Spjd 370168404Spjd#define TASKQ_PREPOPULATE 0x0001 371168404Spjd#define TASKQ_CPR_SAFE 0x0002 /* Use CPR safe protocol */ 372168404Spjd#define TASKQ_DYNAMIC 0x0004 /* Use dynamic thread scheduling */ 373219089Spjd#define TASKQ_THREADS_CPU_PCT 0x0008 /* Scale # threads by # cpus */ 374219089Spjd#define TASKQ_DC_BATCH 0x0010 /* Mark threads as batch */ 375168404Spjd 376168404Spjd#define TQ_SLEEP KM_SLEEP /* Can block for memory */ 377168404Spjd#define TQ_NOSLEEP KM_NOSLEEP /* cannot block for memory; may fail */ 378219089Spjd#define TQ_NOQUEUE 0x02 /* Do not enqueue if can't dispatch */ 379219089Spjd#define TQ_FRONT 0x08 /* Queue in front */ 380168404Spjd 381208047Smmextern taskq_t *system_taskq; 382208047Smm 383168404Spjdextern taskq_t *taskq_create(const char *, int, pri_t, int, int, uint_t); 384219089Spjd#define taskq_create_proc(a, b, c, d, e, p, f) \ 385219089Spjd (taskq_create(a, b, c, d, e, f)) 386219089Spjd#define taskq_create_sysdc(a, b, d, e, p, dc, f) \ 387219089Spjd (taskq_create(a, b, maxclsyspri, d, e, f)) 388168404Spjdextern taskqid_t taskq_dispatch(taskq_t *, task_func_t, void *, uint_t); 389168404Spjdextern void taskq_destroy(taskq_t *); 390168404Spjdextern void taskq_wait(taskq_t *); 391168404Spjdextern int taskq_member(taskq_t *, void *); 392208047Smmextern void system_taskq_init(void); 393219089Spjdextern void system_taskq_fini(void); 394168404Spjd 395219089Spjd#define taskq_dispatch_safe(tq, func, arg, flags, task) \ 396219089Spjd taskq_dispatch((tq), (func), (arg), (flags)) 397208166Spjd 398185029Spjd#define XVA_MAPSIZE 3 399185029Spjd#define XVA_MAGIC 0x78766174 400185029Spjd 401168404Spjd/* 402168404Spjd * vnodes 403168404Spjd */ 404168404Spjdtypedef struct vnode { 405168404Spjd uint64_t v_size; 406168404Spjd int v_fd; 407168404Spjd char *v_path; 408168404Spjd} vnode_t; 409168404Spjd 410219089Spjd#define AV_SCANSTAMP_SZ 32 /* length of anti-virus scanstamp */ 411185029Spjd 412185029Spjdtypedef struct xoptattr { 413185029Spjd timestruc_t xoa_createtime; /* Create time of file */ 414185029Spjd uint8_t xoa_archive; 415185029Spjd uint8_t xoa_system; 416185029Spjd uint8_t xoa_readonly; 417185029Spjd uint8_t xoa_hidden; 418185029Spjd uint8_t xoa_nounlink; 419185029Spjd uint8_t xoa_immutable; 420185029Spjd uint8_t xoa_appendonly; 421185029Spjd uint8_t xoa_nodump; 422185029Spjd uint8_t xoa_settable; 423185029Spjd uint8_t xoa_opaque; 424185029Spjd uint8_t xoa_av_quarantined; 425185029Spjd uint8_t xoa_av_modified; 426219089Spjd uint8_t xoa_av_scanstamp[AV_SCANSTAMP_SZ]; 427219089Spjd uint8_t xoa_reparse; 428219089Spjd uint8_t xoa_offline; 429219089Spjd uint8_t xoa_sparse; 430185029Spjd} xoptattr_t; 431185029Spjd 432168404Spjdtypedef struct vattr { 433168404Spjd uint_t va_mask; /* bit-mask of attributes */ 434168404Spjd u_offset_t va_size; /* file size in bytes */ 435168404Spjd} vattr_t; 436168404Spjd 437168404Spjd 438185029Spjdtypedef struct xvattr { 439185029Spjd vattr_t xva_vattr; /* Embedded vattr structure */ 440185029Spjd uint32_t xva_magic; /* Magic Number */ 441185029Spjd uint32_t xva_mapsize; /* Size of attr bitmap (32-bit words) */ 442185029Spjd uint32_t *xva_rtnattrmapp; /* Ptr to xva_rtnattrmap[] */ 443185029Spjd uint32_t xva_reqattrmap[XVA_MAPSIZE]; /* Requested attrs */ 444185029Spjd uint32_t xva_rtnattrmap[XVA_MAPSIZE]; /* Returned attrs */ 445185029Spjd xoptattr_t xva_xoptattrs; /* Optional attributes */ 446185029Spjd} xvattr_t; 447185029Spjd 448185029Spjdtypedef struct vsecattr { 449185029Spjd uint_t vsa_mask; /* See below */ 450185029Spjd int vsa_aclcnt; /* ACL entry count */ 451185029Spjd void *vsa_aclentp; /* pointer to ACL entries */ 452185029Spjd int vsa_dfaclcnt; /* default ACL entry count */ 453185029Spjd void *vsa_dfaclentp; /* pointer to default ACL entries */ 454185029Spjd size_t vsa_aclentsz; /* ACE size in bytes of vsa_aclentp */ 455185029Spjd} vsecattr_t; 456185029Spjd 457185029Spjd#define AT_TYPE 0x00001 458185029Spjd#define AT_MODE 0x00002 459185029Spjd#define AT_UID 0x00004 460185029Spjd#define AT_GID 0x00008 461185029Spjd#define AT_FSID 0x00010 462185029Spjd#define AT_NODEID 0x00020 463185029Spjd#define AT_NLINK 0x00040 464185029Spjd#define AT_SIZE 0x00080 465185029Spjd#define AT_ATIME 0x00100 466185029Spjd#define AT_MTIME 0x00200 467185029Spjd#define AT_CTIME 0x00400 468185029Spjd#define AT_RDEV 0x00800 469185029Spjd#define AT_BLKSIZE 0x01000 470185029Spjd#define AT_NBLOCKS 0x02000 471185029Spjd#define AT_SEQ 0x08000 472185029Spjd#define AT_XVATTR 0x10000 473185029Spjd 474168404Spjd#define CRCREAT 0 475168404Spjd 476219089Spjdextern int fop_getattr(vnode_t *vp, vattr_t *vap); 477219089Spjd 478185029Spjd#define VOP_CLOSE(vp, f, c, o, cr, ct) 0 479185029Spjd#define VOP_PUTPAGE(vp, of, sz, fl, cr, ct) 0 480219089Spjd#define VOP_GETATTR(vp, vap, cr) fop_getattr((vp), (vap)); 481168404Spjd 482185029Spjd#define VOP_FSYNC(vp, f, cr, ct) fsync((vp)->v_fd) 483168404Spjd 484219089Spjd#define VN_RELE(vp) vn_close(vp, 0, NULL, NULL) 485191906Skmacy#define VN_RELE_ASYNC(vp, taskq) vn_close(vp, 0, NULL, NULL) 486168404Spjd 487185029Spjd#define vn_lock(vp, type) 488185029Spjd#define VOP_UNLOCK(vp, type) 489185029Spjd 490168404Spjdextern int vn_open(char *path, int x1, int oflags, int mode, vnode_t **vpp, 491168404Spjd int x2, int x3); 492168404Spjdextern int vn_openat(char *path, int x1, int oflags, int mode, vnode_t **vpp, 493185029Spjd int x2, int x3, vnode_t *vp, int fd); 494168404Spjdextern int vn_rdwr(int uio, vnode_t *vp, void *addr, ssize_t len, 495168404Spjd offset_t offset, int x1, int x2, rlim64_t x3, void *x4, ssize_t *residp); 496185029Spjdextern void vn_close(vnode_t *vp, int openflag, cred_t *cr, kthread_t *td); 497168404Spjd 498168404Spjd#define vn_remove(path, x1, x2) remove(path) 499168404Spjd#define vn_rename(from, to, seg) rename((from), (to)) 500168404Spjd#define vn_is_readonly(vp) B_FALSE 501168404Spjd 502168404Spjdextern vnode_t *rootdir; 503168404Spjd 504168404Spjd#include <sys/file.h> /* for FREAD, FWRITE, etc */ 505168404Spjd#define FTRUNC O_TRUNC 506168404Spjd 507168404Spjd/* 508168404Spjd * Random stuff 509168404Spjd */ 510219089Spjd#define ddi_get_lbolt() (gethrtime() >> 23) 511219089Spjd#define ddi_get_lbolt64() (gethrtime() >> 23) 512219089Spjd#define hz 119 /* frequency when using gethrtime() >> 23 for lbolt */ 513168404Spjd 514168404Spjdextern void delay(clock_t ticks); 515168404Spjd 516247265Smm#define SEC_TO_TICK(sec) ((sec) * hz) 517247265Smm#define NSEC_TO_TICK(usec) ((usec) / (NANOSEC / hz)) 518247265Smm 519168404Spjd#define gethrestime_sec() time(NULL) 520219089Spjd#define gethrestime(t) \ 521219089Spjd do {\ 522219089Spjd (t)->tv_sec = gethrestime_sec();\ 523219089Spjd (t)->tv_nsec = 0;\ 524219089Spjd } while (0); 525168404Spjd 526168404Spjd#define max_ncpus 64 527168404Spjd 528168404Spjd#define minclsyspri 60 529168404Spjd#define maxclsyspri 99 530168404Spjd 531168404Spjd#define CPU_SEQID (thr_self() & (max_ncpus - 1)) 532168404Spjd 533219089Spjd#define kcred NULL 534219089Spjd#define CRED() NULL 535219089Spjd 536185029Spjd#ifndef ptob 537185029Spjd#define ptob(x) ((x) * PAGESIZE) 538185029Spjd#endif 539168404Spjd 540168404Spjdextern uint64_t physmem; 541168404Spjd 542168404Spjdextern int highbit(ulong_t i); 543168404Spjdextern int random_get_bytes(uint8_t *ptr, size_t len); 544168404Spjdextern int random_get_pseudo_bytes(uint8_t *ptr, size_t len); 545168404Spjd 546168404Spjdextern void kernel_init(int); 547168404Spjdextern void kernel_fini(void); 548168404Spjd 549168404Spjdstruct spa; 550168404Spjdextern void nicenum(uint64_t num, char *buf); 551168404Spjdextern void show_pool_stats(struct spa *); 552168404Spjd 553168404Spjdtypedef struct callb_cpr { 554168404Spjd kmutex_t *cc_lockp; 555168404Spjd} callb_cpr_t; 556168404Spjd 557168404Spjd#define CALLB_CPR_INIT(cp, lockp, func, name) { \ 558168404Spjd (cp)->cc_lockp = lockp; \ 559168404Spjd} 560168404Spjd 561168404Spjd#define CALLB_CPR_SAFE_BEGIN(cp) { \ 562168404Spjd ASSERT(MUTEX_HELD((cp)->cc_lockp)); \ 563168404Spjd} 564168404Spjd 565168404Spjd#define CALLB_CPR_SAFE_END(cp, lockp) { \ 566168404Spjd ASSERT(MUTEX_HELD((cp)->cc_lockp)); \ 567168404Spjd} 568168404Spjd 569168404Spjd#define CALLB_CPR_EXIT(cp) { \ 570168404Spjd ASSERT(MUTEX_HELD((cp)->cc_lockp)); \ 571168404Spjd mutex_exit((cp)->cc_lockp); \ 572168404Spjd} 573168404Spjd 574168404Spjd#define zone_dataset_visible(x, y) (1) 575168404Spjd#define INGLOBALZONE(z) (1) 576168404Spjd 577219089Spjdextern char *kmem_asprintf(const char *fmt, ...); 578248571Smm#define strfree(str) kmem_free((str), strlen(str) + 1) 579219089Spjd 580168498Spjd/* 581168498Spjd * Hostname information 582168498Spjd */ 583168498Spjdextern struct utsname utsname; 584219089Spjdextern char hw_serial[]; /* for userland-emulated hostid access */ 585168498Spjdextern int ddi_strtoul(const char *str, char **nptr, int base, 586168498Spjd unsigned long *result); 587168498Spjd 588219089Spjdextern int ddi_strtoull(const char *str, char **nptr, int base, 589219089Spjd u_longlong_t *result); 590219089Spjd 591168404Spjd/* ZFS Boot Related stuff. */ 592168404Spjd 593168404Spjdstruct _buf { 594168404Spjd intptr_t _fd; 595168404Spjd}; 596168404Spjd 597168404Spjdstruct bootstat { 598168404Spjd uint64_t st_size; 599168404Spjd}; 600168404Spjd 601185029Spjdtypedef struct ace_object { 602185029Spjd uid_t a_who; 603185029Spjd uint32_t a_access_mask; 604185029Spjd uint16_t a_flags; 605185029Spjd uint16_t a_type; 606185029Spjd uint8_t a_obj_type[16]; 607185029Spjd uint8_t a_inherit_obj_type[16]; 608185029Spjd} ace_object_t; 609185029Spjd 610185029Spjd 611185029Spjd#define ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE 0x05 612185029Spjd#define ACE_ACCESS_DENIED_OBJECT_ACE_TYPE 0x06 613185029Spjd#define ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE 0x07 614185029Spjd#define ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE 0x08 615185029Spjd 616168404Spjdextern struct _buf *kobj_open_file(char *name); 617168404Spjdextern int kobj_read_file(struct _buf *file, char *buf, unsigned size, 618168404Spjd unsigned off); 619168404Spjdextern void kobj_close_file(struct _buf *file); 620168404Spjdextern int kobj_get_filesize(struct _buf *file, uint64_t *size); 621185029Spjdextern int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr); 622185029Spjdextern int zfs_secpolicy_rename_perms(const char *from, const char *to, 623185029Spjd cred_t *cr); 624185029Spjdextern int zfs_secpolicy_destroy_perms(const char *name, cred_t *cr); 625185029Spjdextern zoneid_t getzoneid(void); 626168404Spjd/* Random compatibility stuff. */ 627168404Spjd#define lbolt (gethrtime() >> 23) 628168404Spjd#define lbolt64 (gethrtime() >> 23) 629168404Spjd 630168404Spjdextern uint64_t physmem; 631168404Spjd 632168404Spjd#define gethrestime_sec() time(NULL) 633168404Spjd 634168404Spjd#define pwrite64(d, p, n, o) pwrite(d, p, n, o) 635168404Spjd#define readdir64(d) readdir(d) 636168404Spjd#define SIGPENDING(td) (0) 637168404Spjd#define root_mount_wait() do { } while (0) 638168825Spjd#define root_mounted() (1) 639168404Spjd 640168404Spjdstruct file { 641168404Spjd void *dummy; 642168404Spjd}; 643168404Spjd 644168404Spjd#define FCREAT O_CREAT 645168404Spjd#define FOFFMAX 0x0 646168404Spjd 647185029Spjd/* SID stuff */ 648185029Spjdtypedef struct ksiddomain { 649185029Spjd uint_t kd_ref; 650185029Spjd uint_t kd_len; 651185029Spjd char *kd_name; 652185029Spjd} ksiddomain_t; 653185029Spjd 654185029Spjdksiddomain_t *ksid_lookupdomain(const char *); 655185029Spjdvoid ksiddomain_rele(ksiddomain_t *); 656185029Spjd 657209962Smmtypedef uint32_t idmap_rid_t; 658209962Smm 659219089Spjd#define DDI_SLEEP KM_SLEEP 660219089Spjd#define ddi_log_sysevent(_a, _b, _c, _d, _e, _f, _g) (0) 661219089Spjd 662168404Spjd#define SX_SYSINIT(name, lock, desc) 663168404Spjd 664254591Sgibbs#define SYSCTL_HANDLER_ARGS struct sysctl_oid *oidp, void *arg1, \ 665254591Sgibbs intptr_t arg2, struct sysctl_req *req 666254591Sgibbs 667254591Sgibbs/* 668254591Sgibbs * This describes the access space for a sysctl request. This is needed 669254591Sgibbs * so that we can use the interface from the kernel or from user-space. 670254591Sgibbs */ 671254591Sgibbsstruct sysctl_req { 672254591Sgibbs struct thread *td; /* used for access checking */ 673254591Sgibbs int lock; /* wiring state */ 674254591Sgibbs void *oldptr; 675254591Sgibbs size_t oldlen; 676254591Sgibbs size_t oldidx; 677254591Sgibbs int (*oldfunc)(struct sysctl_req *, const void *, size_t); 678254591Sgibbs void *newptr; 679254591Sgibbs size_t newlen; 680254591Sgibbs size_t newidx; 681254591Sgibbs int (*newfunc)(struct sysctl_req *, void *, size_t); 682254591Sgibbs size_t validlen; 683254591Sgibbs int flags; 684254591Sgibbs}; 685254591Sgibbs 686254591SgibbsSLIST_HEAD(sysctl_oid_list, sysctl_oid); 687254591Sgibbs 688254591Sgibbs/* 689254591Sgibbs * This describes one "oid" in the MIB tree. Potentially more nodes can 690254591Sgibbs * be hidden behind it, expanded by the handler. 691254591Sgibbs */ 692254591Sgibbsstruct sysctl_oid { 693254591Sgibbs struct sysctl_oid_list *oid_parent; 694254591Sgibbs SLIST_ENTRY(sysctl_oid) oid_link; 695254591Sgibbs int oid_number; 696254591Sgibbs u_int oid_kind; 697254591Sgibbs void *oid_arg1; 698254591Sgibbs intptr_t oid_arg2; 699254591Sgibbs const char *oid_name; 700254591Sgibbs int (*oid_handler)(SYSCTL_HANDLER_ARGS); 701254591Sgibbs const char *oid_fmt; 702254591Sgibbs int oid_refcnt; 703254591Sgibbs u_int oid_running; 704254591Sgibbs const char *oid_descr; 705254591Sgibbs}; 706254591Sgibbs 707168404Spjd#define SYSCTL_DECL(...) 708168582Spjd#define SYSCTL_NODE(...) 709168404Spjd#define SYSCTL_INT(...) 710185029Spjd#define SYSCTL_UINT(...) 711168582Spjd#define SYSCTL_ULONG(...) 712254591Sgibbs#define SYSCTL_PROC(...) 713185029Spjd#define SYSCTL_QUAD(...) 714217367Smdf#define SYSCTL_UQUAD(...) 715168404Spjd#ifdef TUNABLE_INT 716168404Spjd#undef TUNABLE_INT 717168582Spjd#undef TUNABLE_ULONG 718185029Spjd#undef TUNABLE_QUAD 719168404Spjd#endif 720168404Spjd#define TUNABLE_INT(...) 721168582Spjd#define TUNABLE_ULONG(...) 722185029Spjd#define TUNABLE_QUAD(...) 723168404Spjd 724254591Sgibbsint sysctl_handle_64(SYSCTL_HANDLER_ARGS); 725254591Sgibbs 726168404Spjd/* Errors */ 727168404Spjd 728168404Spjd#ifndef ERESTART 729168404Spjd#define ERESTART (-1) 730168404Spjd#endif 731168404Spjd 732247265Smm#ifdef illumos 733247265Smm/* 734247265Smm * Cyclic information 735247265Smm */ 736247265Smmextern kmutex_t cpu_lock; 737247265Smm 738247265Smmtypedef uintptr_t cyclic_id_t; 739247265Smmtypedef uint16_t cyc_level_t; 740247265Smmtypedef void (*cyc_func_t)(void *); 741247265Smm 742247265Smm#define CY_LOW_LEVEL 0 743247265Smm#define CY_INFINITY INT64_MAX 744247265Smm#define CYCLIC_NONE ((cyclic_id_t)0) 745247265Smm 746247265Smmtypedef struct cyc_time { 747247265Smm hrtime_t cyt_when; 748247265Smm hrtime_t cyt_interval; 749247265Smm} cyc_time_t; 750247265Smm 751247265Smmtypedef struct cyc_handler { 752247265Smm cyc_func_t cyh_func; 753247265Smm void *cyh_arg; 754247265Smm cyc_level_t cyh_level; 755247265Smm} cyc_handler_t; 756247265Smm 757247265Smmextern cyclic_id_t cyclic_add(cyc_handler_t *, cyc_time_t *); 758247265Smmextern void cyclic_remove(cyclic_id_t); 759247265Smmextern int cyclic_reprogram(cyclic_id_t, hrtime_t); 760247265Smm#endif /* illumos */ 761247265Smm 762169301Spjd#ifdef __cplusplus 763169301Spjd} 764169301Spjd#endif 765169301Spjd 766168404Spjd#endif /* _SYS_ZFS_CONTEXT_H */ 767