diff mbox

Fixing quota error when removing files from a limit exceeded subvols

Message ID 1420156114-10849-1-git-send-email-khaled.gnu@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Khaled Ahmed Jan. 1, 2015, 11:48 p.m. UTC
Signed-off-by: Khaled Ahmed <khaled.gnu@gmail.com>
---
 fs/btrfs/qgroup.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Dongsheng Yang Jan. 3, 2015, 2:09 a.m. UTC | #1
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

On Fri, Jan 2, 2015 at 7:48 AM, Khaled Ahmed <khaled.gnu@gmail.com> wrote:
> Signed-off-by: Khaled Ahmed <khaled.gnu@gmail.com>
> ---
>  fs/btrfs/qgroup.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
> index 48b60db..b85200d 100644
> --- a/fs/btrfs/qgroup.c
> +++ b/fs/btrfs/qgroup.c
> @@ -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 majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Khaled Ahmed Jan. 3, 2015, 2:29 p.m. UTC | #2
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


On Jan 3, 2015, at 4:09 AM, Dongsheng Yang <dongsheng081251@gmail.com> wrote:

> 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
> 
> On Fri, Jan 2, 2015 at 7:48 AM, Khaled Ahmed <khaled.gnu@gmail.com> wrote:
>> Signed-off-by: Khaled Ahmed <khaled.gnu@gmail.com>
>> ---
>> fs/btrfs/qgroup.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>> 
>> diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
>> index 48b60db..b85200d 100644
>> --- a/fs/btrfs/qgroup.c
>> +++ b/fs/btrfs/qgroup.c
>> @@ -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 majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Dongsheng Yang Jan. 4, 2015, 10:54 a.m. UTC | #3
On Sat, Jan 3, 2015 at 10:29 PM, Khaled Ahmed <khaled.gnu@gmail.com> wrote:
> 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

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
> [root@algodev ~]#
>
> Best Regards,
> ~Khaled Ahmed
>
>
> On Jan 3, 2015, at 4:09 AM, Dongsheng Yang <dongsheng081251@gmail.com> wrote:
>
>> 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
>>
>> On Fri, Jan 2, 2015 at 7:48 AM, Khaled Ahmed <khaled.gnu@gmail.com> wrote:
>>> Signed-off-by: Khaled Ahmed <khaled.gnu@gmail.com>
>>> ---
>>> fs/btrfs/qgroup.c | 4 ++--
>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
>>> index 48b60db..b85200d 100644
>>> --- a/fs/btrfs/qgroup.c
>>> +++ b/fs/btrfs/qgroup.c
>>> @@ -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 majordomo@vger.kernel.org
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index 48b60db..b85200d 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -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;
 		}