The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/include/sys/zfs_context.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * CDDL HEADER START
    3  *
    4  * The contents of this file are subject to the terms of the
    5  * Common Development and Distribution License (the "License").
    6  * You may not use this file except in compliance with the License.
    7  *
    8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
    9  * or https://opensource.org/licenses/CDDL-1.0.
   10  * See the License for the specific language governing permissions
   11  * and limitations under the License.
   12  *
   13  * When distributing Covered Code, include this CDDL HEADER in each
   14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   15  * If applicable, add the following below this CDDL HEADER, with the
   16  * fields enclosed by brackets "[]" replaced with your own identifying
   17  * information: Portions Copyright [yyyy] [name of copyright owner]
   18  *
   19  * CDDL HEADER END
   20  */
   21 /*
   22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
   23  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
   24  * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
   25  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
   26  */
   27 
   28 #ifndef _SYS_ZFS_CONTEXT_H
   29 #define _SYS_ZFS_CONTEXT_H
   30 
   31 #ifdef __cplusplus
   32 extern "C" {
   33 #endif
   34 
   35 /*
   36  * This code compiles in three different contexts. When __KERNEL__ is defined,
   37  * the code uses "unix-like" kernel interfaces. When _STANDALONE is defined, the
   38  * code is running in a reduced capacity environment of the boot loader which is
   39  * generally a subset of both POSIX and kernel interfaces (with a few unique
   40  * interfaces too). When neither are defined, it's in a userland POSIX or
   41  * similar environment.
   42  */
   43 #if defined(__KERNEL__) || defined(_STANDALONE)
   44 #include <sys/types.h>
   45 #include <sys/atomic.h>
   46 #include <sys/sysmacros.h>
   47 #include <sys/vmsystm.h>
   48 #include <sys/condvar.h>
   49 #include <sys/cmn_err.h>
   50 #include <sys/kmem.h>
   51 #include <sys/kmem_cache.h>
   52 #include <sys/vmem.h>
   53 #include <sys/misc.h>
   54 #include <sys/taskq.h>
   55 #include <sys/param.h>
   56 #include <sys/disp.h>
   57 #include <sys/debug.h>
   58 #include <sys/random.h>
   59 #include <sys/string.h>
   60 #include <sys/byteorder.h>
   61 #include <sys/list.h>
   62 #include <sys/time.h>
   63 #include <sys/zone.h>
   64 #include <sys/kstat.h>
   65 #include <sys/zfs_debug.h>
   66 #include <sys/sysevent.h>
   67 #include <sys/sysevent/eventdefs.h>
   68 #include <sys/zfs_delay.h>
   69 #include <sys/sunddi.h>
   70 #include <sys/ctype.h>
   71 #include <sys/disp.h>
   72 #include <sys/trace.h>
   73 #include <sys/procfs_list.h>
   74 #include <sys/mod.h>
   75 #include <sys/uio_impl.h>
   76 #include <sys/zfs_context_os.h>
   77 #else /* _KERNEL || _STANDALONE */
   78 
   79 #define _SYS_MUTEX_H
   80 #define _SYS_RWLOCK_H
   81 #define _SYS_CONDVAR_H
   82 #define _SYS_VNODE_H
   83 #define _SYS_VFS_H
   84 #define _SYS_SUNDDI_H
   85 #define _SYS_CALLB_H
   86 
   87 #include <stdio.h>
   88 #include <stdlib.h>
   89 #include <stddef.h>
   90 #include <stdarg.h>
   91 #include <fcntl.h>
   92 #include <unistd.h>
   93 #include <errno.h>
   94 #include <string.h>
   95 #include <pthread.h>
   96 #include <setjmp.h>
   97 #include <assert.h>
   98 #include <umem.h>
   99 #include <limits.h>
  100 #include <atomic.h>
  101 #include <dirent.h>
  102 #include <time.h>
  103 #include <ctype.h>
  104 #include <signal.h>
  105 #include <sys/mman.h>
  106 #include <sys/types.h>
  107 #include <sys/cred.h>
  108 #include <sys/sysmacros.h>
  109 #include <sys/resource.h>
  110 #include <sys/byteorder.h>
  111 #include <sys/list.h>
  112 #include <sys/mod.h>
  113 #include <sys/uio.h>
  114 #include <sys/zfs_debug.h>
  115 #include <sys/kstat.h>
  116 #include <sys/u8_textprep.h>
  117 #include <sys/sysevent.h>
  118 #include <sys/sysevent/eventdefs.h>
  119 #include <sys/sunddi.h>
  120 #include <sys/debug.h>
  121 #include <sys/utsname.h>
  122 #include <sys/trace_zfs.h>
  123 
  124 #include <sys/zfs_context_os.h>
  125 
  126 /*
  127  * Stack
  128  */
  129 
  130 #define noinline        __attribute__((noinline))
  131 #define likely(x)       __builtin_expect((x), 1)
  132 #define unlikely(x)     __builtin_expect((x), 0)
  133 
  134 /*
  135  * Debugging
  136  */
  137 
  138 /*
  139  * Note that we are not using the debugging levels.
  140  */
  141 
  142 #define CE_CONT         0       /* continuation         */
  143 #define CE_NOTE         1       /* notice               */
  144 #define CE_WARN         2       /* warning              */
  145 #define CE_PANIC        3       /* panic                */
  146 #define CE_IGNORE       4       /* print nothing        */
  147 
  148 /*
  149  * ZFS debugging
  150  */
  151 
  152 extern void dprintf_setup(int *argc, char **argv);
  153 
  154 extern void cmn_err(int, const char *, ...)
  155     __attribute__((format(printf, 2, 3)));
  156 extern void vcmn_err(int, const char *, va_list)
  157     __attribute__((format(printf, 2, 0)));
  158 extern void panic(const char *, ...)
  159     __attribute__((format(printf, 1, 2), noreturn));
  160 extern void vpanic(const char *, va_list)
  161     __attribute__((format(printf, 1, 0), noreturn));
  162 
  163 #define fm_panic        panic
  164 
  165 /*
  166  * DTrace SDT probes have different signatures in userland than they do in
  167  * the kernel.  If they're being used in kernel code, re-define them out of
  168  * existence for their counterparts in libzpool.
  169  *
  170  * Here's an example of how to use the set-error probes in userland:
  171  * zfs$target:::set-error /arg0 == EBUSY/ {stack();}
  172  *
  173  * Here's an example of how to use DTRACE_PROBE probes in userland:
  174  * If there is a probe declared as follows:
  175  * DTRACE_PROBE2(zfs__probe_name, uint64_t, blkid, dnode_t *, dn);
  176  * Then you can use it as follows:
  177  * zfs$target:::probe2 /copyinstr(arg0) == "zfs__probe_name"/
  178  *     {printf("%u %p\n", arg1, arg2);}
  179  */
  180 
  181 #ifdef DTRACE_PROBE
  182 #undef  DTRACE_PROBE
  183 #endif  /* DTRACE_PROBE */
  184 #define DTRACE_PROBE(a)
  185 
  186 #ifdef DTRACE_PROBE1
  187 #undef  DTRACE_PROBE1
  188 #endif  /* DTRACE_PROBE1 */
  189 #define DTRACE_PROBE1(a, b, c)
  190 
  191 #ifdef DTRACE_PROBE2
  192 #undef  DTRACE_PROBE2
  193 #endif  /* DTRACE_PROBE2 */
  194 #define DTRACE_PROBE2(a, b, c, d, e)
  195 
  196 #ifdef DTRACE_PROBE3
  197 #undef  DTRACE_PROBE3
  198 #endif  /* DTRACE_PROBE3 */
  199 #define DTRACE_PROBE3(a, b, c, d, e, f, g)
  200 
  201 #ifdef DTRACE_PROBE4
  202 #undef  DTRACE_PROBE4
  203 #endif  /* DTRACE_PROBE4 */
  204 #define DTRACE_PROBE4(a, b, c, d, e, f, g, h, i)
  205 
  206 /*
  207  * Tunables.
  208  */
  209 typedef struct zfs_kernel_param {
  210         const char *name;       /* unused stub */
  211 } zfs_kernel_param_t;
  212 
  213 #define ZFS_MODULE_PARAM(scope_prefix, name_prefix, name, type, perm, desc)
  214 #define ZFS_MODULE_PARAM_ARGS void
  215 #define ZFS_MODULE_PARAM_CALL(scope_prefix, name_prefix, name, setfunc, \
  216         getfunc, perm, desc)
  217 
  218 /*
  219  * Threads.
  220  */
  221 typedef pthread_t       kthread_t;
  222 
  223 #define TS_RUN          0x00000002
  224 #define TS_JOINABLE     0x00000004
  225 
  226 #define curthread       ((void *)(uintptr_t)pthread_self())
  227 #define getcomm()       "unknown"
  228 
  229 #define thread_create_named(name, stk, stksize, func, arg, len, \
  230     pp, state, pri)     \
  231         zk_thread_create(func, arg, stksize, state)
  232 #define thread_create(stk, stksize, func, arg, len, pp, state, pri)     \
  233         zk_thread_create(func, arg, stksize, state)
  234 #define thread_exit()   pthread_exit(NULL)
  235 #define thread_join(t)  pthread_join((pthread_t)(t), NULL)
  236 
  237 #define newproc(f, a, cid, pri, ctp, pid)       (ENOSYS)
  238 
  239 /* in libzpool, p0 exists only to have its address taken */
  240 typedef struct proc {
  241         uintptr_t       this_is_never_used_dont_dereference_it;
  242 } proc_t;
  243 
  244 extern struct proc p0;
  245 #define curproc         (&p0)
  246 
  247 #define PS_NONE         -1
  248 
  249 extern kthread_t *zk_thread_create(void (*func)(void *), void *arg,
  250     size_t stksize, int state);
  251 
  252 #define issig(why)      (FALSE)
  253 #define ISSIG(thr, why) (FALSE)
  254 
  255 #define KPREEMPT_SYNC           (-1)
  256 
  257 #define kpreempt(x)             sched_yield()
  258 #define kpreempt_disable()      ((void)0)
  259 #define kpreempt_enable()       ((void)0)
  260 
  261 /*
  262  * Mutexes
  263  */
  264 typedef struct kmutex {
  265         pthread_mutex_t         m_lock;
  266         pthread_t               m_owner;
  267 } kmutex_t;
  268 
  269 #define MUTEX_DEFAULT           0
  270 #define MUTEX_NOLOCKDEP         MUTEX_DEFAULT
  271 #define MUTEX_HELD(mp)          pthread_equal((mp)->m_owner, pthread_self())
  272 #define MUTEX_NOT_HELD(mp)      !MUTEX_HELD(mp)
  273 
  274 extern void mutex_init(kmutex_t *mp, char *name, int type, void *cookie);
  275 extern void mutex_destroy(kmutex_t *mp);
  276 extern void mutex_enter(kmutex_t *mp);
  277 extern void mutex_exit(kmutex_t *mp);
  278 extern int mutex_tryenter(kmutex_t *mp);
  279 
  280 #define NESTED_SINGLE 1
  281 #define mutex_enter_nested(mp, class) mutex_enter(mp)
  282 /*
  283  * RW locks
  284  */
  285 typedef struct krwlock {
  286         pthread_rwlock_t        rw_lock;
  287         pthread_t               rw_owner;
  288         uint_t                  rw_readers;
  289 } krwlock_t;
  290 
  291 typedef int krw_t;
  292 
  293 #define RW_READER               0
  294 #define RW_WRITER               1
  295 #define RW_DEFAULT              RW_READER
  296 #define RW_NOLOCKDEP            RW_READER
  297 
  298 #define RW_READ_HELD(rw)        ((rw)->rw_readers > 0)
  299 #define RW_WRITE_HELD(rw)       pthread_equal((rw)->rw_owner, pthread_self())
  300 #define RW_LOCK_HELD(rw)        (RW_READ_HELD(rw) || RW_WRITE_HELD(rw))
  301 
  302 extern void rw_init(krwlock_t *rwlp, char *name, int type, void *arg);
  303 extern void rw_destroy(krwlock_t *rwlp);
  304 extern void rw_enter(krwlock_t *rwlp, krw_t rw);
  305 extern int rw_tryenter(krwlock_t *rwlp, krw_t rw);
  306 extern int rw_tryupgrade(krwlock_t *rwlp);
  307 extern void rw_exit(krwlock_t *rwlp);
  308 #define rw_downgrade(rwlp) do { } while (0)
  309 
  310 /*
  311  * Credentials
  312  */
  313 extern uid_t crgetuid(cred_t *cr);
  314 extern uid_t crgetruid(cred_t *cr);
  315 extern gid_t crgetgid(cred_t *cr);
  316 extern int crgetngroups(cred_t *cr);
  317 extern gid_t *crgetgroups(cred_t *cr);
  318 
  319 /*
  320  * Condition variables
  321  */
  322 typedef pthread_cond_t          kcondvar_t;
  323 
  324 #define CV_DEFAULT              0
  325 #define CALLOUT_FLAG_ABSOLUTE   0x2
  326 
  327 extern void cv_init(kcondvar_t *cv, char *name, int type, void *arg);
  328 extern void cv_destroy(kcondvar_t *cv);
  329 extern void cv_wait(kcondvar_t *cv, kmutex_t *mp);
  330 extern int cv_wait_sig(kcondvar_t *cv, kmutex_t *mp);
  331 extern int cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime);
  332 extern int cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t tim,
  333     hrtime_t res, int flag);
  334 extern void cv_signal(kcondvar_t *cv);
  335 extern void cv_broadcast(kcondvar_t *cv);
  336 
  337 #define cv_timedwait_io(cv, mp, at)             cv_timedwait(cv, mp, at)
  338 #define cv_timedwait_idle(cv, mp, at)           cv_timedwait(cv, mp, at)
  339 #define cv_timedwait_sig(cv, mp, at)            cv_timedwait(cv, mp, at)
  340 #define cv_wait_io(cv, mp)                      cv_wait(cv, mp)
  341 #define cv_wait_idle(cv, mp)                    cv_wait(cv, mp)
  342 #define cv_wait_io_sig(cv, mp)                  cv_wait_sig(cv, mp)
  343 #define cv_timedwait_sig_hires(cv, mp, t, r, f) \
  344         cv_timedwait_hires(cv, mp, t, r, f)
  345 #define cv_timedwait_idle_hires(cv, mp, t, r, f) \
  346         cv_timedwait_hires(cv, mp, t, r, f)
  347 
  348 /*
  349  * Thread-specific data
  350  */
  351 #define tsd_get(k) pthread_getspecific(k)
  352 #define tsd_set(k, v) pthread_setspecific(k, v)
  353 #define tsd_create(kp, d) pthread_key_create((pthread_key_t *)kp, d)
  354 #define tsd_destroy(kp) /* nothing */
  355 #ifdef __FreeBSD__
  356 typedef off_t loff_t;
  357 #endif
  358 
  359 /*
  360  * kstat creation, installation and deletion
  361  */
  362 extern kstat_t *kstat_create(const char *, int,
  363     const char *, const char *, uchar_t, ulong_t, uchar_t);
  364 extern void kstat_install(kstat_t *);
  365 extern void kstat_delete(kstat_t *);
  366 extern void kstat_set_raw_ops(kstat_t *ksp,
  367     int (*headers)(char *buf, size_t size),
  368     int (*data)(char *buf, size_t size, void *data),
  369     void *(*addr)(kstat_t *ksp, loff_t index));
  370 
  371 /*
  372  * procfs list manipulation
  373  */
  374 
  375 typedef struct procfs_list {
  376         void            *pl_private;
  377         kmutex_t        pl_lock;
  378         list_t          pl_list;
  379         uint64_t        pl_next_id;
  380         size_t          pl_node_offset;
  381 } procfs_list_t;
  382 
  383 #ifndef __cplusplus
  384 struct seq_file { };
  385 void seq_printf(struct seq_file *m, const char *fmt, ...);
  386 
  387 typedef struct procfs_list_node {
  388         list_node_t     pln_link;
  389         uint64_t        pln_id;
  390 } procfs_list_node_t;
  391 
  392 void procfs_list_install(const char *module,
  393     const char *submodule,
  394     const char *name,
  395     mode_t mode,
  396     procfs_list_t *procfs_list,
  397     int (*show)(struct seq_file *f, void *p),
  398     int (*show_header)(struct seq_file *f),
  399     int (*clear)(procfs_list_t *procfs_list),
  400     size_t procfs_list_node_off);
  401 void procfs_list_uninstall(procfs_list_t *procfs_list);
  402 void procfs_list_destroy(procfs_list_t *procfs_list);
  403 void procfs_list_add(procfs_list_t *procfs_list, void *p);
  404 #endif
  405 
  406 /*
  407  * Kernel memory
  408  */
  409 #define KM_SLEEP                UMEM_NOFAIL
  410 #define KM_PUSHPAGE             KM_SLEEP
  411 #define KM_NOSLEEP              UMEM_DEFAULT
  412 #define KM_NORMALPRI            0       /* not needed with UMEM_DEFAULT */
  413 #define KMC_NODEBUG             UMC_NODEBUG
  414 #define KMC_KVMEM               0x0
  415 #define kmem_alloc(_s, _f)      umem_alloc(_s, _f)
  416 #define kmem_zalloc(_s, _f)     umem_zalloc(_s, _f)
  417 #define kmem_free(_b, _s)       umem_free(_b, _s)
  418 #define vmem_alloc(_s, _f)      kmem_alloc(_s, _f)
  419 #define vmem_zalloc(_s, _f)     kmem_zalloc(_s, _f)
  420 #define vmem_free(_b, _s)       kmem_free(_b, _s)
  421 #define kmem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i) \
  422         umem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i)
  423 #define kmem_cache_destroy(_c)  umem_cache_destroy(_c)
  424 #define kmem_cache_alloc(_c, _f) umem_cache_alloc(_c, _f)
  425 #define kmem_cache_free(_c, _b) umem_cache_free(_c, _b)
  426 #define kmem_debugging()        0
  427 #define kmem_cache_reap_now(_c) umem_cache_reap_now(_c);
  428 #define kmem_cache_set_move(_c, _cb)    /* nothing */
  429 #define POINTER_INVALIDATE(_pp)         /* nothing */
  430 #define POINTER_IS_VALID(_p)    0
  431 
  432 typedef umem_cache_t kmem_cache_t;
  433 
  434 typedef enum kmem_cbrc {
  435         KMEM_CBRC_YES,
  436         KMEM_CBRC_NO,
  437         KMEM_CBRC_LATER,
  438         KMEM_CBRC_DONT_NEED,
  439         KMEM_CBRC_DONT_KNOW
  440 } kmem_cbrc_t;
  441 
  442 /*
  443  * Task queues
  444  */
  445 
  446 #define TASKQ_NAMELEN   31
  447 
  448 typedef uintptr_t taskqid_t;
  449 typedef void (task_func_t)(void *);
  450 
  451 typedef struct taskq_ent {
  452         struct taskq_ent        *tqent_next;
  453         struct taskq_ent        *tqent_prev;
  454         task_func_t             *tqent_func;
  455         void                    *tqent_arg;
  456         uintptr_t               tqent_flags;
  457 } taskq_ent_t;
  458 
  459 typedef struct taskq {
  460         char            tq_name[TASKQ_NAMELEN + 1];
  461         kmutex_t        tq_lock;
  462         krwlock_t       tq_threadlock;
  463         kcondvar_t      tq_dispatch_cv;
  464         kcondvar_t      tq_wait_cv;
  465         kthread_t       **tq_threadlist;
  466         int             tq_flags;
  467         int             tq_active;
  468         int             tq_nthreads;
  469         int             tq_nalloc;
  470         int             tq_minalloc;
  471         int             tq_maxalloc;
  472         kcondvar_t      tq_maxalloc_cv;
  473         int             tq_maxalloc_wait;
  474         taskq_ent_t     *tq_freelist;
  475         taskq_ent_t     tq_task;
  476 } taskq_t;
  477 
  478 #define TQENT_FLAG_PREALLOC     0x1     /* taskq_dispatch_ent used */
  479 
  480 #define TASKQ_PREPOPULATE       0x0001
  481 #define TASKQ_CPR_SAFE          0x0002  /* Use CPR safe protocol */
  482 #define TASKQ_DYNAMIC           0x0004  /* Use dynamic thread scheduling */
  483 #define TASKQ_THREADS_CPU_PCT   0x0008  /* Scale # threads by # cpus */
  484 #define TASKQ_DC_BATCH          0x0010  /* Mark threads as batch */
  485 
  486 #define TQ_SLEEP        KM_SLEEP        /* Can block for memory */
  487 #define TQ_NOSLEEP      KM_NOSLEEP      /* cannot block for memory; may fail */
  488 #define TQ_NOQUEUE      0x02            /* Do not enqueue if can't dispatch */
  489 #define TQ_FRONT        0x08            /* Queue in front */
  490 
  491 #define TASKQID_INVALID         ((taskqid_t)0)
  492 
  493 extern taskq_t *system_taskq;
  494 extern taskq_t *system_delay_taskq;
  495 
  496 extern taskq_t  *taskq_create(const char *, int, pri_t, int, int, uint_t);
  497 #define taskq_create_proc(a, b, c, d, e, p, f) \
  498             (taskq_create(a, b, c, d, e, f))
  499 #define taskq_create_sysdc(a, b, d, e, p, dc, f) \
  500             ((void) sizeof (dc), taskq_create(a, b, maxclsyspri, d, e, f))
  501 extern taskqid_t taskq_dispatch(taskq_t *, task_func_t, void *, uint_t);
  502 extern taskqid_t taskq_dispatch_delay(taskq_t *, task_func_t, void *, uint_t,
  503     clock_t);
  504 extern void     taskq_dispatch_ent(taskq_t *, task_func_t, void *, uint_t,
  505     taskq_ent_t *);
  506 extern int      taskq_empty_ent(taskq_ent_t *);
  507 extern void     taskq_init_ent(taskq_ent_t *);
  508 extern void     taskq_destroy(taskq_t *);
  509 extern void     taskq_wait(taskq_t *);
  510 extern void     taskq_wait_id(taskq_t *, taskqid_t);
  511 extern void     taskq_wait_outstanding(taskq_t *, taskqid_t);
  512 extern int      taskq_member(taskq_t *, kthread_t *);
  513 extern taskq_t  *taskq_of_curthread(void);
  514 extern int      taskq_cancel_id(taskq_t *, taskqid_t);
  515 extern void     system_taskq_init(void);
  516 extern void     system_taskq_fini(void);
  517 
  518 #define XVA_MAPSIZE     3
  519 #define XVA_MAGIC       0x78766174
  520 
  521 extern char *vn_dumpdir;
  522 #define AV_SCANSTAMP_SZ 32              /* length of anti-virus scanstamp */
  523 
  524 typedef struct xoptattr {
  525         inode_timespec_t xoa_createtime;        /* Create time of file */
  526         uint8_t         xoa_archive;
  527         uint8_t         xoa_system;
  528         uint8_t         xoa_readonly;
  529         uint8_t         xoa_hidden;
  530         uint8_t         xoa_nounlink;
  531         uint8_t         xoa_immutable;
  532         uint8_t         xoa_appendonly;
  533         uint8_t         xoa_nodump;
  534         uint8_t         xoa_settable;
  535         uint8_t         xoa_opaque;
  536         uint8_t         xoa_av_quarantined;
  537         uint8_t         xoa_av_modified;
  538         uint8_t         xoa_av_scanstamp[AV_SCANSTAMP_SZ];
  539         uint8_t         xoa_reparse;
  540         uint8_t         xoa_offline;
  541         uint8_t         xoa_sparse;
  542 } xoptattr_t;
  543 
  544 typedef struct vattr {
  545         uint_t          va_mask;        /* bit-mask of attributes */
  546         u_offset_t      va_size;        /* file size in bytes */
  547 } vattr_t;
  548 
  549 
  550 typedef struct xvattr {
  551         vattr_t         xva_vattr;      /* Embedded vattr structure */
  552         uint32_t        xva_magic;      /* Magic Number */
  553         uint32_t        xva_mapsize;    /* Size of attr bitmap (32-bit words) */
  554         uint32_t        *xva_rtnattrmapp;       /* Ptr to xva_rtnattrmap[] */
  555         uint32_t        xva_reqattrmap[XVA_MAPSIZE];    /* Requested attrs */
  556         uint32_t        xva_rtnattrmap[XVA_MAPSIZE];    /* Returned attrs */
  557         xoptattr_t      xva_xoptattrs;  /* Optional attributes */
  558 } xvattr_t;
  559 
  560 typedef struct vsecattr {
  561         uint_t          vsa_mask;       /* See below */
  562         int             vsa_aclcnt;     /* ACL entry count */
  563         void            *vsa_aclentp;   /* pointer to ACL entries */
  564         int             vsa_dfaclcnt;   /* default ACL entry count */
  565         void            *vsa_dfaclentp; /* pointer to default ACL entries */
  566         size_t          vsa_aclentsz;   /* ACE size in bytes of vsa_aclentp */
  567 } vsecattr_t;
  568 
  569 #define AT_MODE         0x00002
  570 #define AT_UID          0x00004
  571 #define AT_GID          0x00008
  572 #define AT_FSID         0x00010
  573 #define AT_NODEID       0x00020
  574 #define AT_NLINK        0x00040
  575 #define AT_SIZE         0x00080
  576 #define AT_ATIME        0x00100
  577 #define AT_MTIME        0x00200
  578 #define AT_CTIME        0x00400
  579 #define AT_RDEV         0x00800
  580 #define AT_BLKSIZE      0x01000
  581 #define AT_NBLOCKS      0x02000
  582 #define AT_SEQ          0x08000
  583 #define AT_XVATTR       0x10000
  584 
  585 #define CRCREAT         0
  586 
  587 #define F_FREESP        11
  588 #define FIGNORECASE     0x80000 /* request case-insensitive lookups */
  589 
  590 /*
  591  * Random stuff
  592  */
  593 #define ddi_get_lbolt()         (gethrtime() >> 23)
  594 #define ddi_get_lbolt64()       (gethrtime() >> 23)
  595 #define hz      119     /* frequency when using gethrtime() >> 23 for lbolt */
  596 
  597 #define ddi_time_before(a, b)           (a < b)
  598 #define ddi_time_after(a, b)            ddi_time_before(b, a)
  599 #define ddi_time_before_eq(a, b)        (!ddi_time_after(a, b))
  600 #define ddi_time_after_eq(a, b)         ddi_time_before_eq(b, a)
  601 
  602 #define ddi_time_before64(a, b)         (a < b)
  603 #define ddi_time_after64(a, b)          ddi_time_before64(b, a)
  604 #define ddi_time_before_eq64(a, b)      (!ddi_time_after64(a, b))
  605 #define ddi_time_after_eq64(a, b)       ddi_time_before_eq64(b, a)
  606 
  607 extern void delay(clock_t ticks);
  608 
  609 #define SEC_TO_TICK(sec)        ((sec) * hz)
  610 #define MSEC_TO_TICK(msec)      (howmany((hrtime_t)(msec) * hz, MILLISEC))
  611 #define USEC_TO_TICK(usec)      (howmany((hrtime_t)(usec) * hz, MICROSEC))
  612 #define NSEC_TO_TICK(nsec)      (howmany((hrtime_t)(nsec) * hz, NANOSEC))
  613 
  614 #define max_ncpus       64
  615 #define boot_ncpus      (sysconf(_SC_NPROCESSORS_ONLN))
  616 
  617 /*
  618  * Process priorities as defined by setpriority(2) and getpriority(2).
  619  */
  620 #define minclsyspri     19
  621 #define maxclsyspri     -20
  622 #define defclsyspri     0
  623 
  624 #define CPU_SEQID       ((uintptr_t)pthread_self() & (max_ncpus - 1))
  625 #define CPU_SEQID_UNSTABLE      CPU_SEQID
  626 
  627 #define kcred           NULL
  628 #define CRED()          NULL
  629 
  630 #define ptob(x)         ((x) * PAGESIZE)
  631 
  632 #define NN_DIVISOR_1000 (1U << 0)
  633 #define NN_NUMBUF_SZ    (6)
  634 
  635 extern uint64_t physmem;
  636 extern const char *random_path;
  637 extern const char *urandom_path;
  638 
  639 extern int highbit64(uint64_t i);
  640 extern int lowbit64(uint64_t i);
  641 extern int random_get_bytes(uint8_t *ptr, size_t len);
  642 extern int random_get_pseudo_bytes(uint8_t *ptr, size_t len);
  643 
  644 static __inline__ uint32_t
  645 random_in_range(uint32_t range)
  646 {
  647         uint32_t r;
  648 
  649         ASSERT(range != 0);
  650 
  651         if (range == 1)
  652                 return (0);
  653 
  654         (void) random_get_pseudo_bytes((uint8_t *)&r, sizeof (r));
  655 
  656         return (r % range);
  657 }
  658 
  659 extern void kernel_init(int mode);
  660 extern void kernel_fini(void);
  661 extern void random_init(void);
  662 extern void random_fini(void);
  663 
  664 struct spa;
  665 extern void show_pool_stats(struct spa *);
  666 extern int set_global_var(char const *arg);
  667 
  668 typedef struct callb_cpr {
  669         kmutex_t        *cc_lockp;
  670 } callb_cpr_t;
  671 
  672 #define CALLB_CPR_INIT(cp, lockp, func, name)   {               \
  673         (cp)->cc_lockp = lockp;                                 \
  674 }
  675 
  676 #define CALLB_CPR_SAFE_BEGIN(cp) {                              \
  677         ASSERT(MUTEX_HELD((cp)->cc_lockp));                     \
  678 }
  679 
  680 #define CALLB_CPR_SAFE_END(cp, lockp) {                         \
  681         ASSERT(MUTEX_HELD((cp)->cc_lockp));                     \
  682 }
  683 
  684 #define CALLB_CPR_EXIT(cp) {                                    \
  685         ASSERT(MUTEX_HELD((cp)->cc_lockp));                     \
  686         mutex_exit((cp)->cc_lockp);                             \
  687 }
  688 
  689 #define zone_dataset_visible(x, y)      (1)
  690 #define INGLOBALZONE(z)                 (1)
  691 extern uint32_t zone_get_hostid(void *zonep);
  692 
  693 extern char *kmem_vasprintf(const char *fmt, va_list adx);
  694 extern char *kmem_asprintf(const char *fmt, ...);
  695 #define kmem_strfree(str) kmem_free((str), strlen(str) + 1)
  696 #define kmem_strdup(s)  strdup(s)
  697 
  698 #ifndef __cplusplus
  699 extern int kmem_scnprintf(char *restrict str, size_t size,
  700     const char *restrict fmt, ...);
  701 #endif
  702 
  703 /*
  704  * Hostname information
  705  */
  706 extern int ddi_strtoull(const char *str, char **nptr, int base,
  707     u_longlong_t *result);
  708 
  709 typedef struct utsname  utsname_t;
  710 extern utsname_t *utsname(void);
  711 
  712 /* ZFS Boot Related stuff. */
  713 
  714 struct _buf {
  715         intptr_t        _fd;
  716 };
  717 
  718 struct bootstat {
  719         uint64_t st_size;
  720 };
  721 
  722 typedef struct ace_object {
  723         uid_t           a_who;
  724         uint32_t        a_access_mask;
  725         uint16_t        a_flags;
  726         uint16_t        a_type;
  727         uint8_t         a_obj_type[16];
  728         uint8_t         a_inherit_obj_type[16];
  729 } ace_object_t;
  730 
  731 
  732 #define ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE      0x05
  733 #define ACE_ACCESS_DENIED_OBJECT_ACE_TYPE       0x06
  734 #define ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE        0x07
  735 #define ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE        0x08
  736 
  737 extern int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr);
  738 extern int zfs_secpolicy_rename_perms(const char *from, const char *to,
  739     cred_t *cr);
  740 extern int zfs_secpolicy_destroy_perms(const char *name, cred_t *cr);
  741 extern int secpolicy_zfs(const cred_t *cr);
  742 extern int secpolicy_zfs_proc(const cred_t *cr, proc_t *proc);
  743 extern zoneid_t getzoneid(void);
  744 
  745 /* SID stuff */
  746 typedef struct ksiddomain {
  747         uint_t  kd_ref;
  748         uint_t  kd_len;
  749         char    *kd_name;
  750 } ksiddomain_t;
  751 
  752 ksiddomain_t *ksid_lookupdomain(const char *);
  753 void ksiddomain_rele(ksiddomain_t *);
  754 
  755 #define DDI_SLEEP       KM_SLEEP
  756 #define ddi_log_sysevent(_a, _b, _c, _d, _e, _f, _g) \
  757         sysevent_post_event(_c, _d, _b, "libzpool", _e, _f)
  758 
  759 #define zfs_sleep_until(wakeup)                                         \
  760         do {                                                            \
  761                 hrtime_t delta = wakeup - gethrtime();                  \
  762                 struct timespec ts;                                     \
  763                 ts.tv_sec = delta / NANOSEC;                            \
  764                 ts.tv_nsec = delta % NANOSEC;                           \
  765                 (void) nanosleep(&ts, NULL);                            \
  766         } while (0)
  767 
  768 typedef int fstrans_cookie_t;
  769 
  770 extern fstrans_cookie_t spl_fstrans_mark(void);
  771 extern void spl_fstrans_unmark(fstrans_cookie_t);
  772 extern int __spl_pf_fstrans_check(void);
  773 extern int kmem_cache_reap_active(void);
  774 
  775 
  776 /*
  777  * Kernel modules
  778  */
  779 #define __init
  780 #define __exit
  781 
  782 #endif  /* _KERNEL || _STANDALONE */
  783 
  784 #ifdef __cplusplus
  785 };
  786 #endif
  787 
  788 #endif  /* _SYS_ZFS_CONTEXT_H */

Cache object: 9b81fe1a3821b64853bc9b6bcefa72dd


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.