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#include <linux/uio.h>
8
9#include <asm/atomic.h>
10
11#define AIO_MAXSEGS 4
12#define AIO_KIOGRP_NR_ATOMIC 8
13
14struct kioctx;
15
16
17
18
19
20
21
22#define KIOCB_C_CANCELLED 0x01
23#define KIOCB_C_COMPLETE 0x02
24
25#define KIOCB_SYNC_KEY (~0U)
26
27
28
29
30
31
32
33
34#define KIF_KICKED 1
35#define KIF_CANCELLED 2
36
37#define kiocbTryLock(iocb) test_and_set_bit(KIF_LOCKED, &(iocb)->ki_flags)
38#define kiocbTryKick(iocb) test_and_set_bit(KIF_KICKED, &(iocb)->ki_flags)
39
40#define kiocbSetLocked(iocb) set_bit(KIF_LOCKED, &(iocb)->ki_flags)
41#define kiocbSetKicked(iocb) set_bit(KIF_KICKED, &(iocb)->ki_flags)
42#define kiocbSetCancelled(iocb) set_bit(KIF_CANCELLED, &(iocb)->ki_flags)
43
44#define kiocbClearLocked(iocb) clear_bit(KIF_LOCKED, &(iocb)->ki_flags)
45#define kiocbClearKicked(iocb) clear_bit(KIF_KICKED, &(iocb)->ki_flags)
46#define kiocbClearCancelled(iocb) clear_bit(KIF_CANCELLED, &(iocb)->ki_flags)
47
48#define kiocbIsLocked(iocb) test_bit(KIF_LOCKED, &(iocb)->ki_flags)
49#define kiocbIsKicked(iocb) test_bit(KIF_KICKED, &(iocb)->ki_flags)
50#define kiocbIsCancelled(iocb) test_bit(KIF_CANCELLED, &(iocb)->ki_flags)
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86struct kiocb {
87 struct list_head ki_run_list;
88 unsigned long ki_flags;
89 int ki_users;
90 unsigned ki_key;
91
92 struct file *ki_filp;
93 struct kioctx *ki_ctx;
94 int (*ki_cancel)(struct kiocb *, struct io_event *);
95 ssize_t (*ki_retry)(struct kiocb *);
96 void (*ki_dtor)(struct kiocb *);
97
98 union {
99 void __user *user;
100 struct task_struct *tsk;
101 } ki_obj;
102
103 __u64 ki_user_data;
104 wait_queue_t ki_wait;
105 loff_t ki_pos;
106
107 void *private;
108
109 unsigned short ki_opcode;
110 size_t ki_nbytes;
111 char __user *ki_buf;
112 size_t ki_left;
113 struct iovec ki_inline_vec;
114 struct iovec *ki_iovec;
115 unsigned long ki_nr_segs;
116 unsigned long ki_cur_seg;
117
118 struct list_head ki_list;
119
120
121
122
123
124
125 struct file *ki_eventfd;
126};
127
128#define is_sync_kiocb(iocb) ((iocb)->ki_key == KIOCB_SYNC_KEY)
129#define init_sync_kiocb(x, filp) \
130 do { \
131 struct task_struct *tsk = current; \
132 (x)->ki_flags = 0; \
133 (x)->ki_users = 1; \
134 (x)->ki_key = KIOCB_SYNC_KEY; \
135 (x)->ki_filp = (filp); \
136 (x)->ki_ctx = NULL; \
137 (x)->ki_cancel = NULL; \
138 (x)->ki_retry = NULL; \
139 (x)->ki_dtor = NULL; \
140 (x)->ki_obj.tsk = tsk; \
141 (x)->ki_user_data = 0; \
142 init_wait((&(x)->ki_wait)); \
143 } while (0)
144
145#define AIO_RING_MAGIC 0xa10a10a1
146#define AIO_RING_COMPAT_FEATURES 1
147#define AIO_RING_INCOMPAT_FEATURES 0
148struct aio_ring {
149 unsigned id;
150 unsigned nr;
151 unsigned head;
152 unsigned tail;
153
154 unsigned magic;
155 unsigned compat_features;
156 unsigned incompat_features;
157 unsigned header_length;
158
159
160 struct io_event io_events[0];
161};
162
163#define aio_ring_avail(info, ring) (((ring)->head + (info)->nr - 1 - (ring)->tail) % (info)->nr)
164
165#define AIO_RING_PAGES 8
166struct aio_ring_info {
167 unsigned long mmap_base;
168 unsigned long mmap_size;
169
170 struct page **ring_pages;
171 spinlock_t ring_lock;
172 long nr_pages;
173
174 unsigned nr, tail;
175
176 struct page *internal_pages[AIO_RING_PAGES];
177};
178
179struct kioctx {
180 atomic_t users;
181 int dead;
182 struct mm_struct *mm;
183
184
185 unsigned long user_id;
186 struct kioctx *next;
187
188 wait_queue_head_t wait;
189
190 spinlock_t ctx_lock;
191
192 int reqs_active;
193 struct list_head active_reqs;
194 struct list_head run_list;
195
196
197 unsigned max_reqs;
198
199 struct aio_ring_info ring_info;
200
201 struct delayed_work wq;
202};
203
204
205extern unsigned aio_max_size;
206
207#ifdef CONFIG_AIO
208extern ssize_t wait_on_sync_kiocb(struct kiocb *iocb);
209extern int aio_put_req(struct kiocb *iocb);
210extern void kick_iocb(struct kiocb *iocb);
211extern int aio_complete(struct kiocb *iocb, long res, long res2);
212struct mm_struct;
213extern void exit_aio(struct mm_struct *mm);
214#else
215static inline ssize_t wait_on_sync_kiocb(struct kiocb *iocb) { return 0; }
216static inline int aio_put_req(struct kiocb *iocb) { return 0; }
217static inline void kick_iocb(struct kiocb *iocb) { }
218static inline int aio_complete(struct kiocb *iocb, long res, long res2) { return 0; }
219struct mm_struct;
220static inline void exit_aio(struct mm_struct *mm) { }
221#endif
222
223#define io_wait_to_kiocb(wait) container_of(wait, struct kiocb, ki_wait)
224
225#include <linux/aio_abi.h>
226
227static inline struct kiocb *list_kiocb(struct list_head *h)
228{
229 return list_entry(h, struct kiocb, ki_list);
230}
231
232
233extern unsigned long aio_nr;
234extern unsigned long aio_max_nr;
235
236#endif
237