PNP: define PNP-specific IORESOURCE_IO_* flags alongside IRQ, DMA, MEM
[sfrench/cifs-2.6.git] / include / linux / pagemap.h
index 8a83537d69785117201334798bd02cc077cac06b..d2fca802f809972a9b9b05171e02fa78fa054de7 100644 (file)
@@ -84,11 +84,11 @@ static inline struct page *page_cache_alloc_cold(struct address_space *x)
 typedef int filler_t(void *, struct page *);
 
 extern struct page * find_get_page(struct address_space *mapping,
-                               unsigned long index);
+                               pgoff_t index);
 extern struct page * find_lock_page(struct address_space *mapping,
-                               unsigned long index);
+                               pgoff_t index);
 extern struct page * find_or_create_page(struct address_space *mapping,
-                               unsigned long index, gfp_t gfp_mask);
+                               pgoff_t index, gfp_t gfp_mask);
 unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
                        unsigned int nr_pages, struct page **pages);
 unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start,
@@ -96,44 +96,47 @@ unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start,
 unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
                        int tag, unsigned int nr_pages, struct page **pages);
 
+struct page *__grab_cache_page(struct address_space *mapping, pgoff_t index);
+
 /*
  * Returns locked page at given index in given cache, creating it if needed.
  */
-static inline struct page *grab_cache_page(struct address_space *mapping, unsigned long index)
+static inline struct page *grab_cache_page(struct address_space *mapping,
+                                                               pgoff_t index)
 {
        return find_or_create_page(mapping, index, mapping_gfp_mask(mapping));
 }
 
 extern struct page * grab_cache_page_nowait(struct address_space *mapping,
-                               unsigned long index);
+                               pgoff_t index);
 extern struct page * read_cache_page_async(struct address_space *mapping,
-                               unsigned long index, filler_t *filler,
+                               pgoff_t index, filler_t *filler,
                                void *data);
 extern struct page * read_cache_page(struct address_space *mapping,
-                               unsigned long index, filler_t *filler,
+                               pgoff_t index, filler_t *filler,
                                void *data);
 extern int read_cache_pages(struct address_space *mapping,
                struct list_head *pages, filler_t *filler, void *data);
 
 static inline struct page *read_mapping_page_async(
                                                struct address_space *mapping,
-                                            unsigned long index, void *data)
+                                                    pgoff_t index, void *data)
 {
        filler_t *filler = (filler_t *)mapping->a_ops->readpage;
        return read_cache_page_async(mapping, index, filler, data);
 }
 
 static inline struct page *read_mapping_page(struct address_space *mapping,
-                                            unsigned long index, void *data)
+                                            pgoff_t index, void *data)
 {
        filler_t *filler = (filler_t *)mapping->a_ops->readpage;
        return read_cache_page(mapping, index, filler, data);
 }
 
 int add_to_page_cache(struct page *page, struct address_space *mapping,
-                               unsigned long index, gfp_t gfp_mask);
+                               pgoff_t index, gfp_t gfp_mask);
 int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
-                               unsigned long index, gfp_t gfp_mask);
+                               pgoff_t index, gfp_t gfp_mask);
 extern void remove_from_page_cache(struct page *page);
 extern void __remove_from_page_cache(struct page *page);
 
@@ -153,9 +156,10 @@ static inline pgoff_t linear_page_index(struct vm_area_struct *vma,
        return pgoff >> (PAGE_CACHE_SHIFT - PAGE_SHIFT);
 }
 
-extern void FASTCALL(__lock_page(struct page *page));
-extern void FASTCALL(__lock_page_nosync(struct page *page));
-extern void FASTCALL(unlock_page(struct page *page));
+extern void __lock_page(struct page *page);
+extern int __lock_page_killable(struct page *page);
+extern void __lock_page_nosync(struct page *page);
+extern void unlock_page(struct page *page);
 
 /*
  * lock_page may only be called if we have the page's inode pinned.
@@ -167,6 +171,19 @@ static inline void lock_page(struct page *page)
                __lock_page(page);
 }
 
+/*
+ * lock_page_killable is like lock_page but can be interrupted by fatal
+ * signals.  It returns 0 if it locked the page and -EINTR if it was
+ * killed while waiting.
+ */
+static inline int lock_page_killable(struct page *page)
+{
+       might_sleep();
+       if (TestSetPageLocked(page))
+               return __lock_page_killable(page);
+       return 0;
+}
+
 /*
  * lock_page_nosync should only be used if we can't pin the page's inode.
  * Doesn't play quite so well with block device plugging.
@@ -182,7 +199,7 @@ static inline void lock_page_nosync(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));
+extern void wait_on_page_bit(struct page *page, int bit_nr);
 
 /* 
  * Wait for a page to be unlocked.
@@ -218,6 +235,9 @@ static inline int fault_in_pages_writeable(char __user *uaddr, int size)
 {
        int ret;
 
+       if (unlikely(size == 0))
+               return 0;
+
        /*
         * Writing zeroes into userspace here is OK, because we know that if
         * the zero gets there, we'll be overwriting it.
@@ -237,19 +257,23 @@ static inline int fault_in_pages_writeable(char __user *uaddr, int size)
        return ret;
 }
 
-static inline void fault_in_pages_readable(const char __user *uaddr, int size)
+static inline int fault_in_pages_readable(const char __user *uaddr, int size)
 {
        volatile char c;
        int ret;
 
+       if (unlikely(size == 0))
+               return 0;
+
        ret = __get_user(c, uaddr);
        if (ret == 0) {
                const char __user *end = uaddr + size - 1;
 
                if (((unsigned long)uaddr & PAGE_MASK) !=
                                ((unsigned long)end & PAGE_MASK))
-                       __get_user(c, end);
+                       ret = __get_user(c, end);
        }
+       return ret;
 }
 
 #endif /* _LINUX_PAGEMAP_H */