Merge branch 'master'
[pandora-kernel.git] / mm / filemap.c
index 3ef2073..82c4488 100644 (file)
@@ -697,6 +697,38 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
        return ret;
 }
 
+/**
+ * find_get_pages_contig - gang contiguous pagecache lookup
+ * @mapping:   The address_space to search
+ * @index:     The starting page index
+ * @nr_pages:  The maximum number of pages
+ * @pages:     Where the resulting pages are placed
+ *
+ * find_get_pages_contig() works exactly like find_get_pages(), except
+ * that the returned number of pages are guaranteed to be contiguous.
+ *
+ * find_get_pages_contig() returns the number of pages which were found.
+ */
+unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t index,
+                              unsigned int nr_pages, struct page **pages)
+{
+       unsigned int i;
+       unsigned int ret;
+
+       read_lock_irq(&mapping->tree_lock);
+       ret = radix_tree_gang_lookup(&mapping->page_tree,
+                               (void **)pages, index, nr_pages);
+       for (i = 0; i < ret; i++) {
+               if (pages[i]->mapping == NULL || pages[i]->index != index)
+                       break;
+
+               page_cache_get(pages[i]);
+               index++;
+       }
+       read_unlock_irq(&mapping->tree_lock);
+       return i;
+}
+
 /*
  * Like find_get_pages, except we only return pages which are tagged with
  * `tag'.   We update *index to index the next page for the traversal.
@@ -1012,6 +1044,7 @@ success:
        desc->arg.buf += size;
        return size;
 }
+EXPORT_SYMBOL(file_read_actor);
 
 /*
  * This is the "read()" routine for all filesystems