|
@@ -1615,10 +1615,6 @@ static long btrfs_fallocate(struct file *file, int mode,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start);
|
|
|
- if (ret)
|
|
|
- goto out;
|
|
|
-
|
|
|
locked_end = alloc_end - 1;
|
|
|
while (1) {
|
|
|
struct btrfs_ordered_extent *ordered;
|
|
@@ -1664,11 +1660,27 @@ static long btrfs_fallocate(struct file *file, int mode,
|
|
|
if (em->block_start == EXTENT_MAP_HOLE ||
|
|
|
(cur_offset >= inode->i_size &&
|
|
|
!test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) {
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Make sure we have enough space before we do the
|
|
|
+ * allocation.
|
|
|
+ */
|
|
|
+ ret = btrfs_check_data_free_space(inode, last_byte -
|
|
|
+ cur_offset);
|
|
|
+ if (ret) {
|
|
|
+ free_extent_map(em);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
ret = btrfs_prealloc_file_range(inode, mode, cur_offset,
|
|
|
last_byte - cur_offset,
|
|
|
1 << inode->i_blkbits,
|
|
|
offset + len,
|
|
|
&alloc_hint);
|
|
|
+
|
|
|
+ /* Let go of our reservation. */
|
|
|
+ btrfs_free_reserved_data_space(inode, last_byte -
|
|
|
+ cur_offset);
|
|
|
if (ret < 0) {
|
|
|
free_extent_map(em);
|
|
|
break;
|
|
@@ -1694,8 +1706,6 @@ static long btrfs_fallocate(struct file *file, int mode,
|
|
|
}
|
|
|
unlock_extent_cached(&BTRFS_I(inode)->io_tree, alloc_start, locked_end,
|
|
|
&cached_state, GFP_NOFS);
|
|
|
-
|
|
|
- btrfs_free_reserved_data_space(inode, alloc_end - alloc_start);
|
|
|
out:
|
|
|
mutex_unlock(&inode->i_mutex);
|
|
|
return ret;
|