diff options
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r-- | fs/btrfs/file.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index af1d0605a5c1..ade03e6f7bd2 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -591,6 +591,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
591 | } | 591 | } |
592 | compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 592 | compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
593 | clear_bit(EXTENT_FLAG_PINNED, &em->flags); | 593 | clear_bit(EXTENT_FLAG_PINNED, &em->flags); |
594 | clear_bit(EXTENT_FLAG_LOGGING, &flags); | ||
594 | remove_extent_mapping(em_tree, em); | 595 | remove_extent_mapping(em_tree, em); |
595 | if (no_splits) | 596 | if (no_splits) |
596 | goto next; | 597 | goto next; |
@@ -2141,6 +2142,7 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2141 | { | 2142 | { |
2142 | struct inode *inode = file_inode(file); | 2143 | struct inode *inode = file_inode(file); |
2143 | struct extent_state *cached_state = NULL; | 2144 | struct extent_state *cached_state = NULL; |
2145 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
2144 | u64 cur_offset; | 2146 | u64 cur_offset; |
2145 | u64 last_byte; | 2147 | u64 last_byte; |
2146 | u64 alloc_start; | 2148 | u64 alloc_start; |
@@ -2168,6 +2170,11 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2168 | ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start); | 2170 | ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start); |
2169 | if (ret) | 2171 | if (ret) |
2170 | return ret; | 2172 | return ret; |
2173 | if (root->fs_info->quota_enabled) { | ||
2174 | ret = btrfs_qgroup_reserve(root, alloc_end - alloc_start); | ||
2175 | if (ret) | ||
2176 | goto out_reserve_fail; | ||
2177 | } | ||
2171 | 2178 | ||
2172 | /* | 2179 | /* |
2173 | * wait for ordered IO before we have any locks. We'll loop again | 2180 | * wait for ordered IO before we have any locks. We'll loop again |
@@ -2271,6 +2278,9 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2271 | &cached_state, GFP_NOFS); | 2278 | &cached_state, GFP_NOFS); |
2272 | out: | 2279 | out: |
2273 | mutex_unlock(&inode->i_mutex); | 2280 | mutex_unlock(&inode->i_mutex); |
2281 | if (root->fs_info->quota_enabled) | ||
2282 | btrfs_qgroup_free(root, alloc_end - alloc_start); | ||
2283 | out_reserve_fail: | ||
2274 | /* Let go of our reservation. */ | 2284 | /* Let go of our reservation. */ |
2275 | btrfs_free_reserved_data_space(inode, alloc_end - alloc_start); | 2285 | btrfs_free_reserved_data_space(inode, alloc_end - alloc_start); |
2276 | return ret; | 2286 | return ret; |