Commit 154ea289 authored by Chris Mason's avatar Chris Mason

Btrfs: enforce min_bytes parameter during extent allocation

Commit 24542bf7 changed preallocation of
extents to cap the max size we try to allocate.  It's a valid change,
but the extent reservation code is also used by balance, and that
can't tolerate a smaller extent being allocated.

__btrfs_prealloc_file_range already has a min_size parameter, which is
used by relocation to request a specific extent size.  This commit
adds an extra check to enforce that minimum extent size.
Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
Reported-by: default avatarStefan Behrens <sbehrens@giantdisaster.de>
parent d7011f5b
...@@ -8502,6 +8502,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, ...@@ -8502,6 +8502,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
struct btrfs_key ins; struct btrfs_key ins;
u64 cur_offset = start; u64 cur_offset = start;
u64 i_size; u64 i_size;
u64 cur_bytes;
int ret = 0; int ret = 0;
bool own_trans = true; bool own_trans = true;
...@@ -8516,8 +8517,9 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, ...@@ -8516,8 +8517,9 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
} }
} }
ret = btrfs_reserve_extent(trans, root, cur_bytes = min(num_bytes, 256ULL * 1024 * 1024);
min(num_bytes, 256ULL * 1024 * 1024), cur_bytes = max(cur_bytes, min_size);
ret = btrfs_reserve_extent(trans, root, cur_bytes,
min_size, 0, *alloc_hint, &ins, 1); min_size, 0, *alloc_hint, &ins, 1);
if (ret) { if (ret) {
if (own_trans) if (own_trans)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment