Print this page
8115 parallel zfs mount

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libzpool/common/sys/zfs_context.h
          +++ new/usr/src/lib/libzpool/common/sys/zfs_context.h
↓ open down ↓ 15 lines elided ↑ open up ↑
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  23   23   * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  24   24   * Copyright (c) 2012, 2016 by Delphix. All rights reserved.
  25   25   * Copyright (c) 2012, Joyent, Inc. All rights reserved.
       26 + * Copyright 2017 RackTop Systems.
  26   27   */
  27   28  
  28   29  #ifndef _SYS_ZFS_CONTEXT_H
  29   30  #define _SYS_ZFS_CONTEXT_H
  30   31  
  31   32  #ifdef  __cplusplus
  32   33  extern "C" {
  33   34  #endif
  34   35  
  35      -#define _SYS_MUTEX_H
  36      -#define _SYS_RWLOCK_H
  37      -#define _SYS_CONDVAR_H
  38      -#define _SYS_SYSTM_H
  39      -#define _SYS_T_LOCK_H
       36 +#define _SYNCH_H
       37 +
  40   38  #define _SYS_VNODE_H
  41   39  #define _SYS_VFS_H
  42      -#define _SYS_SUNDDI_H
  43   40  #define _SYS_CALLB_H
  44   41  
  45   42  #include <stdio.h>
  46   43  #include <stdlib.h>
  47   44  #include <stddef.h>
  48   45  #include <stdarg.h>
  49   46  #include <fcntl.h>
  50   47  #include <unistd.h>
  51   48  #include <errno.h>
  52   49  #include <string.h>
  53   50  #include <strings.h>
  54      -#include <synch.h>
  55   51  #include <thread.h>
  56   52  #include <assert.h>
  57   53  #include <alloca.h>
  58   54  #include <umem.h>
  59   55  #include <limits.h>
  60   56  #include <atomic.h>
  61   57  #include <dirent.h>
  62   58  #include <time.h>
  63   59  #include <procfs.h>
  64   60  #include <pthread.h>
↓ open down ↓ 8 lines elided ↑ open up ↑
  73   69  #include <sys/resource.h>
  74   70  #include <sys/byteorder.h>
  75   71  #include <sys/list.h>
  76   72  #include <sys/uio.h>
  77   73  #include <sys/zfs_debug.h>
  78   74  #include <sys/sdt.h>
  79   75  #include <sys/kstat.h>
  80   76  #include <sys/u8_textprep.h>
  81   77  #include <sys/sysevent/eventdefs.h>
  82   78  #include <sys/sysevent/dev.h>
  83      -#include <sys/sunddi.h>
  84   79  #include <sys/debug.h>
       80 +#include <sys/taskq.h>
       81 +#include <sys/taskq_impl.h>
       82 +#include <sys/mutex.h>
       83 +#include <sys/proc.h>
       84 +#include <sys/condvar.h>
       85 +#include <sys/cmn_err.h>
       86 +#include <sys/kmem.h>
       87 +#include <sys/systm.h>
       88 +#include <sys/random.h>
       89 +#include <sys/buf.h>
       90 +#include <sys/sid.h>
       91 +#include <sys/acl.h>
       92 +#include <sys/bitmap.h>
       93 +#include <sys/systeminfo.h>
       94 +#include <sys/cpuvar.h>
       95 +#include <sys/pset.h>
       96 +#include <sys/kobj.h>
       97 +#include <sys/fm/util.h>
  85   98  #include "zfs.h"
  86   99  
  87  100  /*
  88      - * Debugging
  89      - */
  90      -
  91      -/*
  92      - * Note that we are not using the debugging levels.
  93      - */
  94      -
  95      -#define CE_CONT         0       /* continuation         */
  96      -#define CE_NOTE         1       /* notice               */
  97      -#define CE_WARN         2       /* warning              */
  98      -#define CE_PANIC        3       /* panic                */
  99      -#define CE_IGNORE       4       /* print nothing        */
 100      -
 101      -/*
 102  101   * ZFS debugging
 103  102   */
 104  103  
 105  104  #ifdef ZFS_DEBUG
 106  105  extern void dprintf_setup(int *argc, char **argv);
 107  106  #endif /* ZFS_DEBUG */
 108  107  
 109      -extern void cmn_err(int, const char *, ...);
 110      -extern void vcmn_err(int, const char *, __va_list);
 111      -extern void panic(const char *, ...)  __NORETURN;
 112      -extern void vpanic(const char *, __va_list)  __NORETURN;
 113      -
 114      -#define fm_panic        panic
 115      -
 116      -extern int aok;
 117      -
 118  108  /*
 119  109   * DTrace SDT probes have different signatures in userland than they do in
 120  110   * the kernel.  If they're being used in kernel code, re-define them out of
 121  111   * existence for their counterparts in libzpool.
 122  112   *
 123  113   * Here's an example of how to use the set-error probes in userland:
 124  114   * zfs$target:::set-error /arg0 == EBUSY/ {stack();}
 125  115   *
 126  116   * Here's an example of how to use DTRACE_PROBE probes in userland:
 127  117   * If there is a probe declared as follows:
↓ open down ↓ 39 lines elided ↑ open up ↑
 167  157   * additional code.  For example, "return (EINVAL);" becomes
 168  158   * "return (SET_ERROR(EINVAL));".  Note that the argument will be evaluated
 169  159   * twice, so it should not have side effects (e.g. something like:
 170  160   * "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice).
 171  161   */
 172  162  #define SET_ERROR(err) (ZFS_SET_ERROR(err), err)
 173  163  
 174  164  /*
 175  165   * Threads
 176  166   */
 177      -#define curthread       ((void *)(uintptr_t)thr_self())
 178      -
 179  167  #define kpreempt(x)     yield()
 180      -
 181      -typedef struct kthread kthread_t;
 182      -
 183      -#define thread_create(stk, stksize, func, arg, len, pp, state, pri)     \
 184      -        zk_thread_create(func, arg, len)
 185      -#define thread_exit() thr_exit(NULL)
 186      -#define thread_join(t)  panic("libzpool cannot join threads")
 187      -
 188  168  #define newproc(f, a, cid, pri, ctp, pid)       (ENOSYS)
 189  169  
 190      -/* in libzpool, p0 exists only to have its address taken */
 191      -struct proc {
 192      -        uintptr_t       this_is_never_used_dont_dereference_it;
 193      -};
 194      -
 195      -extern struct proc p0;
 196      -#define curproc         (&p0)
 197      -
 198      -#define PS_NONE         -1
 199      -
 200      -extern kthread_t *zk_thread_create(void (*func)(void*), void *arg,
 201      -    uint64_t len);
 202      -
 203      -#define issig(why)      (FALSE)
 204      -#define ISSIG(thr, why) (FALSE)
 205      -
 206  170  /*
 207      - * Mutexes
      171 + * vnodes
 208  172   */
 209      -typedef struct kmutex {
 210      -        void            *m_owner;
 211      -        boolean_t       initialized;
 212      -        mutex_t         m_lock;
 213      -} kmutex_t;
 214      -
 215      -#define MUTEX_DEFAULT   USYNC_THREAD
 216      -#undef  MUTEX_HELD
 217      -#undef  MUTEX_NOT_HELD
 218      -#define MUTEX_HELD(m) _mutex_held(&(m)->m_lock)
 219      -#define MUTEX_NOT_HELD(m) (!MUTEX_HELD(m))
 220      -
 221      -/*
 222      - * Argh -- we have to get cheesy here because the kernel and userland
 223      - * have different signatures for the same routine.
 224      - */
 225      -extern int _mutex_init(mutex_t *mp, int type, void *arg);
 226      -extern int _mutex_destroy(mutex_t *mp);
 227      -
 228      -#define mutex_init(mp, b, c, d)         zmutex_init((kmutex_t *)(mp))
 229      -#define mutex_destroy(mp)               zmutex_destroy((kmutex_t *)(mp))
 230      -#define mutex_enter(mp)                 zmutex_enter(mp)
 231      -#define mutex_exit(mp)                  zmutex_exit(mp)
 232      -
 233      -extern void zmutex_init(kmutex_t *mp);
 234      -extern void zmutex_destroy(kmutex_t *mp);
 235      -extern void zmutex_enter(kmutex_t *mp);
 236      -extern void zmutex_exit(kmutex_t *mp);
 237      -extern int mutex_tryenter(kmutex_t *mp);
 238      -extern void *mutex_owner(kmutex_t *mp);
 239      -
 240      -/*
 241      - * RW locks
 242      - */
 243      -typedef struct krwlock {
 244      -        void            *rw_owner;
 245      -        boolean_t       initialized;
 246      -        rwlock_t        rw_lock;
 247      -} krwlock_t;
 248      -
 249      -typedef int krw_t;
 250      -
 251      -#define RW_READER       0
 252      -#define RW_WRITER       1
 253      -#define RW_DEFAULT      USYNC_THREAD
 254      -
 255      -#undef RW_READ_HELD
 256      -#define RW_READ_HELD(x)         _rw_read_held(&(x)->rw_lock)
 257      -
 258      -#undef RW_WRITE_HELD
 259      -#define RW_WRITE_HELD(x)        _rw_write_held(&(x)->rw_lock)
 260      -
 261      -#undef RW_LOCK_HELD
 262      -#define RW_LOCK_HELD(x)         (RW_READ_HELD(x) || RW_WRITE_HELD(x))
 263      -
 264      -extern void rw_init(krwlock_t *rwlp, char *name, int type, void *arg);
 265      -extern void rw_destroy(krwlock_t *rwlp);
 266      -extern void rw_enter(krwlock_t *rwlp, krw_t rw);
 267      -extern int rw_tryenter(krwlock_t *rwlp, krw_t rw);
 268      -extern int rw_tryupgrade(krwlock_t *rwlp);
 269      -extern void rw_exit(krwlock_t *rwlp);
 270      -#define rw_downgrade(rwlp) do { } while (0)
 271      -
 272      -extern uid_t crgetuid(cred_t *cr);
 273      -extern uid_t crgetruid(cred_t *cr);
 274      -extern gid_t crgetgid(cred_t *cr);
 275      -extern int crgetngroups(cred_t *cr);
 276      -extern gid_t *crgetgroups(cred_t *cr);
 277      -
 278      -/*
 279      - * Condition variables
 280      - */
 281      -typedef cond_t kcondvar_t;
 282      -
 283      -#define CV_DEFAULT      USYNC_THREAD
 284      -#define CALLOUT_FLAG_ABSOLUTE   0x2
 285      -
 286      -extern void cv_init(kcondvar_t *cv, char *name, int type, void *arg);
 287      -extern void cv_destroy(kcondvar_t *cv);
 288      -extern void cv_wait(kcondvar_t *cv, kmutex_t *mp);
 289      -extern clock_t cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime);
 290      -extern clock_t cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t tim,
 291      -    hrtime_t res, int flag);
 292      -extern void cv_signal(kcondvar_t *cv);
 293      -extern void cv_broadcast(kcondvar_t *cv);
 294      -
 295      -/*
 296      - * Thread-specific data
 297      - */
 298      -#define tsd_get(k) pthread_getspecific(k)
 299      -#define tsd_set(k, v) pthread_setspecific(k, v)
 300      -#define tsd_create(kp, d) pthread_key_create(kp, d)
 301      -#define tsd_destroy(kp) /* nothing */
 302      -
 303      -/*
 304      - * kstat creation, installation and deletion
 305      - */
 306      -extern kstat_t *kstat_create(const char *, int,
 307      -    const char *, const char *, uchar_t, ulong_t, uchar_t);
 308      -extern void kstat_named_init(kstat_named_t *, const char *, uchar_t);
 309      -extern void kstat_install(kstat_t *);
 310      -extern void kstat_delete(kstat_t *);
 311      -extern void kstat_waitq_enter(kstat_io_t *);
 312      -extern void kstat_waitq_exit(kstat_io_t *);
 313      -extern void kstat_runq_enter(kstat_io_t *);
 314      -extern void kstat_runq_exit(kstat_io_t *);
 315      -extern void kstat_waitq_to_runq(kstat_io_t *);
 316      -extern void kstat_runq_back_to_waitq(kstat_io_t *);
 317      -
 318      -/*
 319      - * Kernel memory
 320      - */
 321      -#define KM_SLEEP                UMEM_NOFAIL
 322      -#define KM_PUSHPAGE             KM_SLEEP
 323      -#define KM_NOSLEEP              UMEM_DEFAULT
 324      -#define KM_NORMALPRI            0       /* not needed with UMEM_DEFAULT */
 325      -#define KMC_NODEBUG             UMC_NODEBUG
 326      -#define KMC_NOTOUCH             0       /* not needed for userland caches */
 327      -#define kmem_alloc(_s, _f)      umem_alloc(_s, _f)
 328      -#define kmem_zalloc(_s, _f)     umem_zalloc(_s, _f)
 329      -#define kmem_free(_b, _s)       umem_free(_b, _s)
 330      -#define kmem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i) \
 331      -        umem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i)
 332      -#define kmem_cache_destroy(_c)  umem_cache_destroy(_c)
 333      -#define kmem_cache_alloc(_c, _f) umem_cache_alloc(_c, _f)
 334      -#define kmem_cache_free(_c, _b) umem_cache_free(_c, _b)
 335      -#define kmem_debugging()        0
 336      -#define kmem_cache_reap_now(_c)         /* nothing */
 337      -#define kmem_cache_set_move(_c, _cb)    /* nothing */
 338      -#define vmem_qcache_reap(_v)            /* nothing */
 339      -#define POINTER_INVALIDATE(_pp)         /* nothing */
 340      -#define POINTER_IS_VALID(_p)    0
 341      -
 342      -extern vmem_t *zio_arena;
 343      -
 344      -typedef umem_cache_t kmem_cache_t;
 345      -
 346      -typedef enum kmem_cbrc {
 347      -        KMEM_CBRC_YES,
 348      -        KMEM_CBRC_NO,
 349      -        KMEM_CBRC_LATER,
 350      -        KMEM_CBRC_DONT_NEED,
 351      -        KMEM_CBRC_DONT_KNOW
 352      -} kmem_cbrc_t;
 353      -
 354      -/*
 355      - * Task queues
 356      - */
 357      -typedef struct taskq taskq_t;
 358      -typedef uintptr_t taskqid_t;
 359      -typedef void (task_func_t)(void *);
 360      -
 361      -typedef struct taskq_ent {
 362      -        struct taskq_ent        *tqent_next;
 363      -        struct taskq_ent        *tqent_prev;
 364      -        task_func_t             *tqent_func;
 365      -        void                    *tqent_arg;
 366      -        uintptr_t               tqent_flags;
 367      -} taskq_ent_t;
 368      -
 369      -#define TQENT_FLAG_PREALLOC     0x1     /* taskq_dispatch_ent used */
 370      -
 371      -#define TASKQ_PREPOPULATE       0x0001
 372      -#define TASKQ_CPR_SAFE          0x0002  /* Use CPR safe protocol */
 373      -#define TASKQ_DYNAMIC           0x0004  /* Use dynamic thread scheduling */
 374      -#define TASKQ_THREADS_CPU_PCT   0x0008  /* Scale # threads by # cpus */
 375      -#define TASKQ_DC_BATCH          0x0010  /* Mark threads as batch */
 376      -
 377      -#define TQ_SLEEP        KM_SLEEP        /* Can block for memory */
 378      -#define TQ_NOSLEEP      KM_NOSLEEP      /* cannot block for memory; may fail */
 379      -#define TQ_NOQUEUE      0x02            /* Do not enqueue if can't dispatch */
 380      -#define TQ_FRONT        0x08            /* Queue in front */
 381      -
 382      -
 383      -extern taskq_t *system_taskq;
 384      -
 385      -extern taskq_t  *taskq_create(const char *, int, pri_t, int, int, uint_t);
 386      -#define taskq_create_proc(a, b, c, d, e, p, f) \
 387      -            (taskq_create(a, b, c, d, e, f))
 388      -#define taskq_create_sysdc(a, b, d, e, p, dc, f) \
 389      -            (taskq_create(a, b, maxclsyspri, d, e, f))
 390      -extern taskqid_t taskq_dispatch(taskq_t *, task_func_t, void *, uint_t);
 391      -extern void     taskq_dispatch_ent(taskq_t *, task_func_t, void *, uint_t,
 392      -    taskq_ent_t *);
 393      -extern void     taskq_destroy(taskq_t *);
 394      -extern void     taskq_wait(taskq_t *);
 395      -extern int      taskq_member(taskq_t *, void *);
 396      -extern void     system_taskq_init(void);
 397      -extern void     system_taskq_fini(void);
 398      -
 399  173  #define XVA_MAPSIZE     3
 400  174  #define XVA_MAGIC       0x78766174
 401  175  
 402      -/*
 403      - * vnodes
 404      - */
 405  176  typedef struct vnode {
 406  177          uint64_t        v_size;
 407  178          int             v_fd;
 408  179          char            *v_path;
 409  180          int             v_dump_fd;
 410  181  } vnode_t;
 411  182  
 412  183  extern char *vn_dumpdir;
 413  184  #define AV_SCANSTAMP_SZ 32              /* length of anti-virus scanstamp */
 414  185  
