|
@@ -4598,11 +4598,11 @@ static inline void btrfs_release_extent_buffer(struct extent_buffer *eb)
|
|
|
|
|
|
static struct extent_buffer *
|
|
|
__alloc_extent_buffer(struct btrfs_fs_info *fs_info, u64 start,
|
|
|
- unsigned long len, gfp_t mask)
|
|
|
+ unsigned long len)
|
|
|
{
|
|
|
struct extent_buffer *eb = NULL;
|
|
|
|
|
|
- eb = kmem_cache_zalloc(extent_buffer_cache, mask);
|
|
|
+ eb = kmem_cache_zalloc(extent_buffer_cache, GFP_NOFS);
|
|
|
if (eb == NULL)
|
|
|
return NULL;
|
|
|
eb->start = start;
|
|
@@ -4643,7 +4643,7 @@ struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src)
|
|
|
struct extent_buffer *new;
|
|
|
unsigned long num_pages = num_extent_pages(src->start, src->len);
|
|
|
|
|
|
- new = __alloc_extent_buffer(NULL, src->start, src->len, GFP_NOFS);
|
|
|
+ new = __alloc_extent_buffer(src->fs_info, src->start, src->len);
|
|
|
if (new == NULL)
|
|
|
return NULL;
|
|
|
|
|
@@ -4666,13 +4666,26 @@ struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src)
|
|
|
return new;
|
|
|
}
|
|
|
|
|
|
-struct extent_buffer *alloc_dummy_extent_buffer(u64 start, unsigned long len)
|
|
|
+struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
|
|
|
+ u64 start)
|
|
|
{
|
|
|
struct extent_buffer *eb;
|
|
|
- unsigned long num_pages = num_extent_pages(0, len);
|
|
|
+ unsigned long len;
|
|
|
+ unsigned long num_pages;
|
|
|
unsigned long i;
|
|
|
|
|
|
- eb = __alloc_extent_buffer(NULL, start, len, GFP_NOFS);
|
|
|
+ if (!fs_info) {
|
|
|
+ /*
|
|
|
+ * Called only from tests that don't always have a fs_info
|
|
|
+ * available, but we know that nodesize is 4096
|
|
|
+ */
|
|
|
+ len = 4096;
|
|
|
+ } else {
|
|
|
+ len = fs_info->tree_root->nodesize;
|
|
|
+ }
|
|
|
+ num_pages = num_extent_pages(0, len);
|
|
|
+
|
|
|
+ eb = __alloc_extent_buffer(fs_info, start, len);
|
|
|
if (!eb)
|
|
|
return NULL;
|
|
|
|
|
@@ -4762,7 +4775,7 @@ struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info,
|
|
|
|
|
|
#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
|
|
|
struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info,
|
|
|
- u64 start, unsigned long len)
|
|
|
+ u64 start)
|
|
|
{
|
|
|
struct extent_buffer *eb, *exists = NULL;
|
|
|
int ret;
|
|
@@ -4770,7 +4783,7 @@ struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info,
|
|
|
eb = find_extent_buffer(fs_info, start);
|
|
|
if (eb)
|
|
|
return eb;
|
|
|
- eb = alloc_dummy_extent_buffer(start, len);
|
|
|
+ eb = alloc_dummy_extent_buffer(fs_info, start);
|
|
|
if (!eb)
|
|
|
return NULL;
|
|
|
eb->fs_info = fs_info;
|
|
@@ -4808,8 +4821,9 @@ free_eb:
|
|
|
#endif
|
|
|
|
|
|
struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
|
|
|
- u64 start, unsigned long len)
|
|
|
+ u64 start)
|
|
|
{
|
|
|
+ unsigned long len = fs_info->tree_root->nodesize;
|
|
|
unsigned long num_pages = num_extent_pages(start, len);
|
|
|
unsigned long i;
|
|
|
unsigned long index = start >> PAGE_CACHE_SHIFT;
|
|
@@ -4824,7 +4838,7 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
|
|
|
if (eb)
|
|
|
return eb;
|
|
|
|
|
|
- eb = __alloc_extent_buffer(fs_info, start, len, GFP_NOFS);
|
|
|
+ eb = __alloc_extent_buffer(fs_info, start, len);
|
|
|
if (!eb)
|
|
|
return NULL;
|
|
|
|