Skip to contentSkip to conversation

Fixing quota error when removing files from a limit exceeded subvols

PATCH In review Khaled Ahmed 2 participants 4 messages Jan 1, 2015 – Jan 4, 2015 Btrfs file system

lore
Share & tools
lore
#0 lore raw

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
index 48b60db..b85200d 100644
@@ -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
#1 lore raw

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
---
 fs/btrfs/qgroup.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
fs/btrfs/qgroup.c +2 -3
index 48b60db..b85200d 100644
@@ -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

#2 lore raw

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

---
fs/btrfs/qgroup.c | 4 ++--

1 file changed, 2 insertions(+), 2 deletions(-)
fs/btrfs/qgroup.c +2 -3
index 48b60db..b85200d 100644
@@ -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

#3 lore raw
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 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

---
fs/btrfs/qgroup.c | 4 ++--

1 file changed, 2 insertions(+), 2 deletions(-)
fs/btrfs/qgroup.c +2 -3
index 48b60db..b85200d 100644
@@ -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