↓ open down ↓ 79 lines elided ↑ open up ↑
 494  265      offset_t offset, int x1, int x2, rlim64_t x3, void *x4, ssize_t *residp);
 495  266  extern void vn_close(vnode_t *vp);
 496  267  
 497  268  #define vn_remove(path, x1, x2)         remove(path)
 498  269  #define vn_rename(from, to, seg)        rename((from), (to))
 499  270  #define vn_is_readonly(vp)              B_FALSE
 500  271  
 501  272  extern vnode_t *rootdir;
 502  273  
 503  274  #include <sys/file.h>           /* for FREAD, FWRITE, etc */
      275 +#include <sys/sunddi.h>         /* for ddi_strtoul, ddi_strtoull, etc */
      276 +#include <sys/cyclic.h>         /* for cyclic_add, cyclic remove, etc */
      277 +#include <vm/seg_kmem.h>        /* for zio_arena */
 504  278  
 505  279  /*
 506  280   * Random stuff
 507  281   */
 508      -#define ddi_get_lbolt()         (gethrtime() >> 23)
 509      -#define ddi_get_lbolt64()       (gethrtime() >> 23)
 510      -#define hz      119     /* frequency when using gethrtime() >> 23 for lbolt */
 511      -
 512      -extern void delay(clock_t ticks);
 513      -
 514      -#define SEC_TO_TICK(sec)        ((sec) * hz)
 515      -#define NSEC_TO_TICK(usec)      ((usec) / (NANOSEC / hz))
 516      -
 517      -#define gethrestime_sec() time(NULL)
 518      -#define gethrestime(t) \
 519      -        do {\
 520      -                (t)->tv_sec = gethrestime_sec();\
 521      -                (t)->tv_nsec = 0;\
 522      -        } while (0);
 523      -
 524  282  #define max_ncpus       64
 525  283  #define boot_ncpus      (sysconf(_SC_NPROCESSORS_ONLN))
 526  284  
 527  285  #define minclsyspri     60
 528  286  #define maxclsyspri     99
 529  287  
 530  288  #define CPU_SEQID       (thr_self() & (max_ncpus - 1))
 531  289  
 532      -#define kcred           NULL
 533      -#define CRED()          NULL
 534      -
 535      -#define ptob(x)         ((x) * PAGESIZE)
 536      -
 537      -extern uint64_t physmem;
 538      -
 539      -extern int highbit64(uint64_t i);
 540      -extern int random_get_bytes(uint8_t *ptr, size_t len);
 541      -extern int random_get_pseudo_bytes(uint8_t *ptr, size_t len);
 542      -
 543  290  extern void kernel_init(int);
 544  291  extern void kernel_fini(void);
 545  292  
 546  293  struct spa;
 547      -extern void nicenum(uint64_t num, char *buf, size_t);
 548  294  extern void show_pool_stats(struct spa *);
 549  295  extern int set_global_var(char *arg);
 550  296  
 551  297  typedef struct callb_cpr {
 552  298          kmutex_t        *cc_lockp;
 553  299  } callb_cpr_t;
 554  300  
 555  301  #define CALLB_CPR_INIT(cp, lockp, func, name)   {               \
 556  302          (cp)->cc_lockp = lockp;                                 \
 557  303  }
