aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/free-space-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/free-space-tree.c')
-rw-r--r--fs/btrfs/free-space-tree.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/btrfs/free-space-tree.c b/fs/btrfs/free-space-tree.c
index 393e36bd5845..0f33d58cb321 100644
--- a/fs/btrfs/free-space-tree.c
+++ b/fs/btrfs/free-space-tree.c
@@ -153,6 +153,20 @@ static inline u32 free_space_bitmap_size(u64 size, u32 sectorsize)
153 153
154static unsigned long *alloc_bitmap(u32 bitmap_size) 154static unsigned long *alloc_bitmap(u32 bitmap_size)
155{ 155{
156 void *mem;
157
158 /*
159 * The allocation size varies, observed numbers were < 4K up to 16K.
160 * Using vmalloc unconditionally would be too heavy, we'll try
161 * contiguous allocations first.
162 */
163 if (bitmap_size <= PAGE_SIZE)
164 return kzalloc(bitmap_size, GFP_NOFS);
165
166 mem = kzalloc(bitmap_size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOWARN);
167 if (mem)
168 return mem;
169
156 return __vmalloc(bitmap_size, GFP_NOFS | __GFP_HIGHMEM | __GFP_ZERO, 170 return __vmalloc(bitmap_size, GFP_NOFS | __GFP_HIGHMEM | __GFP_ZERO,
157 PAGE_KERNEL); 171 PAGE_KERNEL);
158} 172}
@@ -289,7 +303,7 @@ int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,
289 303
290 ret = 0; 304 ret = 0;
291out: 305out:
292 vfree(bitmap); 306 kvfree(bitmap);
293 if (ret) 307 if (ret)
294 btrfs_abort_transaction(trans, root, ret); 308 btrfs_abort_transaction(trans, root, ret);
295 return ret; 309 return ret;
@@ -438,7 +452,7 @@ int convert_free_space_to_extents(struct btrfs_trans_handle *trans,
438 452
439 ret = 0; 453 ret = 0;
440out: 454out:
441 vfree(bitmap); 455 kvfree(bitmap);
442 if (ret) 456 if (ret)
443 btrfs_abort_transaction(trans, root, ret); 457 btrfs_abort_transaction(trans, root, ret);
444 return ret; 458 return ret;