Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 128534
b: refs/heads/master
c: 09be207
h: refs/heads/master
v: v3
  • Loading branch information
Chris Mason committed Sep 25, 2008
1 parent adb882f commit c9a9496
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 27 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0da5468f4724a59e745d938395beffe830c424ee
refs/heads/master: 09be207d1ba224531a61de9afdc07a125e45318c
56 changes: 30 additions & 26 deletions trunk/fs/btrfs/extent_map.c
Original file line number Diff line number Diff line change
Expand Up @@ -2106,25 +2106,17 @@ static struct extent_buffer *__alloc_extent_buffer(struct extent_map_tree *tree,

spin_lock(&tree->lru_lock);
eb = find_lru(tree, start, len);
if (eb) {
goto lru_add;
}
spin_unlock(&tree->lru_lock);

if (eb) {
memset(eb, 0, sizeof(*eb));
} else {
eb = kmem_cache_zalloc(extent_buffer_cache, mask);
return eb;
}

eb = kmem_cache_zalloc(extent_buffer_cache, mask);
INIT_LIST_HEAD(&eb->lru);
eb->start = start;
eb->len = len;
atomic_set(&eb->refs, 1);

spin_lock(&tree->lru_lock);
lru_add:
add_lru(tree, eb);
spin_unlock(&tree->lru_lock);
return eb;
}

Expand All @@ -2151,7 +2143,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree,
return NULL;

if (eb->flags & EXTENT_BUFFER_FILLED)
return eb;
goto lru_add;

if (page0) {
eb->first_page = page0;
Expand All @@ -2169,11 +2161,6 @@ struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree,
p = find_or_create_page(mapping, index, mask | __GFP_HIGHMEM);
if (!p) {
WARN_ON(1);
/* make sure the free only frees the pages we've
* grabbed a reference on
*/
eb->len = i << PAGE_CACHE_SHIFT;
eb->start &= ~((u64)PAGE_CACHE_SIZE - 1);
goto fail;
}
set_page_extent_mapped(p);
Expand All @@ -2192,9 +2179,20 @@ struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree,
if (uptodate)
eb->flags |= EXTENT_UPTODATE;
eb->flags |= EXTENT_BUFFER_FILLED;

lru_add:
spin_lock(&tree->lru_lock);
add_lru(tree, eb);
spin_unlock(&tree->lru_lock);
return eb;

fail:
free_extent_buffer(eb);
if (!atomic_dec_and_test(&eb->refs))
return NULL;
for (index = 0; index < i; index++) {
page_cache_release(extent_buffer_page(eb, index));
}
__free_extent_buffer(eb);
return NULL;
}
EXPORT_SYMBOL(alloc_extent_buffer);
Expand All @@ -2204,7 +2202,8 @@ struct extent_buffer *find_extent_buffer(struct extent_map_tree *tree,
gfp_t mask)
{
unsigned long num_pages = num_extent_pages(start, len);
unsigned long i; unsigned long index = start >> PAGE_CACHE_SHIFT;
unsigned long i;
unsigned long index = start >> PAGE_CACHE_SHIFT;
struct extent_buffer *eb;
struct page *p;
struct address_space *mapping = tree->mapping;
Expand All @@ -2215,16 +2214,11 @@ struct extent_buffer *find_extent_buffer(struct extent_map_tree *tree,
return NULL;

if (eb->flags & EXTENT_BUFFER_FILLED)
return eb;
goto lru_add;

for (i = 0; i < num_pages; i++, index++) {
p = find_lock_page(mapping, index);
if (!p) {
/* make sure the free only frees the pages we've
* grabbed a reference on
*/
eb->len = i << PAGE_CACHE_SHIFT;
eb->start &= ~((u64)PAGE_CACHE_SIZE - 1);
goto fail;
}
set_page_extent_mapped(p);
Expand All @@ -2245,9 +2239,19 @@ struct extent_buffer *find_extent_buffer(struct extent_map_tree *tree,
if (uptodate)
eb->flags |= EXTENT_UPTODATE;
eb->flags |= EXTENT_BUFFER_FILLED;

lru_add:
spin_lock(&tree->lru_lock);
add_lru(tree, eb);
spin_unlock(&tree->lru_lock);
return eb;
fail:
free_extent_buffer(eb);
if (!atomic_dec_and_test(&eb->refs))
return NULL;
for (index = 0; index < i; index++) {
page_cache_release(extent_buffer_page(eb, index));
}
__free_extent_buffer(eb);
return NULL;
}
EXPORT_SYMBOL(find_extent_buffer);
Expand Down

0 comments on commit c9a9496

Please sign in to comment.