1#ifndef _LINUX_PAGEMAP_H
2#define _LINUX_PAGEMAP_H
3
4
5
6
7#include <linux/mm.h>
8#include <linux/fs.h>
9#include <linux/list.h>
10#include <linux/highmem.h>
11#include <linux/compiler.h>
12#include <asm/uaccess.h>
13#include <linux/gfp.h>
14#include <linux/bitops.h>
15#include <linux/hardirq.h>
16
17
18
19
20
21#define AS_EIO (__GFP_BITS_SHIFT + 0)
22#define AS_ENOSPC (__GFP_BITS_SHIFT + 1)
23#define AS_MM_ALL_LOCKS (__GFP_BITS_SHIFT + 2)
24
25static inline void mapping_set_error(struct address_space *mapping, int error)
26{
27 if (unlikely(error)) {
28 if (error == -ENOSPC)
29 set_bit(AS_ENOSPC, &mapping->flags);
30 else
31 set_bit(AS_EIO, &mapping->flags);
32 }
33}
34
35static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
36{
37 return (__force gfp_t)mapping->flags & __GFP_BITS_MASK;
38}
39
40
41
42
43
44static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask)
45{
46 m->flags = (m->flags & ~(__force unsigned long)__GFP_BITS_MASK) |
47 (__force unsigned long)mask;
48}
49
50
51
52
53
54
55
56
57
58#define PAGE_CACHE_SHIFT PAGE_SHIFT
59#define PAGE_CACHE_SIZE PAGE_SIZE
60#define PAGE_CACHE_MASK PAGE_MASK
61#define PAGE_CACHE_ALIGN(addr) (((addr)+PAGE_CACHE_SIZE-1)&PAGE_CACHE_MASK)
62
63#define page_cache_get(page) get_page(page)
64#define page_cache_release(page) put_page(page)
65void release_pages(struct page **pages, int nr, int cold);
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111static inline int page_cache_get_speculative(struct page *page)
112{
113 VM_BUG_ON(in_interrupt());
114
115#if !defined(CONFIG_SMP) && defined(CONFIG_CLASSIC_RCU)
116# ifdef CONFIG_PREEMPT
117 VM_BUG_ON(!in_atomic());
118# endif
119
120
121
122
123
124
125
126
127
128 VM_BUG_ON(page_count(page) == 0);
129 atomic_inc(&page->_count);
130
131#else
132 if (unlikely(!get_page_unless_zero(page))) {
133
134
135
136
137
138 return 0;
139 }
140#endif
141 VM_BUG_ON(PageTail(page));
142
143 return 1;
144}
145
146
147
148
149static inline int page_cache_add_speculative(struct page *page, int count)
150{
151 VM_BUG_ON(in_interrupt());
152
153#if !defined(CONFIG_SMP) && defined(CONFIG_CLASSIC_RCU)
154# ifdef CONFIG_PREEMPT
155 VM_BUG_ON(!in_atomic());
156# endif
157 VM_BUG_ON(page_count(page) == 0);
158 atomic_add(count, &page->_count);
159
160#else
161 if (unlikely(!atomic_add_unless(&page->_count, count, 0)))
162 return 0;
163#endif
164 VM_BUG_ON(PageCompound(page) && page != compound_head(page));
165
166 return 1;
167}
168
169static inline int page_freeze_refs(struct page *page, int count)
170{
171 return likely(atomic_cmpxchg(&page->_count, count, 0) == count);
172}
173
174static inline void page_unfreeze_refs(struct page *page, int count)
175{
176 VM_BUG_ON(page_count(page) != 0);
177 VM_BUG_ON(count == 0);
178
179 atomic_set(&page->_count, count);
180}
181
182#ifdef CONFIG_NUMA
183extern struct page *__page_cache_alloc(gfp_t gfp);
184#else
185static inline struct page *__page_cache_alloc(gfp_t gfp)
186{
187 return alloc_pages(gfp, 0);
188}
189#endif
190
191static inline struct page *page_cache_alloc(struct address_space *x)
192{
193 return __page_cache_alloc(mapping_gfp_mask(x));
194}
195
196static inline struct page *page_cache_alloc_cold(struct address_space *x)
197{
198 return __page_cache_alloc(mapping_gfp_mask(x)|__GFP_COLD);
199}
200
201typedef int filler_t(void *, struct page *);
202
203extern struct page * find_get_page(struct address_space *mapping,
204 pgoff_t index);
205extern struct page * find_lock_page(struct address_space *mapping,
206 pgoff_t index);
207extern struct page * find_or_create_page(struct address_space *mapping,
208 pgoff_t index, gfp_t gfp_mask);
209unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
210 unsigned int nr_pages, struct page **pages);
211unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start,
212 unsigned int nr_pages, struct page **pages);
213unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
214 int tag, unsigned int nr_pages, struct page **pages);
215
216struct page *grab_cache_page_write_begin(struct address_space *mapping,
217 pgoff_t index, unsigned flags);
218
219
220
221
222static inline struct page *grab_cache_page(struct address_space *mapping,
223 pgoff_t index)
224{
225 return find_or_create_page(mapping, index, mapping_gfp_mask(mapping));
226}
227
228extern struct page * grab_cache_page_nowait(struct address_space *mapping,
229 pgoff_t index);
230extern struct page * read_cache_page_async(struct address_space *mapping,
231 pgoff_t index, filler_t *filler,
232 void *data);
233extern struct page * read_cache_page(struct address_space *mapping,
234 pgoff_t index, filler_t *filler,
235 void *data);
236extern int read_cache_pages(struct address_space *mapping,
237 struct list_head *pages, filler_t *filler, void *data);
238
239static inline struct page *read_mapping_page_async(
240 struct address_space *mapping,
241 pgoff_t index, void *data)
242{
243 filler_t *filler = (filler_t *)mapping->a_ops->readpage;
244 return read_cache_page_async(mapping, index, filler, data);
245}
246
247static inline struct page *read_mapping_page(struct address_space *mapping,
248 pgoff_t index, void *data)
249{
250 filler_t *filler = (filler_t *)mapping->a_ops->readpage;
251 return read_cache_page(mapping, index, filler, data);
252}
253
254
255
256
257static inline loff_t page_offset(struct page *page)
258{
259 return ((loff_t)page->index) << PAGE_CACHE_SHIFT;
260}
261
262static inline pgoff_t linear_page_index(struct vm_area_struct *vma,
263 unsigned long address)
264{
265 pgoff_t pgoff = (address - vma->vm_start) >> PAGE_SHIFT;
266 pgoff += vma->vm_pgoff;
267 return pgoff >> (PAGE_CACHE_SHIFT - PAGE_SHIFT);
268}
269
270extern void __lock_page(struct page *page);
271extern int __lock_page_killable(struct page *page);
272extern void __lock_page_nosync(struct page *page);
273extern void unlock_page(struct page *page);
274
275static inline void set_page_locked(struct page *page)
276{
277 set_bit(PG_locked, &page->flags);
278}
279
280static inline void clear_page_locked(struct page *page)
281{
282 clear_bit(PG_locked, &page->flags);
283}
284
285static inline int trylock_page(struct page *page)
286{
287 return !test_and_set_bit(PG_locked, &page->flags);
288}
289
290
291
292
293static inline void lock_page(struct page *page)
294{
295 might_sleep();
296 if (!trylock_page(page))
297 __lock_page(page);
298}
299
300
301
302
303
304
305static inline int lock_page_killable(struct page *page)
306{
307 might_sleep();
308 if (!trylock_page(page))
309 return __lock_page_killable(page);
310 return 0;
311}
312
313
314
315
316
317static inline void lock_page_nosync(struct page *page)
318{
319 might_sleep();
320 if (!trylock_page(page))
321 __lock_page_nosync(page);
322}
323
324
325
326
327
328extern void wait_on_page_bit(struct page *page, int bit_nr);
329
330
331
332
333
334
335
336
337static inline void wait_on_page_locked(struct page *page)
338{
339 if (PageLocked(page))
340 wait_on_page_bit(page, PG_locked);
341}
342
343
344
345
346static inline void wait_on_page_writeback(struct page *page)
347{
348 if (PageWriteback(page))
349 wait_on_page_bit(page, PG_writeback);
350}
351
352extern void end_page_writeback(struct page *page);
353
354
355
356
357
358
359
360static inline int fault_in_pages_writeable(char __user *uaddr, int size)
361{
362 int ret;
363
364 if (unlikely(size == 0))
365 return 0;
366
367
368
369
370
371 ret = __put_user(0, uaddr);
372 if (ret == 0) {
373 char __user *end = uaddr + size - 1;
374
375
376
377
378
379 if (((unsigned long)uaddr & PAGE_MASK) !=
380 ((unsigned long)end & PAGE_MASK))
381 ret = __put_user(0, end);
382 }
383 return ret;
384}
385
386static inline int fault_in_pages_readable(const char __user *uaddr, int size)
387{
388 volatile char c;
389 int ret;
390
391 if (unlikely(size == 0))
392 return 0;
393
394 ret = __get_user(c, uaddr);
395 if (ret == 0) {
396 const char __user *end = uaddr + size - 1;
397
398 if (((unsigned long)uaddr & PAGE_MASK) !=
399 ((unsigned long)end & PAGE_MASK))
400 ret = __get_user(c, end);
401 }
402 return ret;
403}
404
405int add_to_page_cache_locked(struct page *page, struct address_space *mapping,
406 pgoff_t index, gfp_t gfp_mask);
407int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
408 pgoff_t index, gfp_t gfp_mask);
409extern void remove_from_page_cache(struct page *page);
410extern void __remove_from_page_cache(struct page *page);
411
412
413
414
415
416static inline int add_to_page_cache(struct page *page,
417 struct address_space *mapping, pgoff_t offset, gfp_t gfp_mask)
418{
419 int error;
420
421 set_page_locked(page);
422 error = add_to_page_cache_locked(page, mapping, offset, gfp_mask);
423 if (unlikely(error))
424 clear_page_locked(page);
425 return error;
426}
427
428#endif
429