#ifndef _LINUX_PAGEMAP_H #define _LINUX_PAGEMAP_H /* * Copyright 1995 Linus Torvalds */ #include #include #include #include /* * The page cache can done in larger chunks than * one page, because it allows for more efficient * throughput (it can then be mapped into user * space in smaller chunks for same flexibility). * * Or rather, it _will_ be done in larger chunks. */ #define PAGE_CACHE_SHIFT PAGE_SHIFT #define PAGE_CACHE_SIZE PAGE_SIZE #define PAGE_CACHE_MASK PAGE_MASK #define PAGE_CACHE_ALIGN(addr) (((addr)+PAGE_CACHE_SIZE-1)&PAGE_CACHE_MASK) #define page_cache_get(x) get_page(x) extern void FASTCALL(page_cache_release(struct page *)); static inline struct page *page_cache_alloc(struct address_space *x) { return alloc_pages(x->gfp_mask, 0); } typedef int filler_t(void *, struct page *); extern struct page * find_get_page(struct address_space *mapping, unsigned long index); extern struct page * find_lock_page(struct address_space *mapping, unsigned long index); extern struct page * find_trylock_page(struct address_space *mapping, unsigned long index); extern struct page * find_or_create_page(struct address_space *mapping, unsigned long index, unsigned int gfp_mask); extern struct page * grab_cache_page(struct address_space *mapping, unsigned long index); extern struct page * grab_cache_page_nowait(struct address_space *mapping, unsigned long index); extern struct page * read_cache_page(struct address_space *mapping, unsigned long index, filler_t *filler, void *data); extern int add_to_page_cache(struct page *page, struct address_space *mapping, unsigned long index); static inline void ___add_to_page_cache(struct page *page, struct address_space *mapping, unsigned long index) { list_add(&page->list, &mapping->clean_pages); page->mapping = mapping; page->index = index; mapping->nrpages++; inc_page_state(nr_pagecache); } extern void FASTCALL(lock_page(struct page *page)); extern void FASTCALL(unlock_page(struct page *page)); /* * This is exported only for wait_on_page_locked/wait_on_page_writeback. * Never use this directly! */ extern void FASTCALL(wait_on_page_bit(struct page *page, int bit_nr)); /* * Wait for a page to be unlocked. * * This must be called with the caller "holding" the page, * ie with increased "page->count" so that the page won't * go away during the wait.. */ static inline void wait_on_page_locked(struct page *page) { if (PageLocked(page)) wait_on_page_bit(page, PG_locked); } /* * Wait for a page to complete writeback */ static inline void wait_on_page_writeback(struct page *page) { if (PageWriteback(page)) wait_on_page_bit(page, PG_writeback); } extern void end_page_writeback(struct page *page); #endif /* _LINUX_PAGEMAP_H */