|
@@ -5103,6 +5103,7 @@ static long btrfs_fallocate(struct inode *inode, int mode,
|
|
|
u64 mask = BTRFS_I(inode)->root->sectorsize - 1;
|
|
|
struct extent_map *em;
|
|
|
struct btrfs_trans_handle *trans;
|
|
|
+ struct btrfs_root *root;
|
|
|
int ret;
|
|
|
|
|
|
alloc_start = offset & ~mask;
|
|
@@ -5121,6 +5122,13 @@ static long btrfs_fallocate(struct inode *inode, int mode,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ root = BTRFS_I(inode)->root;
|
|
|
+
|
|
|
+ ret = btrfs_check_data_free_space(root, inode,
|
|
|
+ alloc_end - alloc_start);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+
|
|
|
locked_end = alloc_end - 1;
|
|
|
while (1) {
|
|
|
struct btrfs_ordered_extent *ordered;
|
|
@@ -5128,7 +5136,7 @@ static long btrfs_fallocate(struct inode *inode, int mode,
|
|
|
trans = btrfs_start_transaction(BTRFS_I(inode)->root, 1);
|
|
|
if (!trans) {
|
|
|
ret = -EIO;
|
|
|
- goto out;
|
|
|
+ goto out_free;
|
|
|
}
|
|
|
|
|
|
/* the extent lock is ordered inside the running
|
|
@@ -5189,6 +5197,8 @@ static long btrfs_fallocate(struct inode *inode, int mode,
|
|
|
GFP_NOFS);
|
|
|
|
|
|
btrfs_end_transaction(trans, BTRFS_I(inode)->root);
|
|
|
+out_free:
|
|
|
+ btrfs_free_reserved_data_space(root, inode, alloc_end - alloc_start);
|
|
|
out:
|
|
|
mutex_unlock(&inode->i_mutex);
|
|
|
return ret;
|