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 
  17 extern struct page * page_hash_table[PAGE_HASH_SIZE];
  18 
  19 static inline unsigned long _page_hashfn(struct inode * inode, unsigned long offset)
     /* [previous][next][first][last][top][bottom][index][help] */
  20 {
  21         offset ^= (unsigned long) inode;
  22         return offset % PAGE_HASH_SIZE;
  23 }
  24 
  25 #define page_hash(inode,offset) page_hash_table[_page_hashfn(inode,offset)]
  26 
  27 static inline struct page * find_page(struct inode * inode, unsigned long offset)
     /* [previous][next][first][last][top][bottom][index][help] */
  28 {
  29         struct page *page;
  30 
  31         for (page = page_hash(inode, offset); page ; page = page->next_hash) {
  32                 if (page->inode != inode)
  33                         continue;
  34                 if (page->offset != offset)
  35                         continue;
  36                 break;
  37         }
  38         return page;
  39 }
  40 
  41 static inline void remove_page_from_hash_queue(struct page * page)
     /* [previous][next][first][last][top][bottom][index][help] */
  42 {
  43         struct page **p = &page_hash(page->inode,page->offset);
  44 
  45         if (page->next_hash)
  46                 page->next_hash->prev_hash = page->prev_hash;
  47         if (page->prev_hash)
  48                 page->prev_hash->next_hash = page->next_hash;
  49         if (*p == page)
  50                 *p = page->next_hash;
  51         page->next_hash = page->prev_hash = NULL;
  52 }
  53 
  54 static inline void add_page_to_hash_queue(struct inode * inode, struct page * page)
     /* [previous][next][first][last][top][bottom][index][help] */
  55 {
  56         struct page **p = &page_hash(inode,page->offset);
  57 
  58         page->prev_hash = NULL;
  59         if ((page->next_hash = *p) != NULL)
  60                 page->next_hash->prev_hash = page;
  61         *p = page;
  62 }
  63 
  64 static inline void remove_page_from_inode_queue(struct page * page)
     /* [previous][next][first][last][top][bottom][index][help] */
  65 {
  66         struct inode * inode = page->inode;
  67 
  68         page->inode = NULL;
  69         inode->i_nrpages--;
  70         if (inode->i_pages == page)
  71                 inode->i_pages = page->next;
  72         if (page->next)
  73                 page->next->prev = page->prev;
  74         if (page->prev)
  75                 page->prev->next = page->next;
  76         page->next = NULL;
  77         page->prev = NULL;
  78 }
  79 
  80 static inline void add_page_to_inode_queue(struct inode * inode, struct page * page)
     /* [previous][next][first][last][top][bottom][index][help] */
  81 {
  82         struct page **p = &inode->i_pages;
  83 
  84         inode->i_nrpages++;
  85         page->inode = inode;
  86         page->prev = NULL;
  87         if ((page->next = *p) != NULL)
  88                 page->next->prev = page;
  89         *p = page;
  90 }
  91 
  92 #endif

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