↓ open down ↓ 7 lines elided ↑ open up ↑
 565  311  }
 566  312  
 567  313  #define CALLB_CPR_EXIT(cp) {                                    \
 568  314          ASSERT(MUTEX_HELD((cp)->cc_lockp));                     \
 569  315          mutex_exit((cp)->cc_lockp);                             \
 570  316  }
 571  317  
 572  318  #define zone_dataset_visible(x, y)      (1)
 573  319  #define INGLOBALZONE(z)                 (1)
 574  320  
 575      -extern char *kmem_asprintf(const char *fmt, ...);
 576      -#define strfree(str) kmem_free((str), strlen(str) + 1)
 577      -
 578      -/*
 579      - * Hostname information
 580      - */
 581      -extern char hw_serial[];        /* for userland-emulated hostid access */
 582      -extern int ddi_strtoul(const char *str, char **nptr, int base,
 583      -    unsigned long *result);
 584      -
 585      -extern int ddi_strtoull(const char *str, char **nptr, int base,
 586      -    u_longlong_t *result);
 587      -
 588      -/* ZFS Boot Related stuff. */
 589      -
 590      -struct _buf {
 591      -        intptr_t        _fd;
 592      -};
 593      -
 594      -struct bootstat {
 595      -        uint64_t st_size;
 596      -};
 597      -
 598      -typedef struct ace_object {
 599      -        uid_t           a_who;
 600      -        uint32_t        a_access_mask;
 601      -        uint16_t        a_flags;
 602      -        uint16_t        a_type;
 603      -        uint8_t         a_obj_type[16];
 604      -        uint8_t         a_inherit_obj_type[16];
 605      -} ace_object_t;
 606      -
 607      -
 608      -#define ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE      0x05
 609      -#define ACE_ACCESS_DENIED_OBJECT_ACE_TYPE       0x06
 610      -#define ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE        0x07
 611      -#define ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE        0x08
 612      -
 613      -extern struct _buf *kobj_open_file(char *name);
 614      -extern int kobj_read_file(struct _buf *file, char *buf, unsigned size,
 615      -    unsigned off);
 616      -extern void kobj_close_file(struct _buf *file);
 617      -extern int kobj_get_filesize(struct _buf *file, uint64_t *size);
 618  321  extern int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr);
 619  322  extern int zfs_secpolicy_rename_perms(const char *from, const char *to,
 620  323      cred_t *cr);
 621  324  extern int zfs_secpolicy_destroy_perms(const char *name, cred_t *cr);
 622      -extern zoneid_t getzoneid(void);
 623  325  
 624      -/* SID stuff */
 625      -typedef struct ksiddomain {
 626      -        uint_t  kd_ref;
 627      -        uint_t  kd_len;
 628      -        char    *kd_name;
 629      -} ksiddomain_t;
 630      -
 631      -ksiddomain_t *ksid_lookupdomain(const char *);
 632      -void ksiddomain_rele(ksiddomain_t *);
 633      -
 634      -#define DDI_SLEEP       KM_SLEEP
 635  326  #define ddi_log_sysevent(_a, _b, _c, _d, _e, _f, _g) \
 636  327          sysevent_post_event(_c, _d, _b, "libzpool", _e, _f)
 637  328  
 638      -/*
 639      - * Cyclic information
 640      - */
 641      -extern kmutex_t cpu_lock;
 642      -
 643      -typedef uintptr_t cyclic_id_t;
 644      -typedef uint16_t cyc_level_t;
 645      -typedef void (*cyc_func_t)(void *);
 646      -
 647      -#define CY_LOW_LEVEL    0
 648      -#define CY_INFINITY     INT64_MAX
 649      -#define CYCLIC_NONE     ((cyclic_id_t)0)
 650      -
 651      -typedef struct cyc_time {
 652      -        hrtime_t cyt_when;
 653      -        hrtime_t cyt_interval;
 654      -} cyc_time_t;
 655      -
 656      -typedef struct cyc_handler {
 657      -        cyc_func_t cyh_func;
 658      -        void *cyh_arg;
 659      -        cyc_level_t cyh_level;
 660      -} cyc_handler_t;
 661      -
 662      -extern cyclic_id_t cyclic_add(cyc_handler_t *, cyc_time_t *);
 663      -extern void cyclic_remove(cyclic_id_t);
 664      -extern int cyclic_reprogram(cyclic_id_t, hrtime_t);
 665      -
 666      -/*
 667      - * Buf structure
 668      - */
 669      -#define B_BUSY          0x0001
 670      -#define B_DONE          0x0002
 671      -#define B_ERROR         0x0004
 672      -#define B_READ          0x0040  /* read when I/O occurs */
 673      -#define B_WRITE         0x0100  /* non-read pseudo-flag */
 674      -
 675      -typedef struct buf {
 676      -        int     b_flags;
 677      -        size_t b_bcount;
 678      -        union {
 679      -                caddr_t b_addr;
 680      -        } b_un;
 681      -
 682      -        lldaddr_t       _b_blkno;
 683      -#define b_lblkno        _b_blkno._f
 684      -        size_t  b_resid;
 685      -        size_t  b_bufsize;
 686      -        int     (*b_iodone)(struct buf *);
 687      -        int     b_error;
 688      -        void    *b_private;
 689      -} buf_t;
 690      -
 691      -extern void bioinit(buf_t *);
 692      -extern void biodone(buf_t *);
 693      -extern void bioerror(buf_t *, int);
 694      -extern int geterror(buf_t *);
 695      -
 696  329  #ifdef  __cplusplus
 697  330  }
 698  331  #endif
 699  332  
 700  333  #endif  /* _SYS_ZFS_CONTEXT_H */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX