+static struct extent_buffer *__alloc_extent_buffer(gfp_t mask)
+{
+ struct extent_buffer *eb = NULL;
+ spin_lock(&extent_buffers_lock);
+ if (!list_empty(&extent_buffers)) {
+ eb = list_entry(extent_buffers.next, struct extent_buffer,
+ list);
+ list_del(&eb->list);
+ WARN_ON(nr_extent_buffers == 0);
+ nr_extent_buffers--;
+ }
+ spin_unlock(&extent_buffers_lock);
+ if (eb) {
+ memset(eb, 0, sizeof(*eb));
+ return eb;
+ }
+ return kmem_cache_zalloc(extent_buffer_cache, mask);
+}
+
+static void __free_extent_buffer(struct extent_buffer *eb)
+{
+ if (nr_extent_buffers >= MAX_EXTENT_BUFFER_CACHE) {
+ kmem_cache_free(extent_buffer_cache, eb);
+ } else {
+ spin_lock(&extent_buffers_lock);
+ list_add(&eb->list, &extent_buffers);
+ nr_extent_buffers++;
+ spin_unlock(&extent_buffers_lock);
+ }
+}
+
+static inline struct page *extent_buffer_page(struct extent_buffer *eb, int i)
+{
+ struct page *p;
+ if (i == 0)
+ return eb->first_page;
+ i += eb->start >> PAGE_CACHE_SHIFT;
+ p = find_get_page(eb->first_page->mapping, i);
+ page_cache_release(p);
+ return p;
+}
+