Fixing quota error when removing files from a limit exceeded subvols
PATCH 1/1 Fixing quota error when removing files from a limit exceeded subvols
--- fs/btrfs/qgroup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/btrfs/qgroup.c +2 -2
@@ -2408,14 +2408,14 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes)if ((qg->lim_flags &BTRFS_QGROUP_LIMIT_MAX_RFER ) && qg->reserved + (s64 )qg->rfer + num_bytes > - qg->max_rfer) { + qg->max_rfer -1 ) { ret = -EDQUOT ; goto out; }if ((qg->lim_flags &BTRFS_QGROUP_LIMIT_MAX_EXCL ) && qg->reserved + (s64 )qg->excl + num_bytes > - qg->max_excl) { + qg->max_excl -1 ) { ret = -EDQUOT ; goto out; }
Signature · 1 line
2.1.0
Hi Khaled,
Could you give use more description about the problem this patch is trying to solve? Maybe an example will help a lot to understand it.
Thanx
Quoted 33 lines · Khaled Ahmed
Signed-off-by Khaled Ahmed <[email protected]>--- fs/btrfs/qgroup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)fs/btrfs/qgroup.c +2
-3@@ -2408,14 +2408,14 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes)if ((qg->lim_flags &BTRFS_QGROUP_LIMIT_MAX_RFER ) && qg->reserved + (s64 )qg->rfer + num_bytes > - qg->max_rfer) { + qg->max_rfer -1 ) { ret = -EDQUOT ; goto out; }if ((qg->lim_flags &BTRFS_QGROUP_LIMIT_MAX_EXCL ) && qg->reserved + (s64 )qg->excl + num_bytes > - qg->max_excl) { + qg->max_excl -1 ) { ret = -EDQUOT ; goto out; } --2.1.0
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Yang,
This is how to reproduce the bug,
[root@algodev ~]# uname -r
3.18.0+
[root@algodev ~]# btrfs version
Btrfs v3.18-2-g6938452-dirty
[root@algodev ~]# btrfs quota enable LOOP/
[root@algodev ~]# btrfs qgroup show LOOP/
qgroupid rfer excl
-------- ---- ----
0/5 16384 16384
[root@algodev ~]# btrfs subvol create LOOP/subvol1 Create subvolume 'LOOP/subvol1'
[root@algodev ~]# btrfs qgroup limit 1g LOOP/subvol1/
[root@algodev ~]# btrfs qgroup show LOOP/
qgroupid rfer excl
-------- ---- ----
0/5 16384 16384
0/258 16384 16384
[root@algodev ~]# dd if=/dev/zero of=LOOP/subvol1/bigfile
dd: writing to ‘LOOP/subvol1/bigfile’: Disk quota exceeded 2097018+0 records in
2097017+0 records out
1073672704 bytes (1.1 GB) copied, 10.0759 s, 107 MB/s
[root@algodev ~]# rm -f LOOP/subvol1/bigfile
rm: cannot remove ‘LOOP/subvol1/bigfile’: Disk quota exceeded [root@algodev ~]#
Best Regards,
~Khaled Ahmed
Quoted 41 lines · Dongsheng Yang
Hi Khaled,
Could you give use more description about the problem this patch is trying to solve? Maybe an example will help a lot to understand it.
Thanx
Quoted 33 lines · Khaled Ahmed
Signed-off-by Khaled Ahmed <[email protected]>---
fs/btrfs/qgroup.c| 4 ++--1 file changed, 2 insertions(+), 2 deletions(-)fs/btrfs/qgroup.c +2
-3@@ -2408,14 +2408,14 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes)if ((qg->lim_flags &BTRFS_QGROUP_LIMIT_MAX_RFER ) && qg->reserved + (s64 )qg->rfer + num_bytes > - qg->max_rfer) { + qg->max_rfer -1 ) { ret = -EDQUOT ; goto out; }if ((qg->lim_flags &BTRFS_QGROUP_LIMIT_MAX_EXCL ) && qg->reserved + (s64 )qg->excl + num_bytes > - qg->max_excl) { + qg->max_excl -1 ) { ret = -EDQUOT ; goto out; } --2.1.0
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 27 lines · Khaled Ahmed
Hi Yang,
This is how to reproduce the bug,
[root@algodev ~]# uname -r
3.18.0+[root@algodev ~]# btrfs version
Btrfs v3.18-2-g6938452-dirty[root@algodev ~]# btrfs quota enable LOOP/
[root@algodev ~]# btrfs qgroup show LOOP/
qgroupid rfer excl
-------- ---- ----
0/5 16384 16384[root@algodev ~]# btrfs subvol create LOOP/subvol1 Create subvolume 'LOOP/subvol1'
[root@algodev ~]# btrfs qgroup limit 1g LOOP/subvol1/
[root@algodev ~]# btrfs qgroup show LOOP/
qgroupid rfer excl
-------- ---- ----
0/5 16384 16384
0/258 16384 16384
Quoted 8 lines
[root@algodev ~]# dd if=/dev/zero of=LOOP/subvol1/bigfile
dd: writing to ‘LOOP/subvol1/bigfile’: Disk quota exceeded 2097018+0 records in
2097017+0 records out
1073672704 bytes (1.1 GB) copied, 10.0759 s, 107 MB/s[root@algodev ~]# rm -f LOOP/subvol1/bigfile
rm: cannot remove ‘LOOP/subvol1/bigfile’: Disk quota exceeded
Hi Ahmed,
Okey, thanx for your example.
a). I guess your problem is getting a EQUOTA when remove a file here. It's because we need to reserve some metadata in transaction of btrfs_unlink().
b). I think you patch here will not solve your problem. The root cause is current quota in btrfs is accounting data and metadata together.
c). I admit getting a EQUOTA is strange when you did not writing anything but only remove a file. I had a plan in my TODO list which is making qgroup to limit and account the size in three modes, data, metadata and both. Then in this case
if you only limit the size of data, you will not get a EQUOTA any more.
Thanx
Yang
Quoted 50 lines
[root@algodev ~]#
Best Regards,
~Khaled AhmedQuoted 41 lines · Dongsheng Yang
Hi Khaled,
Could you give use more description about the problem this patch is trying to solve? Maybe an example will help a lot to understand it.
Thanx
Quoted 33 lines · Khaled Ahmed
Signed-off-by Khaled Ahmed <[email protected]>---
fs/btrfs/qgroup.c| 4 ++--1 file changed, 2 insertions(+), 2 deletions(-)fs/btrfs/qgroup.c +2
-3@@ -2408,14 +2408,14 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes)if ((qg->lim_flags &BTRFS_QGROUP_LIMIT_MAX_RFER ) && qg->reserved + (s64 )qg->rfer + num_bytes > - qg->max_rfer) { + qg->max_rfer -1 ) { ret = -EDQUOT ; goto out; }if ((qg->lim_flags &BTRFS_QGROUP_LIMIT_MAX_EXCL ) && qg->reserved + (s64 )qg->excl + num_bytes > - qg->max_excl) { + qg->max_excl -1 ) { ret = -EDQUOT ; goto out; } --2.1.0
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html