diff options
Diffstat (limited to 'include/linux/pagemap.h')
-rw-r--r-- | include/linux/pagemap.h | 79 |
1 files changed, 17 insertions, 62 deletions
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 218098416..c5a8af7c7 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -39,10 +39,10 @@ static inline unsigned long page_address(struct page * page) */ #define page_cache_entry(x) (mem_map + MAP_NR(x)) -#define PAGE_HASH_BITS 12 +#define PAGE_HASH_BITS 16 #define PAGE_HASH_SIZE (1 << PAGE_HASH_BITS) -extern unsigned long page_cache_size; /* # of pages currently in the hash table */ +extern atomic_t page_cache_size; /* # of pages currently in the hash table */ extern struct page * page_hash_table[PAGE_HASH_SIZE]; /* @@ -64,72 +64,25 @@ static inline unsigned long _page_hashfn(struct inode * inode, unsigned long off #define page_hash(inode,offset) (page_hash_table+_page_hashfn(inode,offset)) -static inline struct page * __find_page(struct inode * inode, unsigned long offset, struct page *page) -{ - goto inside; - for (;;) { - page = page->next_hash; -inside: - if (!page) - goto not_found; - if (page->inode != inode) - continue; - if (page->offset == offset) - break; - } - /* Found the page. */ - atomic_inc(&page->count); - set_bit(PG_referenced, &page->flags); -not_found: - return page; -} - -static inline struct page *find_page(struct inode * inode, unsigned long offset) -{ - return __find_page(inode, offset, *page_hash(inode, offset)); -} +extern struct page * __find_get_page (struct inode * inode, + unsigned long offset, struct page **hash); +#define find_get_page(inode, offset) \ + __find_get_page(inode, offset, page_hash(inode, offset)) +extern struct page * __find_lock_page (struct inode * inode, + unsigned long offset, struct page **hash); +extern void lock_page(struct page *page); +#define find_lock_page(inode, offset) \ + __find_lock_page(inode, offset, page_hash(inode, offset)) -static inline void remove_page_from_hash_queue(struct page * page) -{ - if(page->pprev_hash) { - if(page->next_hash) - page->next_hash->pprev_hash = page->pprev_hash; - *page->pprev_hash = page->next_hash; - page->pprev_hash = NULL; - } - page_cache_size--; -} +extern void __add_page_to_hash_queue(struct page * page, struct page **p); -static inline void __add_page_to_hash_queue(struct page * page, struct page **p) -{ - page_cache_size++; - if((page->next_hash = *p) != NULL) - (*p)->pprev_hash = &page->next_hash; - *p = page; - page->pprev_hash = p; -} +extern int add_to_page_cache_unique(struct page * page, struct inode * inode, unsigned long offset, struct page **hash); static inline void add_page_to_hash_queue(struct page * page, struct inode * inode, unsigned long offset) { __add_page_to_hash_queue(page, page_hash(inode,offset)); } -static inline void remove_page_from_inode_queue(struct page * page) -{ - struct inode * inode = page->inode; - - page->inode = NULL; - inode->i_nrpages--; - if (inode->i_pages == page) - inode->i_pages = page->next; - if (page->next) - page->next->prev = page->prev; - if (page->prev) - page->prev->next = page->next; - page->next = NULL; - page->prev = NULL; -} - static inline void add_page_to_inode_queue(struct inode * inode, struct page * page) { struct page **p = &inode->i_pages; @@ -142,11 +95,13 @@ static inline void add_page_to_inode_queue(struct inode * inode, struct page * p *p = page; } -extern void __wait_on_page(struct page *); +extern void ___wait_on_page(struct page *); + static inline void wait_on_page(struct page * page) { + if (PageLocked(page)) - __wait_on_page(page); + ___wait_on_page(page); } extern void update_vm_cache(struct inode *, unsigned long, const char *, int); |