Illumos #3006
[zfs.git] / include / sys / zfs_context.h
index 6201214..4b34259 100644 (file)
@@ -24,6 +24,8 @@
  */
 /*
  * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
  */
 
 #ifndef _SYS_ZFS_CONTEXT_H
@@ -70,7 +72,6 @@
 #define        _SYS_RWLOCK_H
 #define        _SYS_CONDVAR_H
 #define        _SYS_SYSTM_H
-#define        _SYS_DEBUG_H
 #define        _SYS_T_LOCK_H
 #define        _SYS_VNODE_H
 #define        _SYS_VFS_H
 #include <sys/u8_textprep.h>
 #include <sys/fm/fs/zfs.h>
 #include <sys/sunddi.h>
+#include <sys/debug.h>
 
 /*
  * Stack
@@ -189,18 +191,13 @@ extern void vpanic(const char *, __va_list);
 #define        STACK_SIZE              24576   /* Solaris */
 #endif
 
-#ifdef NPTL_GUARD_WITHIN_STACK
-#define        EXTRA_GUARD_BYTES       PAGESIZE
-#else
-#define        EXTRA_GUARD_BYTES       0
-#endif
-
 /* in libzpool, p0 exists only to have its address taken */
 typedef struct proc {
        uintptr_t       this_is_never_used_dont_dereference_it;
 } proc_t;
 
 extern struct proc p0;
+#define        curproc         (&p0)
 
 typedef void (*thread_func_t)(void *);
 typedef void (*thread_func_arg_t)(void *);
@@ -218,7 +215,7 @@ typedef struct kthread {
 #define        thread_exit                     zk_thread_exit
 #define        thread_create(stk, stksize, func, arg, len, pp, state, pri)     \
        zk_thread_create(stk, stksize, (thread_func_t)func, arg,        \
-                        len, NULL, state, pri)
+                        len, NULL, state, pri, PTHREAD_CREATE_DETACHED)
 #define        thread_join(t)                  zk_thread_join(t)
 #define        newproc(f,a,cid,pri,ctp,pid)    (ENOSYS)
 
@@ -226,7 +223,7 @@ extern kthread_t *zk_thread_current(void);
 extern void zk_thread_exit(void);
 extern kthread_t *zk_thread_create(caddr_t stk, size_t  stksize,
        thread_func_t func, void *arg, size_t len,
-       proc_t *pp, int state, pri_t pri);
+       proc_t *pp, int state, pri_t pri, int detachstate);
 extern void zk_thread_join(kt_did_t tid);
 
 #define        kpreempt_disable()      ((void)0)
@@ -320,6 +317,7 @@ extern void cv_signal(kcondvar_t *cv);
 extern void cv_broadcast(kcondvar_t *cv);
 #define cv_timedwait_interruptible(cv, mp, at) cv_timedwait(cv, mp, at)
 #define cv_wait_interruptible(cv, mp)          cv_wait(cv, mp)
+#define cv_wait_io(cv, mp)                     cv_wait(cv, mp)
 
 /*
  * kstat creation, installation and deletion
@@ -388,10 +386,10 @@ typedef struct taskq_ent {
 #define        TASKQ_DYNAMIC           0x0004  /* Use dynamic thread scheduling */
 #define        TASKQ_THREADS_CPU_PCT   0x0008  /* Scale # threads by # cpus */
 #define        TASKQ_DC_BATCH          0x0010  /* Mark threads as batch */
-#define        TASKQ_NORECLAIM         0x0020  /* Disable direct memory reclaim */
 
 #define        TQ_SLEEP        KM_SLEEP        /* Can block for memory */
 #define        TQ_NOSLEEP      KM_NOSLEEP      /* cannot block for memory; may fail */
+#define        TQ_PUSHPAGE     KM_PUSHPAGE     /* Cannot perform I/O */
 #define        TQ_NOQUEUE      0x02            /* Do not enqueue if can't dispatch */
 #define        TQ_FRONT        0x08            /* Queue in front */
 
@@ -403,13 +401,17 @@ extern taskq_t    *taskq_create(const char *, int, pri_t, int, int, uint_t);
 #define        taskq_create_sysdc(a, b, d, e, p, dc, f) \
            (taskq_create(a, b, maxclsyspri, d, e, f))
 extern taskqid_t taskq_dispatch(taskq_t *, task_func_t, void *, uint_t);
+extern taskqid_t taskq_dispatch_delay(taskq_t *, task_func_t, void *, uint_t,
+    clock_t);
 extern void    taskq_dispatch_ent(taskq_t *, task_func_t, void *, uint_t,
     taskq_ent_t *);
 extern int     taskq_empty_ent(taskq_ent_t *);
 extern void    taskq_init_ent(taskq_ent_t *);
 extern void    taskq_destroy(taskq_t *);
 extern void    taskq_wait(taskq_t *);
+extern void    taskq_wait_id(taskq_t *, taskqid_t);
 extern int     taskq_member(taskq_t *, kthread_t *);
+extern int     taskq_cancel_id(taskq_t *, taskqid_t);
 extern void    system_taskq_init(void);
 extern void    system_taskq_fini(void);
 
@@ -493,7 +495,7 @@ typedef struct vsecattr {
 
 extern int fop_getattr(vnode_t *vp, vattr_t *vap);
 
-#define        VOP_CLOSE(vp, f, c, o, cr, ct)  0
+#define        VOP_CLOSE(vp, f, c, o, cr, ct)  vn_close(vp)
 #define        VOP_PUTPAGE(vp, of, sz, fl, cr, ct)     0
 #define        VOP_GETATTR(vp, vap, fl, cr, ct)  fop_getattr((vp), (vap));
 
@@ -526,6 +528,11 @@ extern vnode_t *rootdir;
 
 extern void delay(clock_t ticks);
 
+#define        SEC_TO_TICK(sec)        ((sec) * hz)
+#define        MSEC_TO_TICK(msec)      ((msec) / (MILLISEC / hz))
+#define        USEC_TO_TICK(usec)      ((usec) / (MICROSEC / hz))
+#define        NSEC_TO_TICK(usec)      ((usec) / (NANOSEC / hz))
+
 #define        gethrestime_sec() time(NULL)
 #define        gethrestime(t) \
        do {\