* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _SYS_ZFS_CONTEXT_H
#include <errno.h>
#include <string.h>
#include <strings.h>
-#include <synch.h>
-#include <thread.h>
+#include <pthread.h>
#include <assert.h>
#include <alloca.h>
#include <umem.h>
#define CE_PANIC 3 /* panic */
#define CE_IGNORE 4 /* print nothing */
+extern int aok;
+
/*
* ZFS debugging
*/
/*
* Threads
*/
-#define curthread ((void *)(uintptr_t)thr_self())
-
-typedef struct kthread kthread_t;
-
-#define thread_create(stk, stksize, func, arg, len, pp, state, pri) \
- zk_thread_create(func, arg)
-#define thread_exit() thr_exit(NULL)
-#define thread_join(t) panic("libzpool cannot join threads")
+#define TS_MAGIC 0x72f158ab4261e538ull
+#define TS_RUN 0x00000002
+#ifdef __linux__
+#define STACK_SIZE 8192 /* Linux x86 and amd64 */
+#else
+#define STACK_SIZE 24576 /* Solaris */
+#endif
-#define newproc(f, a, cid, pri, ctp, pid) (ENOSYS)
+#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 */
-struct proc {
+typedef struct proc {
uintptr_t this_is_never_used_dont_dereference_it;
-};
+} proc_t;
extern struct proc p0;
-#define PS_NONE -1
+typedef void (*thread_func_t)(void *);
+typedef void (*thread_func_arg_t)(void *);
+typedef pthread_t kt_did_t;
+
+typedef struct kthread {
+ kt_did_t t_tid;
+ thread_func_t t_func;
+ void * t_arg;
+} kthread_t;
-extern kthread_t *zk_thread_create(void (*func)(), void *arg);
+#define tsd_get(key) pthread_getspecific(key)
+#define tsd_set(key, val) pthread_setspecific(key, val)
+#define curthread zk_thread_current()
+#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)
+#define thread_join(t) zk_thread_join(t)
+#define newproc(f,a,cid,pri,ctp,pid) (ENOSYS)
+
+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);
+extern void zk_thread_join(kt_did_t tid);
+
+#define PS_NONE -1
#define issig(why) (FALSE)
#define ISSIG(thr, why) (FALSE)
/*
* Mutexes
*/
+#define MTX_MAGIC 0x9522f51362a6e326ull
+#define MTX_INIT ((void *)NULL)
+#define MTX_DEST ((void *)-1UL)
+
typedef struct kmutex {
void *m_owner;
- boolean_t initialized;
- mutex_t m_lock;
+ uint64_t m_magic;
+ pthread_mutex_t m_lock;
} kmutex_t;
-#define MUTEX_DEFAULT USYNC_THREAD
-#undef MUTEX_HELD
-#define MUTEX_HELD(m) _mutex_held(&(m)->m_lock)
-
-/*
- * Argh -- we have to get cheesy here because the kernel and userland
- * have different signatures for the same routine.
- */
-extern int _mutex_init(mutex_t *mp, int type, void *arg);
-extern int _mutex_destroy(mutex_t *mp);
-
-#define mutex_init(mp, b, c, d) zmutex_init((kmutex_t *)(mp))
-#define mutex_destroy(mp) zmutex_destroy((kmutex_t *)(mp))
+#define MUTEX_DEFAULT 0
+#define MUTEX_HELD(m) ((m)->m_owner == curthread)
+#define MUTEX_NOT_HELD(m) (!MUTEX_HELD(m))
-extern void zmutex_init(kmutex_t *mp);
-extern void zmutex_destroy(kmutex_t *mp);
+extern void mutex_init(kmutex_t *mp, char *name, int type, void *cookie);
+extern void mutex_destroy(kmutex_t *mp);
extern void mutex_enter(kmutex_t *mp);
extern void mutex_exit(kmutex_t *mp);
extern int mutex_tryenter(kmutex_t *mp);
extern void *mutex_owner(kmutex_t *mp);
+extern int mutex_held(kmutex_t *mp);
/*
* RW locks
*/
+#define RW_MAGIC 0x4d31fb123648e78aull
+#define RW_INIT ((void *)NULL)
+#define RW_DEST ((void *)-1UL)
+
typedef struct krwlock {
- void *rw_owner;
- boolean_t initialized;
- rwlock_t rw_lock;
+ void *rw_owner;
+ void *rw_wr_owner;
+ uint64_t rw_magic;
+ pthread_rwlock_t rw_lock;
+ uint_t rw_readers;
} krwlock_t;
typedef int krw_t;
#define RW_READER 0
#define RW_WRITER 1
-#define RW_DEFAULT USYNC_THREAD
+#define RW_DEFAULT RW_READER
-#undef RW_READ_HELD
-#define RW_READ_HELD(x) _rw_read_held(&(x)->rw_lock)
-
-#undef RW_WRITE_HELD
-#define RW_WRITE_HELD(x) _rw_write_held(&(x)->rw_lock)
+#define RW_READ_HELD(x) ((x)->rw_readers > 0)
+#define RW_WRITE_HELD(x) ((x)->rw_wr_owner == curthread)
+#define RW_LOCK_HELD(x) (RW_READ_HELD(x) || RW_WRITE_HELD(x))
extern void rw_init(krwlock_t *rwlp, char *name, int type, void *arg);
extern void rw_destroy(krwlock_t *rwlp);
/*
* Condition variables
*/
-typedef cond_t kcondvar_t;
+#define CV_MAGIC 0xd31ea9a83b1b30c4ull
+
+typedef struct kcondvar {
+ uint64_t cv_magic;
+ pthread_cond_t cv;
+} kcondvar_t;
-#define CV_DEFAULT USYNC_THREAD
+#define CV_DEFAULT 0
extern void cv_init(kcondvar_t *cv, char *name, int type, void *arg);
extern void cv_destroy(kcondvar_t *cv);
#define kmem_cache_alloc(_c, _f) umem_cache_alloc(_c, _f)
#define kmem_cache_free(_c, _b) umem_cache_free(_c, _b)
#define kmem_debugging() 0
-#define kmem_cache_reap_now(c)
+#define kmem_cache_reap_now(_c) /* nothing */
+#define kmem_cache_set_move(_c, _cb) /* nothing */
+#define POINTER_INVALIDATE(_pp) /* nothing */
+#define POINTER_IS_VALID(_p) 0
typedef umem_cache_t kmem_cache_t;
+typedef enum kmem_cbrc {
+ KMEM_CBRC_YES,
+ KMEM_CBRC_NO,
+ KMEM_CBRC_LATER,
+ KMEM_CBRC_DONT_NEED,
+ KMEM_CBRC_DONT_KNOW
+} kmem_cbrc_t;
+
/*
* Task queues
*/
extern taskqid_t taskq_dispatch(taskq_t *, task_func_t, void *, uint_t);
extern void taskq_destroy(taskq_t *);
extern void taskq_wait(taskq_t *);
-extern int taskq_member(taskq_t *, void *);
+extern int taskq_member(taskq_t *, kthread_t *);
extern void system_taskq_init(void);
extern void system_taskq_fini(void);
uint8_t xoa_av_modified;
uint8_t xoa_av_scanstamp[AV_SCANSTAMP_SZ];
uint8_t xoa_reparse;
+ uint8_t xoa_offline;
+ uint8_t xoa_sparse;
} xoptattr_t;
typedef struct vattr {
#define minclsyspri 60
#define maxclsyspri 99
-#define CPU_SEQID (thr_self() & (max_ncpus - 1))
+#define CPU_SEQID (pthread_self() & (max_ncpus - 1))
#define kcred NULL
#define CRED() NULL