]>
Commit | Line | Data |
---|---|---|
09b414e8 | 1 | #ifndef _SPL_RWLOCK_H |
e8b31e84 | 2 | #define _SPL_RWLOCK_H |
f1ca4da6 | 3 | |
f1b59d26 | 4 | #include <linux/module.h> |
f1ca4da6 | 5 | #include <linux/slab.h> |
6 | #include <linux/rwsem.h> | |
7 | #include <asm/current.h> | |
f4b37741 | 8 | #include <sys/types.h> |
e8b31e84 | 9 | #include <sys/kmem.h> |
f1ca4da6 | 10 | |
e8b31e84 | 11 | #ifdef __cplusplus |
f1ca4da6 | 12 | extern "C" { |
13 | #endif | |
14 | ||
15 | typedef enum { | |
16 | RW_DRIVER = 2, /* driver (DDI) rwlock */ | |
17 | RW_DEFAULT = 4 /* kernel default rwlock */ | |
18 | } krw_type_t; | |
19 | ||
20 | typedef enum { | |
21 | RW_WRITER, | |
22 | RW_READER | |
23 | } krw_t; | |
24 | ||
f1ca4da6 | 25 | |
26 | #define RW_MAGIC 0x3423645a | |
27 | #define RW_POISON 0xa6 | |
28 | ||
29 | typedef struct { | |
e8b31e84 | 30 | int32_t rw_magic; |
31 | int32_t rw_name_size; | |
f1ca4da6 | 32 | char *rw_name; |
33 | struct rw_semaphore rw_sem; | |
f1b59d26 | 34 | struct task_struct *rw_owner; /* holder of the write lock */ |
f1ca4da6 | 35 | } krwlock_t; |
36 | ||
e8b31e84 | 37 | extern void __rw_init(krwlock_t *rwlp, char *name, krw_type_t type, void *arg); |
38 | extern void __rw_destroy(krwlock_t *rwlp); | |
39 | extern int __rw_tryenter(krwlock_t *rwlp, krw_t rw); | |
40 | extern void __rw_enter(krwlock_t *rwlp, krw_t rw); | |
41 | extern void __rw_exit(krwlock_t *rwlp); | |
42 | extern void __rw_downgrade(krwlock_t *rwlp); | |
43 | extern int __rw_tryupgrade(krwlock_t *rwlp); | |
44 | extern kthread_t *__rw_owner(krwlock_t *rwlp); | |
ed61a7d0 | 45 | extern int __rw_read_held(krwlock_t *rwlp); |
46 | extern int __rw_write_held(krwlock_t *rwlp); | |
47 | extern int __rw_lock_held(krwlock_t *rwlp); | |
48 | ||
e8b31e84 | 49 | #define rw_init(rwlp, name, type, arg) \ |
50 | ({ \ | |
51 | if ((name) == NULL) \ | |
52 | __rw_init(rwlp, #rwlp, type, arg); \ | |
53 | else \ | |
54 | __rw_init(rwlp, name, type, arg); \ | |
55 | }) | |
56 | #define rw_destroy(rwlp) __rw_destroy(rwlp) | |
57 | #define rw_tryenter(rwlp, rw) __rw_tryenter(rwlp, rw) | |
58 | #define rw_enter(rwlp, rw) __rw_enter(rwlp, rw) | |
59 | #define rw_exit(rwlp) __rw_exit(rwlp) | |
60 | #define rw_downgrade(rwlp) __rw_downgrade(rwlp) | |
61 | #define rw_tryupgrade(rwlp) __rw_tryupgrade(rwlp) | |
62 | #define rw_owner(rwlp) __rw_owner(rwlp) | |
63 | #define RW_READ_HELD(rwlp) __rw_read_held(rwlp) | |
64 | #define RW_WRITE_HELD(rwlp) __rw_write_held(rwlp) | |
65 | #define RW_LOCK_HELD(rwlp) __rw_lock_held(rwlp) | |
66 | ||
67 | #ifdef __cplusplus | |
f1ca4da6 | 68 | } |
69 | #endif | |
70 | ||
e8b31e84 | 71 | #endif /* _SPL_RWLOCK_H */ |