root/include/linux/pagemap.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. page_address
  2. _page_hashfn
  3. find_page
  4. remove_page_from_hash_queue
  5. add_page_to_hash_queue
  6. remove_page_from_inode_queue
  7. add_page_to_inode_queue

   1 #ifndef _LINUX_PAGEMAP_H
   2 #define _LINUX_PAGEMAP_H
   3 
   4 /*
   5  * Page-mapping primitive inline functions
   6  *
   7  * Copyright 1995 Linus Torvalds
   8  */
   9 
  10 static inline unsigned long page_address(struct page * page)
     /* [previous][next][first][last][top][bottom][index][help] */
  11 {
  12         return PAGE_OFFSET + PAGE_SIZE*(page - mem_map);
  13 }
  14 
  15 #define PAGE_HASH_SIZE 257
  16 #define PAGE_AGE_VALUE 16
  17 
  18 extern unsigned long page_cache_size;
  19 extern struct page * page_hash_table[PAGE_HASH_SIZE];
  20 
  21 static inline unsigned long _page_hashfn(struct inode * inode, unsigned long offset)
     /* [previous][next][first][last][top][bottom][index][help] */
  22 {
  23         offset ^= (unsigned long) inode;
  24         return offset % PAGE_HASH_SIZE;
  25 }
  26 
  27 #define page_hash(inode,offset) page_hash_table[_page_hashfn(inode,offset)]
  28 
  29 static inline struct page * find_page(struct inode * inode, unsigned long offset)
     /* [previous][next][first][last][top][bottom][index][help] */
  30 {
  31         struct page *page;
  32 
  33         for (page = page_hash(inode, offset); page ; page = page->next_hash) {
  34                 if (page->inode != inode)
  35                         continue;
  36                 if (page->offset != offset)
  37                         continue;
  38                 page->age = PAGE_AGE_VALUE | (page->age >> 1);
  39                 break;
  40         }
  41         return page;
  42 }
  43 
  44 static inline void remove_page_from_hash_queue(struct page * page)
     /* [previous][next][first][last][top][bottom][index][help] */
  45 {
  46         struct page **p = &page_hash(page->inode,page->offset);
  47 
  48         page_cache_size--;
  49         if (page->next_hash)
  50                 page->next_hash->prev_hash = page->prev_hash;
  51         if (page->prev_hash)
  52                 page->prev_hash->next_hash = page->next_hash;
  53         if (*p == page)
  54                 *p = page->next_hash;
  55         page->next_hash = page->prev_hash = NULL;
  56 }
  57 
  58 static inline void add_page_to_hash_queue(struct inode * inode, struct page * page)
     /* [previous][next][first][last][top][bottom][index][help] */
  59 {
  60         struct page **p = &page_hash(inode,page->offset);
  61 
  62         page_cache_size++;
  63         page->age = PAGE_AGE_VALUE;
  64         page->prev_hash = NULL;
  65         if ((page->next_hash = *p) != NULL)
  66                 page->next_hash->prev_hash = page;
  67         *p = page;
  68 }
  69 
  70 static inline void remove_page_from_inode_queue(struct page * page)
     /* [previous][next][first][last][top][bottom][index][help] */
  71 {
  72         struct inode * inode = page->inode;
  73 
  74         page->inode = NULL;
  75         inode->i_nrpages--;
  76         if (inode->i_pages == page)
  77                 inode->i_pages = page->next;
  78         if (page->next)
  79                 page->next->prev = page->prev;
  80         if (page->prev)
  81                 page->prev->next = page->next;
  82         page->next = NULL;
  83         page->prev = NULL;
  84 }
  85 
  86 static inline void add_page_to_inode_queue(struct inode * inode, struct page * page)
     /* [previous][next][first][last][top][bottom][index][help] */
  87 {
  88         struct page **p = &inode->i_pages;
  89 
  90         inode->i_nrpages++;
  91         page->inode = inode;
  92         page->prev = NULL;
  93         if ((page->next = *p) != NULL)
  94                 page->next->prev = page;
  95         *p = page;
  96 }
  97 
  98 #endif

/* [previous][next][first][last][top][bottom][index][help] */