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(struct address_space *mapping, pgoff_t index);
217
218
219
220
221static inline struct page *grab_cache_page(struct address_space *mapping,
222 pgoff_t index)
223{
224 return find_or_create_page(mapping, index, mapping_gfp_mask(mapping));
225}
226
227extern struct page * grab_cache_page_nowait(struct address_space *mapping,
228 pgoff_t index);
229extern struct page * read_cache_page_async(struct address_space *mapping,
230 pgoff_t index, filler_t *filler,
231 void *data);
232extern struct page * read_cache_page(struct address_space *mapping,
233 pgoff_t index, filler_t *filler,
234 void *data);
235extern int read_cache_pages(struct address_space *mapping,
236 struct list_head *pages, filler_t *filler, void *data);
237
238static inline struct page *read_mapping_page_async(
239 struct address_space *mapping,
240 pgoff_t index, void *data)
241{
242 filler_t *filler = (filler_t *)mapping->a_ops->readpage;
243 return read_cache_page_async(mapping, index, filler, data);
244}
245
246static inline struct page *read_mapping_page(struct address_space *mapping,
247 pgoff_t index, void *data)
248{
249 filler_t *filler = (filler_t *)mapping->a_ops->readpage;
250 return read_cache_page(mapping, index, filler, data);
251}
252
253
254
255
256static inline loff_t page_offset(struct page *page)
257{
258 return ((loff_t)page->index) << PAGE_CACHE_SHIFT;
259}
260
261static inline pgoff_t linear_page_index(struct vm_area_struct *vma,
262 unsigned long address)
263{
264 pgoff_t pgoff = (address - vma->vm_start) >> PAGE_SHIFT;
265 pgoff += vma->vm_pgoff;
266 return pgoff >> (PAGE_CACHE_SHIFT - PAGE_SHIFT);
267}
268
269extern void __lock_page(struct page *page);
270extern int __lock_page_killable(struct page *page);
271extern void __lock_page_nosync(struct page *page);
272extern void unlock_page(struct page *page);
273
274static inline void set_page_locked(struct page *page)
275{
276 set_bit(PG_locked, &page->flags);
277}
278
279static inline void clear_page_locked(struct page *page)
280{
281 clear_bit(PG_locked, &page->flags);
282}
283
284static inline int trylock_page(struct page *page)
285{
286 return !test_and_set_bit(PG_locked, &page->flags);
287}
288
289
290
291
292static inline void lock_page(struct page *page)
293{
294 might_sleep();
295 if (!trylock_page(page))
296 __lock_page(page);
297}
298
299
300
301
302
303
304static inline int lock_page_killable(struct page *page)
305{
306 might_sleep();
307 if (!trylock_page(page))
308 return __lock_page_killable(page);
309 return 0;
310}
311
312
313
314
315
316static inline void lock_page_nosync(struct page *page)
317{
318 might_sleep();
319 if (!trylock_page(page))
320 __lock_page_nosync(page);
321}
322
323
324
325
326
327extern void wait_on_page_bit(struct page *page, int bit_nr);
328
329
330
331
332
333
334
335
336static inline void wait_on_page_locked(struct page *page)
337{
338 if (PageLocked(page))
339 wait_on_page_bit(page, PG_locked);
340}
341
342
343
344
345static inline void wait_on_page_writeback(struct page *page)
346{
347 if (PageWriteback(page))
348 wait_on_page_bit(page, PG_writeback);
349}
350
351extern void end_page_writeback(struct page *page);
352
353
354
355
356
357
358
359static inline int fault_in_pages_writeable(char __user *uaddr, int size)
360{
361 int ret;
362
363 if (unlikely(size == 0))
364 return 0;
365
366
367
368
369
370 ret = __put_user(0, uaddr);
371 if (ret == 0) {
372 char __user *end = uaddr + size - 1;
373
374
375
376
377
378 if (((unsigned long)uaddr & PAGE_MASK) !=
379 ((unsigned long)end & PAGE_MASK))
380 ret = __put_user(0, end);
381 }
382 return ret;
383}
384
385static inline int fault_in_pages_readable(const char __user *uaddr, int size)
386{
387 volatile char c;
388 int ret;
389
390 if (unlikely(size == 0))
391 return 0;
392
393 ret = __get_user(c, uaddr);
394 if (ret == 0) {
395 const char __user *end = uaddr + size - 1;
396
397 if (((unsigned long)uaddr & PAGE_MASK) !=
398 ((unsigned long)end & PAGE_MASK))
399 ret = __get_user(c, end);
400 }
401 return ret;
402}
403
404int add_to_page_cache_locked(struct page *page, struct address_space *mapping,
405 pgoff_t index, gfp_t gfp_mask);
406int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
407 pgoff_t index, gfp_t gfp_mask);
408extern void remove_from_page_cache(struct page *page);
409extern void __remove_from_page_cache(struct page *page);
410
411
412
413
414
415static inline int add_to_page_cache(struct page *page,
416 struct address_space *mapping, pgoff_t offset, gfp_t gfp_mask)
417{
418 int error;
419
420 set_page_locked(page);
421 error = add_to_page_cache_locked(page, mapping, offset, gfp_mask);
422 if (unlikely(error))
423 clear_page_locked(page);
424 return error;
425}
426
427#endif
428