diff options
| author | Wang Shilong <wangsl-fnst@cn.fujitsu.com> | 2013-03-19 10:57:14 +0000 | 
|---|---|---|
| committer | Chris Mason <chris.mason@fusionio.com> | 2013-03-21 19:24:32 -0400 | 
| commit | 6113077cd319e747875ec71227d2b5cb54e08c76 (patch) | |
| tree | dca81060451d10a7c2904ad7802d3cadbe4b65a5 /fs/btrfs/file.c | |
| parent | 835d974fabfa9bff4d173ad03c054ac2f673263f (diff) | |
| download | olio-linux-3.10-6113077cd319e747875ec71227d2b5cb54e08c76.tar.xz olio-linux-3.10-6113077cd319e747875ec71227d2b5cb54e08c76.zip  | |
Btrfs: fix missing qgroup reservation before fallocating
Steps to reproduce:
	mkfs.btrfs <disk>
	mount <disk> <mnt>
	btrfs quota enable <mnt>
	btrfs sub create <mnt>/subv
	btrfs qgroup limit 10M <mnt>/subv
	fallocate --length 20M <mnt>/subv/data
For the above example, fallocating will return successfully which
is not expected, we try to fix it by doing qgroup reservation before
fallocating.
Signed-off-by: Wang Shilong <wangsl-fnst@cn.fujitsu.com>
Reviewed-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs/btrfs/file.c')
| -rw-r--r-- | fs/btrfs/file.c | 9 | 
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 7bdb47faa12..1be25b92d63 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -2142,6 +2142,7 @@ static long btrfs_fallocate(struct file *file, int mode,  {  	struct inode *inode = file->f_path.dentry->d_inode;  	struct extent_state *cached_state = NULL; +	struct btrfs_root *root = BTRFS_I(inode)->root;  	u64 cur_offset;  	u64 last_byte;  	u64 alloc_start; @@ -2169,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 @@ -2272,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;  |