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