-#ifndef _LINUX_CALLB_H
-#define _LINUX_CALLB_H
+#ifndef _SOLARIS_CALLB_H
+#define _SOLARIS_CALLB_H
#ifdef __cplusplus
extern "C" {
#endif
+#include <linux/module.h>
#include <linux-mutex.h>
#define DEBUG_CALLB
}
#endif
-#endif /* _LINUX_CALLB_H */
+#endif /* _SOLARIS_CALLB_H */
-#ifndef _LINUX_CONDVAR_H
-#define _LINUX_CONDVAR_H
+#ifndef _SOLARIS_CONDVAR_H
+#define _SOLARIS_CONDVAR_H
#ifdef __cplusplus
extern "C" {
#endif
+#include <linux/module.h>
#include <linux/wait.h>
/* The kcondvar_t struct is protected by mutex taken externally before
if (atomic_read(&cvp->cv_waiters) > 0)
wake_up_all(&cvp->cv_event);
}
-#endif /* _LINUX_CONDVAR_H */
+#endif /* _SOLARIS_CONDVAR_H */
-#ifndef _LINUX_CRED_H
-#define _LINUX_CRED_H
+#ifndef _SOLARIS_CRED_H
+#define _SOLARIS_CRED_H
#ifdef __cplusplus
extern "C" {
#endif
+#include <linux/module.h>
#include <linux/types.h>
/* XXX - Portions commented out because we really just want to have the type
}
#endif
-#endif /* _LINUX_CRED_H */
+#endif /* _SOLARIS_CRED_H */
-#ifndef _LINUX_GENERIC_H
-#define _LINUX_GENERIC_H
+#ifndef _SOLARIS_GENERIC_H
+#define _SOLARIS_GENERIC_H
#ifdef __cplusplus
extern "C" {
#endif
+#include <linux/module.h>
+
/* Missing defines.
*/
#define INT32_MAX INT_MAX
#define MAXNAMELEN 256
#define MAXPATHLEN PATH_MAX
#define __va_list va_list
-#define _KERNEL 1
+#define _KERNEL __KERNEL__
#define max_ncpus 64
/* 0..MAX_PRIO-1: Process priority
/* Missing globals
*/
-static int p0 = 0;
+extern int p0;
#ifdef __cplusplus
}
#endif
-#endif /* _LINUX_GENERIC_H */
+#endif /* _SOLARIS_GENERIC_H */
-#ifndef _LINUX_KMEM_H
-#define _LINUX_KMEM_H
+#ifndef _SOLARIS_KMEM_H
+#define _SOLARIS_KMEM_H
#ifdef __cplusplus
extern "C" {
#undef DEBUG_KMEM
#undef DEBUG_KMEM_UNIMPLEMENTED
+#include <linux/module.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/spinlock.h>
typedef void (*kmem_destructor_t)(void *, void *);
typedef void (*kmem_reclaim_t)(void *);
-kmem_cache_t *
+extern kmem_cache_t *
__kmem_cache_create(char *name, size_t size, size_t align,
- int (*constructor)(void *, void *, int),
- void (*destructor)(void *, void *),
- void (*reclaim)(void *),
+ kmem_constructor_t constructor,
+ kmem_destructor_t destructor,
+ kmem_reclaim_t reclaim,
void *priv, void *vmp, int flags);
void
-__kmem_cache_destroy(kmem_cache_t *cache);
+extern __kmem_cache_destroy(kmem_cache_t *cache);
+
+void
+extern __kmem_reap(void);
#define kmem_cache_create(name,size,align,ctor,dtor,rclm,priv,vmp,flags) \
__kmem_cache_create(name,size,align,ctor,dtor,rclm,priv,vmp,flags)
#define kmem_cache_alloc(cache, flags) kmem_cache_alloc(cache, flags)
#define kmem_cache_free(cache, ptr) kmem_cache_free(cache, ptr)
#define kmem_cache_reap_now(cache) kmem_cache_shrink(cache)
-#define kmem_reap() __kmem_reap()
-
+#define kmem_reap() __kmem_reap()
#ifdef __cplusplus
}
#endif
-#endif /* _LINUX_KMEM_H */
+#endif /* _SOLARIS_KMEM_H */
-#ifndef _LINUX_KSTAT_H
-#define _LINUX_KSTAT_H
+#ifndef _SOLARIS_KSTAT_H
+#define _SOLARIS_KSTAT_H
#ifdef __cplusplus
extern "C" {
#endif
+#include <linux/module.h>
#include <linux-types.h>
/* XXX - The minimum functionality here is stubbed out but nothing works. */
}
#endif
-#endif /* _LINUX_KSTAT_H */
+#endif /* _SOLARIS_KSTAT_H */
-#ifndef _LINUX_MUTEX_H
-#define _LINUX_MUTEX_H
+#ifndef _SOLARIS_MUTEX_H
+#define _SOLARIS_MUTEX_H
#ifdef __cplusplus
extern "C" {
#endif
+#include <linux/module.h>
+
/* See the "Big Theory Statement" in solaris mutex.c.
*
* Spin mutexes apparently aren't needed by zfs so we assert
#define KM_MAGIC 0x42424242
#define KM_POISON 0x84
-
+
typedef struct {
int km_magic;
char *km_name;
}
#endif
-#endif /* _LINUX_MUTEX_H */
+#endif /* _SOLARIS_MUTEX_H */
-#ifndef _LINUX_RANDOM_H
-#define _LINUX_RANDOM_H
+#ifndef _SOLARIS_RANDOM_H
+#define _SOLARIS_RANDOM_H
#ifdef __cplusplus
extern "C" {
#endif
+#include <linux/module.h>
#include <linux/random.h>
/* FIXME:
}
#endif
-#endif /* _LINUX_RANDOM_H */
+#endif /* _SOLARIS_RANDOM_H */
-#ifndef _LINUX_RWLOCK_H
-#define _LINUX_RWLOCK_H
+#ifndef _SOLARIS_RWLOCK_H
+#define _SOLARIS_RWLOCK_H
+#include <linux/module.h>
#include <linux/slab.h>
#include <linux/rwsem.h>
#include <asm/current.h>
int rw_magic;
char *rw_name;
struct rw_semaphore rw_sem;
- struct task_struct *rw_owner; /* holder of the write lock */
+ struct task_struct *rw_owner; /* holder of the write lock */
} krwlock_t;
static __inline__ void
* read lock and reacquire it for writing since
* we know there are no waiters */
up_read(&rwlp->rw_sem);
-
+
/* returns 1 if success, 0 if contention */
result = down_write_trylock(&rwlp->rw_sem);
-
- /* Check if upgrade failed. Should not ever happen
+
+ /* Check if upgrade failed. Should not ever happen
* if we got to this point */
BUG_ON(!result);
BUG_ON(rwlp->rw_owner != NULL);
}
#endif
-#endif /* _LINUX_RWLOCK_H */
+#endif /* _SOLARIS_RWLOCK_H */
-#ifndef _LINUX_TASKQ_H
-#define _LINUX_TASKQ_H
+#ifndef _SOLARIS_TASKQ_H
+#define _SOLARIS_TASKQ_H
#ifdef __cplusplus
extern "C" {
* forces us to implement dynamic workqueues. Which is all very doable
* with a little effort.
*/
+#include <linux/module.h>
#include <linux/workqueue.h>
#include <linux/gfp.h>
#include <linux/slab.h>
}
#endif
-#endif /* _LINUX_TASKQ_H */
+#endif /* _SOLARIS_TASKQ_H */
-#ifndef _LINUX_THREAD_H
-#define _LINUX_THREAD_H
+#ifndef _SOLARIS_THREAD_H
+#define _SOLARIS_THREAD_H
#ifdef __cplusplus
extern "C" {
#endif
+#include <linux/module.h>
#include <linux/mm.h>
#include <linux/spinlock.h>
#include <linux-types.h>
int foo;
} proc_t;
-kthread_t * __thread_create(caddr_t stk, size_t stksize,
+extern kthread_t *__thread_create(caddr_t stk, size_t stksize,
void (*proc)(void *), void *args,
size_t len, proc_t *pp, int state,
pri_t pri);
+extern void __thread_exit(void);
#ifdef __cplusplus
}
#endif
-#endif /* _LINUX_THREAD_H */
+#endif /* _SOLARIS_THREAD_H */
-#ifndef _TIME_H
-#define _TIME_H
-
-#pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.16 */
+#ifndef _SOLARIS_TIME_H
+#define _SOLARIS_TIME_H
/*
* Structure returned by gettimeofday(2) system call,
extern "C" {
#endif
+#include <linux/module.h>
#include <linux/time.h>
#include <linux-types.h>
}
#endif
-#endif /* _TIME_H */
+#endif /* _SOLARIS_TIME_H */
-#ifndef _LINUX_TIMER_H
-#define _LINUX_TIMER_H
+#ifndef _SOLARIS_TIMER_H
+#define _SOLARIS_TIMER_H
#ifdef __cplusplus
extern "C" {
#endif
+#include <linux/module.h>
#include <linux/sched.h>
#include <linux/timer.h>
}
#endif
-#endif /* _LINUX_TIMER_H */
+#endif /* _SOLARIS_TIMER_H */
-#ifndef _LINUX_TYPES_H
-#define _LINUX_TYPES_H
+#ifndef _SOLARIS_TYPES_H
+#define _SOLARIS_TYPES_H
#ifdef __cplusplus
extern "C" {
}
#endif
-#endif /* _LINUX_TYPES_H */
+#endif /* _SOLARIS_TYPES_H */
#ifndef _SPLAT_CTL_H
-#define _SPLAY_CTL_H
+#define _SPLAT_CTL_H
-#ifdef _KERNEL
+#ifdef __KERNEL__
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/sched.h>
+#include <linux/elf.h>
+#include <linux/limits.h>
+#include <linux/version.h>
+#include <linux/vmalloc.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/list.h>
#include <asm/ioctls.h>
#include <asm/uaccess.h>
-#include <linux/list.h>
-#endif /* _KERNEL */
+#include <stdarg.h>
+
+#include <linux-generic.h>
+#include <linux-types.h>
+#include <linux-kmem.h>
+#include <linux-mutex.h>
+#include <linux-condvar.h>
+#include <linux-random.h>
+#include <linux-thread.h>
+#include <linux-taskq.h>
+#include <linux-rwlock.h>
+#include <linux-timer.h>
+#include <linux-time.h>
+#include <linux-cred.h>
+#include <linux-kstat.h>
+#include <linux-callb.h>
+
+#endif /* __KERNEL__ */
#define KZT_VERSION "v1.0"
#define KZT_VERSION_SIZE 64
#define KZT_TEST_UNKNOWN 0xFFF
-#ifdef _KERNEL
+#ifdef __KERNEL__
#define KZT_SUBSYSTEM_INIT(type) \
({ kzt_subsystem_t *_sub_; \
\
printk(KERN_ERR "Error initializing: " #type "\n"); \
} else { \
spin_lock(&kzt_module_lock); \
- list_add_tail(&(_sub_->subsystem_list), \
+ list_add_tail(&(_sub_->subsystem_list), \
&kzt_module_list); \
spin_unlock(&kzt_module_lock); \
} \
_id_ = kzt_##type##_id(); \
spin_lock(&kzt_module_lock); \
list_for_each_entry_safe(_sub_, _tmp_, &kzt_module_list, \
- subsystem_list) { \
+ subsystem_list) { \
if (_sub_->desc.id == _id_) { \
list_del_init(&(_sub_->subsystem_list)); \
- spin_unlock(&kzt_module_lock); \
+ spin_unlock(&kzt_module_lock); \
kzt_##type##_fini(_sub_); \
spin_lock(&kzt_module_lock); \
_flag_ = 1; \
#define KZT_TEST_FINI(sub, tid) \
({ kzt_test_t *_test_, *_tmp_; \
- int _flag_ = 0; \
+ int _flag_ = 0; \
\
spin_lock(&((sub)->test_lock)); \
list_for_each_entry_safe(_test_, _tmp_, \
spin_unlock(&((sub)->test_lock)); \
\
if (!_flag_) \
- printk(KERN_ERR "Error finalizing: " #tid "\n"); \
+ printk(KERN_ERR "Error finalizing: " #tid "\n"); \
})
typedef int (*kzt_test_func_t)(struct file *, void *);
spin_lock(&_info_->info_lock); \
\
/* Don't allow the kernel to start a write in the red zone */ \
- if ((int)(_info_->info_head - _info_->info_buffer) > \
+ if ((int)(_info_->info_head - _info_->info_buffer) > \
(KZT_INFO_BUFFER_SIZE -KZT_INFO_BUFFER_REDZONE)) { \
_rc_ = -EOVERFLOW; \
} else { \
kzt_subsystem_t * kzt_thread_init(void);
kzt_subsystem_t * kzt_time_init(void);
-#endif /* _KERNEL */
+void kzt_condvar_fini(kzt_subsystem_t *);
+void kzt_kmem_fini(kzt_subsystem_t *);
+void kzt_mutex_fini(kzt_subsystem_t *);
+void kzt_krng_fini(kzt_subsystem_t *);
+void kzt_rwlock_fini(kzt_subsystem_t *);
+void kzt_taskq_fini(kzt_subsystem_t *);
+void kzt_thread_fini(kzt_subsystem_t *);
+void kzt_time_fini(kzt_subsystem_t *);
+
+int kzt_condvar_id(void);
+int kzt_kmem_id(void);
+int kzt_mutex_id(void);
+int kzt_krng_id(void);
+int kzt_rwlock_id(void);
+int kzt_taskq_id(void);
+int kzt_thread_id(void);
+int kzt_time_id(void);
+
+#endif /* __KERNEL__ */
-#endif /* _SPLAY_CTL_H */
+#endif /* _SPLAT_CTL_H */
MODULES := spl
DISTFILES = Makefile.in \
- linux-kmem.c linux-rwlock.c linux-taskq.c linux-thread.c
+ linux-kmem.c linux-rwlock.c linux-taskq.c \
+ linux-thread.c linux-generic.c
CPPFLAGS += @KERNELCPPFLAGS@
# Solaris porting layer module
--- /dev/null
+#include "linux-generic.h"
+
+/*
+ * Generic support
+ */
+
+int p0 = 0;
+EXPORT_SYMBOL(p0);
kmem_cache_t *
__kmem_cache_create(char *name, size_t size, size_t align,
- int (*constructor)(void *, void *, int),
- void (*destructor)(void *, void *),
- void (*reclaim)(void *),
+ kmem_constructor_t constructor,
+ kmem_destructor_t destructor,
+ kmem_reclaim_t reclaim,
void *priv, void *vmp, int flags)
{
kmem_cache_t *cache;
return cache;
}
+EXPORT_SYMBOL(__kmem_cache_create);
/* Return codes discarded because Solaris implementation has void return */
void
spin_unlock(&kmem_cache_cb_lock);
}
+EXPORT_SYMBOL(__kmem_cache_destroy);
-void
+void
__kmem_reap(void) {
- /* Since there's no easy hook in to linux to force all the registered
+ /* Since there's no easy hook in to linux to force all the registered
* shrinkers to run we just run the ones registered for this shim */
kmem_cache_generic_shrinker(KMC_REAP_CHUNK, GFP_KERNEL);
}
-
+EXPORT_SYMBOL(__kmem_reap);
-#include <sys/linux-rwlock.h>
+#include <linux-rwlock.h>
int
rw_lock_held(krwlock_t *rwlp)
#endif
return 1;
}
-
+
return 0;
}
-#include <sys/linux-taskq.h>
+#include <linux-taskq.h>
/*
* Task queue interface
return (taskqid_t)wq;
}
+EXPORT_SYMBOL(__taskq_dispatch);
/* XXX - Most args ignored until we decide if it's worth the effort
* to emulate the solaris notion of dynamic thread pools. For
__taskq_create(const char *name, int nthreads, pri_t pri,
int minalloc, int maxalloc, uint_t flags)
{
- /* NOTE: Linux workqueue names are limited to 10 chars */
+ /* NOTE: Linux workqueue names are limited to 10 chars */
return create_singlethread_workqueue(name);
}
+EXPORT_SYMBOL(__taskq_create);
wait_queue_head_t tp_waitq; /* Syncronization wait queue */
} thread_priv_t;
-int
+static int
thread_generic_wrapper(void *arg)
{
thread_priv_t *tp = (thread_priv_t *)arg;
spin_unlock(&tp->tp_lock);
wake_up(&tp->tp_waitq);
- /* DO NOT USE 'ARG' AFTER THIS POINT, EVER, EVER, EVER!
- * Local variables are used here because after the calling thread
+ /* DO NOT USE 'ARG' AFTER THIS POINT, EVER, EVER, EVER!
+ * Local variables are used here because after the calling thread
* has been woken up it will exit and this memory will no longer
* be safe to access since it was declared on the callers stack. */
if (func)
{
return;
}
+EXPORT_SYMBOL(__thread_exit);
/* thread_create() may block forever if it cannot create a thread or
* allocate memory. This is preferable to returning a NULL which Solaris
{
thread_priv_t tp;
DEFINE_WAIT(wait);
- kthread_t *task;
long pid;
/* Option pp is simply ignored */
/* Verify the pid retunred matches the pid in the task struct */
BUG_ON(pid != (tp.tp_task)->pid);
-
+
spin_unlock(&tp.tp_lock);
return (kthread_t *)tp.tp_task;
}
+EXPORT_SYMBOL(__thread_create);
-#include <sys/zfs_context.h>
-#include <sys/splat-ctl.h>
+#include <splat-ctl.h>
#define KZT_SUBSYSTEM_CONDVAR 0x0500
#define KZT_CONDVAR_NAME "condvar"
* Author: Brian Behlendorf
*/
-#include <sys/zfs_context.h>
-#include <sys/splat-ctl.h>
-
-#include <linux/version.h>
-#include <linux/vmalloc.h>
-#include <linux/module.h>
-#include <linux/device.h>
+#include <splat-ctl.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
#include <linux/devfs_fs_kernel.h>
{
kzt_subsystem_t *sub;
kzt_test_t *test;
- int rc, i = 0;
+ int i = 0;
/* Subsystem ID passed as arg1 */
sub = kzt_subsystem_find(kcfg->cfg_arg1);
kzt_subsystem_t *sub;
kzt_test_t *test;
kzt_cfg_t *tmp;
- int size, rc, i = 0;
+ int size, i = 0;
/* Subsystem ID passed as arg1 */
sub = kzt_subsystem_find(kcfg->cfg_arg1);
kzt_validate(struct file *file, kzt_subsystem_t *sub, int cmd, void *arg)
{
kzt_test_t *test;
- int rc = 0;
spin_lock(&(sub->test_lock));
list_for_each_entry(test, &(sub->test_list), test_list) {
kzt_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
- int minor, rc = 0;
+ unsigned int minor = iminor(file->f_dentry->d_inode);
+ int rc = 0;
/* Ignore tty ioctls */
if ((cmd & 0xffffff00) == ((int)'T') << 8)
kzt_init(void)
{
dev_t dev;
- int i, rc;
+ int rc;
spin_lock_init(&kzt_module_lock);
INIT_LIST_HEAD(&kzt_module_list);
KZT_SUBSYSTEM_INIT(time);
dev = MKDEV(KZT_MAJOR, 0);
- if (rc = register_chrdev_region(dev, KZT_MINORS, "kztctl"))
+ if ((rc = register_chrdev_region(dev, KZT_MINORS, "kztctl")))
goto error;
/* Support for registering a character driver */
kzt_fini(void)
{
dev_t dev = MKDEV(KZT_MAJOR, 0);
- int i;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
class_simple_device_remove(dev);
-#include <sys/zfs_context.h>
-#include <sys/splat-ctl.h>
+#include <splat-ctl.h>
#define KZT_SUBSYSTEM_KMEM 0x0100
#define KZT_KMEM_NAME "kmem"
out_free:
if (kcd)
kmem_cache_free(cache, kcd);
-out_destroy:
+
kmem_cache_destroy(cache);
return rc;
}
kcp.kcp_cache = cache;
for (i = 0; i < KZT_KMEM_OBJ_COUNT; i++) {
- /* All allocations need not succeed */
+ /* All allocations need not succeed */
kcp.kcp_kcd[i] = kmem_cache_alloc(cache, 0);
if (!kcp.kcp_kcd[i]) {
kzt_vprint(file, KZT_KMEM_TEST4_NAME,
-#include <sys/zfs_context.h>
-#include <sys/splat-ctl.h>
+#include <splat-ctl.h>
#define KZT_SUBSYSTEM_MUTEX 0x0400
#define KZT_MUTEX_NAME "mutex"
-#include <sys/zfs_context.h>
-#include <sys/splat-ctl.h>
+#include <splat-ctl.h>
#define KZT_SUBSYSTEM_KRNG 0x0300
#define KZT_KRNG_NAME "krng"
-#include <sys/zfs_context.h>
-#include <sys/splat-ctl.h>
+#include <splat-ctl.h>
#define KZT_SUBSYSTEM_RWLOCK 0x0700
#define KZT_RWLOCK_NAME "rwlock"
-#include <sys/zfs_context.h>
-#include <sys/splat-ctl.h>
+#include <splat-ctl.h>
#define KZT_SUBSYSTEM_TASKQ 0x0200
#define KZT_TASKQ_NAME "taskq"
-#include <sys/zfs_context.h>
-#include <sys/splat-ctl.h>
+#include <splat-ctl.h>
#define KZT_SUBSYSTEM_THREAD 0x0600
#define KZT_THREAD_NAME "thread"
-#include <sys/zfs_context.h>
-#include <sys/splat-ctl.h>
+#include <splat-ctl.h>
#define KZT_SUBSYSTEM_TIME 0x0800
#define KZT_TIME_NAME "time"