diff options
author | Chris Mason <clm@fb.com> | 2015-10-22 04:00:38 +0200 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2015-10-22 04:00:38 +0200 |
commit | a9e6d153563d2ed69c6cd7fb4fa5ce4ca7c712eb (patch) | |
tree | 43fab2a259934e1f1dde9607610424d6089dba5e /fs/btrfs/inode.c | |
parent | btrfs: qgroup: Check if qgroup reserved space leaked (diff) | |
parent | Btrfs: don't do extra bitmap search in one bit case (diff) | |
download | linux-a9e6d153563d2ed69c6cd7fb4fa5ce4ca7c712eb.tar.xz linux-a9e6d153563d2ed69c6cd7fb4fa5ce4ca7c712eb.zip |
Merge branch 'allocator-fixes' into for-linus-4.4
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index df6b93f6b393..a018e4707dac 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -9745,6 +9745,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, u64 cur_offset = start; u64 i_size; u64 cur_bytes; + u64 last_alloc = (u64)-1; int ret = 0; bool own_trans = true; @@ -9761,6 +9762,13 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, cur_bytes = min(num_bytes, 256ULL * 1024 * 1024); cur_bytes = max(cur_bytes, min_size); + /* + * If we are severely fragmented we could end up with really + * small allocations, so if the allocator is returning small + * chunks lets make its job easier by only searching for those + * sized chunks. + */ + cur_bytes = min(cur_bytes, last_alloc); ret = btrfs_reserve_extent(root, cur_bytes, min_size, 0, *alloc_hint, &ins, 1, 0); if (ret) { @@ -9769,6 +9777,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, break; } + last_alloc = ins.offset; ret = insert_reserved_file_extent(trans, inode, cur_offset, ins.objectid, ins.offset, ins.offset, |