diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /include/linux/aio.h |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'include/linux/aio.h')
-rw-r--r-- | include/linux/aio.h | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/include/linux/aio.h b/include/linux/aio.h new file mode 100644 index 000000000000..a4d5af907f90 --- /dev/null +++ b/include/linux/aio.h | |||
@@ -0,0 +1,201 @@ | |||
1 | #ifndef __LINUX__AIO_H | ||
2 | #define __LINUX__AIO_H | ||
3 | |||
4 | #include <linux/list.h> | ||
5 | #include <linux/workqueue.h> | ||
6 | #include <linux/aio_abi.h> | ||
7 | |||
8 | #include <asm/atomic.h> | ||
9 | |||
10 | #define AIO_MAXSEGS 4 | ||
11 | #define AIO_KIOGRP_NR_ATOMIC 8 | ||
12 | |||
13 | struct kioctx; | ||
14 | |||
15 | /* Notes on cancelling a kiocb: | ||
16 | * If a kiocb is cancelled, aio_complete may return 0 to indicate | ||
17 | * that cancel has not yet disposed of the kiocb. All cancel | ||
18 | * operations *must* call aio_put_req to dispose of the kiocb | ||
19 | * to guard against races with the completion code. | ||
20 | */ | ||
21 | #define KIOCB_C_CANCELLED 0x01 | ||
22 | #define KIOCB_C_COMPLETE 0x02 | ||
23 | |||
24 | #define KIOCB_SYNC_KEY (~0U) | ||
25 | |||
26 | /* ki_flags bits */ | ||
27 | #define KIF_LOCKED 0 | ||
28 | #define KIF_KICKED 1 | ||
29 | #define KIF_CANCELLED 2 | ||
30 | |||
31 | #define kiocbTryLock(iocb) test_and_set_bit(KIF_LOCKED, &(iocb)->ki_flags) | ||
32 | #define kiocbTryKick(iocb) test_and_set_bit(KIF_KICKED, &(iocb)->ki_flags) | ||
33 | |||
34 | #define kiocbSetLocked(iocb) set_bit(KIF_LOCKED, &(iocb)->ki_flags) | ||
35 | #define kiocbSetKicked(iocb) set_bit(KIF_KICKED, &(iocb)->ki_flags) | ||
36 | #define kiocbSetCancelled(iocb) set_bit(KIF_CANCELLED, &(iocb)->ki_flags) | ||
37 | |||
38 | #define kiocbClearLocked(iocb) clear_bit(KIF_LOCKED, &(iocb)->ki_flags) | ||
39 | #define kiocbClearKicked(iocb) clear_bit(KIF_KICKED, &(iocb)->ki_flags) | ||
40 | #define kiocbClearCancelled(iocb) clear_bit(KIF_CANCELLED, &(iocb)->ki_flags) | ||
41 | |||
42 | #define kiocbIsLocked(iocb) test_bit(KIF_LOCKED, &(iocb)->ki_flags) | ||
43 | #define kiocbIsKicked(iocb) test_bit(KIF_KICKED, &(iocb)->ki_flags) | ||
44 | #define kiocbIsCancelled(iocb) test_bit(KIF_CANCELLED, &(iocb)->ki_flags) | ||
45 | |||
46 | struct kiocb { | ||
47 | struct list_head ki_run_list; | ||
48 | long ki_flags; | ||
49 | int ki_users; | ||
50 | unsigned ki_key; /* id of this request */ | ||
51 | |||
52 | struct file *ki_filp; | ||
53 | struct kioctx *ki_ctx; /* may be NULL for sync ops */ | ||
54 | int (*ki_cancel)(struct kiocb *, struct io_event *); | ||
55 | ssize_t (*ki_retry)(struct kiocb *); | ||
56 | void (*ki_dtor)(struct kiocb *); | ||
57 | |||
58 | struct list_head ki_list; /* the aio core uses this | ||
59 | * for cancellation */ | ||
60 | |||
61 | union { | ||
62 | void __user *user; | ||
63 | struct task_struct *tsk; | ||
64 | } ki_obj; | ||
65 | __u64 ki_user_data; /* user's data for completion */ | ||
66 | loff_t ki_pos; | ||
67 | /* State that we remember to be able to restart/retry */ | ||
68 | unsigned short ki_opcode; | ||
69 | size_t ki_nbytes; /* copy of iocb->aio_nbytes */ | ||
70 | char __user *ki_buf; /* remaining iocb->aio_buf */ | ||
71 | size_t ki_left; /* remaining bytes */ | ||
72 | wait_queue_t ki_wait; | ||
73 | long ki_retried; /* just for testing */ | ||
74 | long ki_kicked; /* just for testing */ | ||
75 | long ki_queued; /* just for testing */ | ||
76 | |||
77 | void *private; | ||
78 | }; | ||
79 | |||
80 | #define is_sync_kiocb(iocb) ((iocb)->ki_key == KIOCB_SYNC_KEY) | ||
81 | #define init_sync_kiocb(x, filp) \ | ||
82 | do { \ | ||
83 | struct task_struct *tsk = current; \ | ||
84 | (x)->ki_flags = 0; \ | ||
85 | (x)->ki_users = 1; \ | ||
86 | (x)->ki_key = KIOCB_SYNC_KEY; \ | ||
87 | (x)->ki_filp = (filp); \ | ||
88 | (x)->ki_ctx = &tsk->active_mm->default_kioctx; \ | ||
89 | (x)->ki_cancel = NULL; \ | ||
90 | (x)->ki_dtor = NULL; \ | ||
91 | (x)->ki_obj.tsk = tsk; \ | ||
92 | (x)->ki_user_data = 0; \ | ||
93 | init_wait((&(x)->ki_wait)); \ | ||
94 | } while (0) | ||
95 | |||
96 | #define AIO_RING_MAGIC 0xa10a10a1 | ||
97 | #define AIO_RING_COMPAT_FEATURES 1 | ||
98 | #define AIO_RING_INCOMPAT_FEATURES 0 | ||
99 | struct aio_ring { | ||
100 | unsigned id; /* kernel internal index number */ | ||
101 | unsigned nr; /* number of io_events */ | ||
102 | unsigned head; | ||
103 | unsigned tail; | ||
104 | |||
105 | unsigned magic; | ||
106 | unsigned compat_features; | ||
107 | unsigned incompat_features; | ||
108 | unsigned header_length; /* size of aio_ring */ | ||
109 | |||
110 | |||
111 | struct io_event io_events[0]; | ||
112 | }; /* 128 bytes + ring size */ | ||
113 | |||
114 | #define aio_ring_avail(info, ring) (((ring)->head + (info)->nr - 1 - (ring)->tail) % (info)->nr) | ||
115 | |||
116 | #define AIO_RING_PAGES 8 | ||
117 | struct aio_ring_info { | ||
118 | unsigned long mmap_base; | ||
119 | unsigned long mmap_size; | ||
120 | |||
121 | struct page **ring_pages; | ||
122 | spinlock_t ring_lock; | ||
123 | long nr_pages; | ||
124 | |||
125 | unsigned nr, tail; | ||
126 | |||
127 | struct page *internal_pages[AIO_RING_PAGES]; | ||
128 | }; | ||
129 | |||
130 | struct kioctx { | ||
131 | atomic_t users; | ||
132 | int dead; | ||
133 | struct mm_struct *mm; | ||
134 | |||
135 | /* This needs improving */ | ||
136 | unsigned long user_id; | ||
137 | struct kioctx *next; | ||
138 | |||
139 | wait_queue_head_t wait; | ||
140 | |||
141 | spinlock_t ctx_lock; | ||
142 | |||
143 | int reqs_active; | ||
144 | struct list_head active_reqs; /* used for cancellation */ | ||
145 | struct list_head run_list; /* used for kicked reqs */ | ||
146 | |||
147 | unsigned max_reqs; | ||
148 | |||
149 | struct aio_ring_info ring_info; | ||
150 | |||
151 | struct work_struct wq; | ||
152 | }; | ||
153 | |||
154 | /* prototypes */ | ||
155 | extern unsigned aio_max_size; | ||
156 | |||
157 | extern ssize_t FASTCALL(wait_on_sync_kiocb(struct kiocb *iocb)); | ||
158 | extern int FASTCALL(aio_put_req(struct kiocb *iocb)); | ||
159 | extern void FASTCALL(kick_iocb(struct kiocb *iocb)); | ||
160 | extern int FASTCALL(aio_complete(struct kiocb *iocb, long res, long res2)); | ||
161 | extern void FASTCALL(__put_ioctx(struct kioctx *ctx)); | ||
162 | struct mm_struct; | ||
163 | extern void FASTCALL(exit_aio(struct mm_struct *mm)); | ||
164 | extern struct kioctx *lookup_ioctx(unsigned long ctx_id); | ||
165 | extern int FASTCALL(io_submit_one(struct kioctx *ctx, | ||
166 | struct iocb __user *user_iocb, struct iocb *iocb)); | ||
167 | |||
168 | /* semi private, but used by the 32bit emulations: */ | ||
169 | struct kioctx *lookup_ioctx(unsigned long ctx_id); | ||
170 | int FASTCALL(io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, | ||
171 | struct iocb *iocb)); | ||
172 | |||
173 | #define get_ioctx(kioctx) do { if (unlikely(atomic_read(&(kioctx)->users) <= 0)) BUG(); atomic_inc(&(kioctx)->users); } while (0) | ||
174 | #define put_ioctx(kioctx) do { if (unlikely(atomic_dec_and_test(&(kioctx)->users))) __put_ioctx(kioctx); else if (unlikely(atomic_read(&(kioctx)->users) < 0)) BUG(); } while (0) | ||
175 | |||
176 | #define in_aio() !is_sync_wait(current->io_wait) | ||
177 | /* may be used for debugging */ | ||
178 | #define warn_if_async() \ | ||
179 | do { \ | ||
180 | if (in_aio()) { \ | ||
181 | printk(KERN_ERR "%s(%s:%d) called in async context!\n", \ | ||
182 | __FUNCTION__, __FILE__, __LINE__); \ | ||
183 | dump_stack(); \ | ||
184 | } \ | ||
185 | } while (0) | ||
186 | |||
187 | #define io_wait_to_kiocb(wait) container_of(wait, struct kiocb, ki_wait) | ||
188 | #define is_retried_kiocb(iocb) ((iocb)->ki_retried > 1) | ||
189 | |||
190 | #include <linux/aio_abi.h> | ||
191 | |||
192 | static inline struct kiocb *list_kiocb(struct list_head *h) | ||
193 | { | ||
194 | return list_entry(h, struct kiocb, ki_list); | ||
195 | } | ||
196 | |||
197 | /* for sysctl: */ | ||
198 | extern atomic_t aio_nr; | ||
199 | extern unsigned aio_max_nr; | ||
200 | |||
201 | #endif /* __LINUX__AIO_H */ | ||