diff options
author | Wang Shilong <wangsl-fnst@cn.fujitsu.com> | 2013-04-15 08:56:49 -0400 |
---|---|---|
committer | Josef Bacik <jbacik@fusionio.com> | 2013-05-06 15:54:51 -0400 |
commit | b4fcd6be6bbd702ae1a6545c9b413681850a9814 (patch) | |
tree | 88910f7224a4c0de59809fda2f8599d0a6703305 /fs | |
parent | e36902d4cc95382771f501f8d1d8c0a9b356500d (diff) |
Btrfs: fix confusing edquot happening case
Step to reproduce:
mkfs.btrfs <disk>
mount <disk> <mnt>
dd if=/dev/zero of=/<mnt>/data bs=1M count=10
sync
btrfs quota enable <mnt>
btrfs qgroup create 0/5 <mnt>
btrfs qgroup limit 5M 0/5 <mnt>
rm -f /<mnt>/data
sync
btrfs qgroup show <mnt>
dd if=/dev/zero of=data bs=1M count=1
>From the perspective of users, qgroup's referenced or exclusive
is negative,but user can not continue to write data! a workaround
way is to cast u64 to s64 when doing qgroup reservation.
Signed-off-by: Wang Shilong <wangsl-fnst@cn.fujitsu.com>
Reviewed-by: Arne Jansen <sensille@gmx.net>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/qgroup.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index e089fc108483..4beea047f4ed 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
@@ -1616,14 +1616,14 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes) | |||
1616 | qg = (struct btrfs_qgroup *)(uintptr_t)unode->aux; | 1616 | qg = (struct btrfs_qgroup *)(uintptr_t)unode->aux; |
1617 | 1617 | ||
1618 | if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) && | 1618 | if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) && |
1619 | qg->reserved + qg->rfer + num_bytes > | 1619 | qg->reserved + (s64)qg->rfer + num_bytes > |
1620 | qg->max_rfer) { | 1620 | qg->max_rfer) { |
1621 | ret = -EDQUOT; | 1621 | ret = -EDQUOT; |
1622 | goto out; | 1622 | goto out; |
1623 | } | 1623 | } |
1624 | 1624 | ||
1625 | if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) && | 1625 | if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) && |
1626 | qg->reserved + qg->excl + num_bytes > | 1626 | qg->reserved + (s64)qg->excl + num_bytes > |
1627 | qg->max_excl) { | 1627 | qg->max_excl) { |
1628 | ret = -EDQUOT; | 1628 | ret = -EDQUOT; |
1629 | goto out; | 1629 | goto out; |