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 af1d0605a5c..ade03e6f7bd 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,  		}  		compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags);  		clear_bit(EXTENT_FLAG_PINNED, &em->flags); +		clear_bit(EXTENT_FLAG_LOGGING, &flags);  		remove_extent_mapping(em_tree, em);  		if (no_splits)  			goto next; @@ -2141,6 +2142,7 @@ static long btrfs_fallocate(struct file *file, int mode,  {  	struct inode *inode = file_inode(file);  	struct extent_state *cached_state = NULL; +	struct btrfs_root *root = BTRFS_I(inode)->root;  	u64 cur_offset;  	u64 last_byte;  	u64 alloc_start; @@ -2168,6 +2170,11 @@ static long btrfs_fallocate(struct file *file, int mode,  	ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start);  	if (ret)  		return ret; +	if (root->fs_info->quota_enabled) { +		ret = btrfs_qgroup_reserve(root, alloc_end - alloc_start); +		if (ret) +			goto out_reserve_fail; +	}  	/*  	 * 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,  			     &cached_state, GFP_NOFS);  out:  	mutex_unlock(&inode->i_mutex); +	if (root->fs_info->quota_enabled) +		btrfs_qgroup_free(root, alloc_end - alloc_start); +out_reserve_fail:  	/* Let go of our reservation. */  	btrfs_free_reserved_data_space(inode, alloc_end - alloc_start);  	return ret;  |