diff mbox

btrfs: get the accurate value of used_bytes in btrfs_get_block_group_info().

Message ID 1414413499-28826-1-git-send-email-yangds.fnst@cn.fujitsu.com (mailing list archive)
State New, archived
Headers show

Commit Message

Yang Dongsheng Oct. 27, 2014, 12:38 p.m. UTC
Reproducer:
	# mkfs.btrfs -f -b 20G /dev/sdb
	# mount /dev/sdb /mnt/test
	# fallocate  -l 17G /mnt/test/largefile
	# btrfs fi df /mnt/test
	Data, single: total=17.49GiB, used=6.00GiB <- only 6G, but actually it should be 17G.
	System, DUP: total=8.00MiB, used=16.00KiB
	System, single: total=4.00MiB, used=0.00B
	Metadata, DUP: total=1.00GiB, used=112.00KiB
	Metadata, single: total=8.00MiB, used=0.00B
	GlobalReserve, single: total=16.00MiB, used=0.00B
	# sync
	# btrfs fi df /mnt/test
	Data, single: total=17.49GiB, used=17.00GiB <- After sync, it is expected.
	System, DUP: total=8.00MiB, used=16.00KiB
	System, single: total=4.00MiB, used=0.00B
	Metadata, DUP: total=1.00GiB, used=112.00KiB
	Metadata, single: total=8.00MiB, used=0.00B
	GlobalReserve, single: total=16.00MiB, used=0.00B

The value of 6.00GiB is actually calculated in btrfs_get_block_group_info()
by adding the @block_group->item->used for each group together. In this way,
it did not consider the bytes in cache.

This patch adds the value of @pinned, @reserved and @bytes_super in
struct btrfs_block_group_cache to make sure we can get the accurate @used_bytes.

Reported-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
---
 fs/btrfs/ioctl.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Yang Dongsheng Jan. 5, 2015, 11:19 a.m. UTC | #1
Ping.....

IOCTL of BTRFS_IOC_SPACE_INFO currently does not report
the data used but not synced to user.  Then btrfs fi df will
give user a wrong numbers before sync. This patch solve
this problem.

On 10/27/2014 08:38 PM, Dongsheng Yang wrote:
> Reproducer:
> 	# mkfs.btrfs -f -b 20G /dev/sdb
> 	# mount /dev/sdb /mnt/test
> 	# fallocate  -l 17G /mnt/test/largefile
> 	# btrfs fi df /mnt/test
> 	Data, single: total=17.49GiB, used=6.00GiB <- only 6G, but actually it should be 17G.
> 	System, DUP: total=8.00MiB, used=16.00KiB
> 	System, single: total=4.00MiB, used=0.00B
> 	Metadata, DUP: total=1.00GiB, used=112.00KiB
> 	Metadata, single: total=8.00MiB, used=0.00B
> 	GlobalReserve, single: total=16.00MiB, used=0.00B
> 	# sync
> 	# btrfs fi df /mnt/test
> 	Data, single: total=17.49GiB, used=17.00GiB <- After sync, it is expected.
> 	System, DUP: total=8.00MiB, used=16.00KiB
> 	System, single: total=4.00MiB, used=0.00B
> 	Metadata, DUP: total=1.00GiB, used=112.00KiB
> 	Metadata, single: total=8.00MiB, used=0.00B
> 	GlobalReserve, single: total=16.00MiB, used=0.00B
>
> The value of 6.00GiB is actually calculated in btrfs_get_block_group_info()
> by adding the @block_group->item->used for each group together. In this way,
> it did not consider the bytes in cache.
>
> This patch adds the value of @pinned, @reserved and @bytes_super in
> struct btrfs_block_group_cache to make sure we can get the accurate @used_bytes.
>
> Reported-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
> Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
> ---
>   fs/btrfs/ioctl.c | 4 ++++
>   1 file changed, 4 insertions(+)
>
> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
> index 33c80f5..bc2aaeb 100644
> --- a/fs/btrfs/ioctl.c
> +++ b/fs/btrfs/ioctl.c
> @@ -3892,6 +3892,10 @@ void btrfs_get_block_group_info(struct list_head *groups_list,
>   		space->total_bytes += block_group->key.offset;
>   		space->used_bytes +=
>   			btrfs_block_group_used(&block_group->item);
> +		/* Add bytes-info in cache */
> +		space->used_bytes += block_group->pinned;
> +		space->used_bytes += block_group->reserved;
> +		space->used_bytes += block_group->bytes_super;
>   	}
>   }
>   

--
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
Satoru Takeuchi Jan. 7, 2015, 8:27 a.m. UTC | #2
Hi Dongsheng,

On 2015/01/05 20:19, Dongsheng Yang wrote:

> Ping.....
>
> IOCTL of BTRFS_IOC_SPACE_INFO currently does not report
> the data used but not synced to user.  Then btrfs fi df will
> give user a wrong numbers before sync. This patch solve
> this problem.
>
> On 10/27/2014 08:38 PM, Dongsheng Yang wrote:
>> Reproducer:
>>     # mkfs.btrfs -f -b 20G /dev/sdb
>>     # mount /dev/sdb /mnt/test
>>     # fallocate  -l 17G /mnt/test/largefile
>>     # btrfs fi df /mnt/test
>>     Data, single: total=17.49GiB, used=6.00GiB <- only 6G, but actually it should be 17G.
>>     System, DUP: total=8.00MiB, used=16.00KiB
>>     System, single: total=4.00MiB, used=0.00B
>>     Metadata, DUP: total=1.00GiB, used=112.00KiB
>>     Metadata, single: total=8.00MiB, used=0.00B
>>     GlobalReserve, single: total=16.00MiB, used=0.00B

I tried to reproduce your problem with 3.19-rc1.
However, this problem doesn't happen. Could you
also try to reproduce with the upstream kernel?

* Detail

test script (named "yang-test.sh" here):
===============================================================================
#!/bin/bash -x

PART1=/dev/vdb
MNT_PNT=./mnt
mkfs.btrfs -f -b 20G ${PART1}
mount ${PART1} ${MNT_PNT}
fallocate -l 17G ${MNT_PNT}/largefile
btrfs fi df ${MNT_PNT}
sync
btrfs fi df ${MNT_PNT}
umount ${MNT_PNT}
===============================================================================

Result:
===============================================================================
# ./yang-test.sh
+ PART1=/dev/vdb
+ MNT_PNT=./mnt
+ mkfs.btrfs -f -b 20G /dev/vdb
Btrfs v3.17
See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
fs created label (null) on /dev/vdb
         nodesize 16384 leafsize 16384 sectorsize 4096 size 20.00GiB
+ mount /dev/vdb ./mnt
+ fallocate -l 17G ./mnt/largefile
+ btrfs fi df ./mnt
Data, single: total=17.01GiB, used=17.00GiB   # Used 17GiB properly
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00B
Metadata, DUP: total=1.00GiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=16.00MiB, used=0.00B
+ sync
+ btrfs fi df ./mnt
Data, single: total=17.01GiB, used=17.00GiB    # (of course) used 17GiB too
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00B
Metadata, DUP: total=1.00GiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=16.00MiB, used=0.00B
+ umount ./mnt
===============================================================================

Although I ran this test five times, the results are the same.

Thanks,
Satoru

>>     # sync
>>     # btrfs fi df /mnt/test
>>     Data, single: total=17.49GiB, used=17.00GiB <- After sync, it is expected.
>>     System, DUP: total=8.00MiB, used=16.00KiB
>>     System, single: total=4.00MiB, used=0.00B
>>     Metadata, DUP: total=1.00GiB, used=112.00KiB
>>     Metadata, single: total=8.00MiB, used=0.00B
>>     GlobalReserve, single: total=16.00MiB, used=0.00B
>>
>> The value of 6.00GiB is actually calculated in btrfs_get_block_group_info()
>> by adding the @block_group->item->used for each group together. In this way,
>> it did not consider the bytes in cache.
>>
>> This patch adds the value of @pinned, @reserved and @bytes_super in
>> struct btrfs_block_group_cache to make sure we can get the accurate @used_bytes.
>>
>> Reported-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
>> Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
>> ---
>>   fs/btrfs/ioctl.c | 4 ++++
>>   1 file changed, 4 insertions(+)
>>
>> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
>> index 33c80f5..bc2aaeb 100644
>> --- a/fs/btrfs/ioctl.c
>> +++ b/fs/btrfs/ioctl.c
>> @@ -3892,6 +3892,10 @@ void btrfs_get_block_group_info(struct list_head *groups_list,
>>           space->total_bytes += block_group->key.offset;
>>           space->used_bytes +=
>>               btrfs_block_group_used(&block_group->item);
>> +        /* Add bytes-info in cache */
>> +        space->used_bytes += block_group->pinned;
>> +        space->used_bytes += block_group->reserved;
>> +        space->used_bytes += block_group->bytes_super;
>>       }
>>   }
>
> --
> 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
Qu Wenruo Jan. 7, 2015, 9:22 a.m. UTC | #3
Hi Satoru-san
> Hi Dongsheng,
>
> On 2015/01/05 20:19, Dongsheng Yang wrote:
>
>> Ping.....
>>
>> IOCTL of BTRFS_IOC_SPACE_INFO currently does not report
>> the data used but not synced to user.  Then btrfs fi df will
>> give user a wrong numbers before sync. This patch solve
>> this problem.
>>
>> On 10/27/2014 08:38 PM, Dongsheng Yang wrote:
>>> Reproducer:
>>>     # mkfs.btrfs -f -b 20G /dev/sdb
>>>     # mount /dev/sdb /mnt/test
>>>     # fallocate  -l 17G /mnt/test/largefile
>>>     # btrfs fi df /mnt/test
>>>     Data, single: total=17.49GiB, used=6.00GiB <- only 6G, but 
>>> actually it should be 17G.
>>>     System, DUP: total=8.00MiB, used=16.00KiB
>>>     System, single: total=4.00MiB, used=0.00B
>>>     Metadata, DUP: total=1.00GiB, used=112.00KiB
>>>     Metadata, single: total=8.00MiB, used=0.00B
>>>     GlobalReserve, single: total=16.00MiB, used=0.00B
>
> I tried to reproduce your problem with 3.19-rc1.
> However, this problem doesn't happen. Could you
> also try to reproduce with the upstream kernel?
I can still reproduce it in 3.18, but it seems to be fixed in 3.19-rc1 
already by other patch,
so this patch is no longer needed.

Thanks,
Qu
>
> * Detail
>
> test script (named "yang-test.sh" here):
> =============================================================================== 
>
> #!/bin/bash -x
>
> PART1=/dev/vdb
> MNT_PNT=./mnt
> mkfs.btrfs -f -b 20G ${PART1}
> mount ${PART1} ${MNT_PNT}
> fallocate -l 17G ${MNT_PNT}/largefile
> btrfs fi df ${MNT_PNT}
> sync
> btrfs fi df ${MNT_PNT}
> umount ${MNT_PNT}
> =============================================================================== 
>
>
> Result:
> =============================================================================== 
>
> # ./yang-test.sh
> + PART1=/dev/vdb
> + MNT_PNT=./mnt
> + mkfs.btrfs -f -b 20G /dev/vdb
> Btrfs v3.17
> See http://btrfs.wiki.kernel.org for more information.
>
> Turning ON incompat feature 'extref': increased hardlink limit per 
> file to 65536
> fs created label (null) on /dev/vdb
>         nodesize 16384 leafsize 16384 sectorsize 4096 size 20.00GiB
> + mount /dev/vdb ./mnt
> + fallocate -l 17G ./mnt/largefile
> + btrfs fi df ./mnt
> Data, single: total=17.01GiB, used=17.00GiB   # Used 17GiB properly
> System, DUP: total=8.00MiB, used=16.00KiB
> System, single: total=4.00MiB, used=0.00B
> Metadata, DUP: total=1.00GiB, used=112.00KiB
> Metadata, single: total=8.00MiB, used=0.00B
> GlobalReserve, single: total=16.00MiB, used=0.00B
> + sync
> + btrfs fi df ./mnt
> Data, single: total=17.01GiB, used=17.00GiB    # (of course) used 
> 17GiB too
> System, DUP: total=8.00MiB, used=16.00KiB
> System, single: total=4.00MiB, used=0.00B
> Metadata, DUP: total=1.00GiB, used=112.00KiB
> Metadata, single: total=8.00MiB, used=0.00B
> GlobalReserve, single: total=16.00MiB, used=0.00B
> + umount ./mnt
> =============================================================================== 
>
>
> Although I ran this test five times, the results are the same.
>
> Thanks,
> Satoru
>
>>>     # sync
>>>     # btrfs fi df /mnt/test
>>>     Data, single: total=17.49GiB, used=17.00GiB <- After sync, it is 
>>> expected.
>>>     System, DUP: total=8.00MiB, used=16.00KiB
>>>     System, single: total=4.00MiB, used=0.00B
>>>     Metadata, DUP: total=1.00GiB, used=112.00KiB
>>>     Metadata, single: total=8.00MiB, used=0.00B
>>>     GlobalReserve, single: total=16.00MiB, used=0.00B
>>>
>>> The value of 6.00GiB is actually calculated in 
>>> btrfs_get_block_group_info()
>>> by adding the @block_group->item->used for each group together. In 
>>> this way,
>>> it did not consider the bytes in cache.
>>>
>>> This patch adds the value of @pinned, @reserved and @bytes_super in
>>> struct btrfs_block_group_cache to make sure we can get the accurate 
>>> @used_bytes.
>>>
>>> Reported-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
>>> Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
>>> ---
>>>   fs/btrfs/ioctl.c | 4 ++++
>>>   1 file changed, 4 insertions(+)
>>>
>>> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
>>> index 33c80f5..bc2aaeb 100644
>>> --- a/fs/btrfs/ioctl.c
>>> +++ b/fs/btrfs/ioctl.c
>>> @@ -3892,6 +3892,10 @@ void btrfs_get_block_group_info(struct 
>>> list_head *groups_list,
>>>           space->total_bytes += block_group->key.offset;
>>>           space->used_bytes +=
>>> btrfs_block_group_used(&block_group->item);
>>> +        /* Add bytes-info in cache */
>>> +        space->used_bytes += block_group->pinned;
>>> +        space->used_bytes += block_group->reserved;
>>> +        space->used_bytes += block_group->bytes_super;
>>>       }
>>>   }
>>
>> -- 
>> 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

--
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
Yang Dongsheng Jan. 7, 2015, 9:41 a.m. UTC | #4
On 01/07/2015 05:22 PM, Qu Wenruo wrote:
> Hi Satoru-san
>> Hi Dongsheng,
>>
>> On 2015/01/05 20:19, Dongsheng Yang wrote:
>>
>>> Ping.....
>>>
>>> IOCTL of BTRFS_IOC_SPACE_INFO currently does not report
>>> the data used but not synced to user.  Then btrfs fi df will
>>> give user a wrong numbers before sync. This patch solve
>>> this problem.
>>>
>>> On 10/27/2014 08:38 PM, Dongsheng Yang wrote:
>>>> Reproducer:
>>>>     # mkfs.btrfs -f -b 20G /dev/sdb
>>>>     # mount /dev/sdb /mnt/test
>>>>     # fallocate  -l 17G /mnt/test/largefile
>>>>     # btrfs fi df /mnt/test
>>>>     Data, single: total=17.49GiB, used=6.00GiB <- only 6G, but 
>>>> actually it should be 17G.
>>>>     System, DUP: total=8.00MiB, used=16.00KiB
>>>>     System, single: total=4.00MiB, used=0.00B
>>>>     Metadata, DUP: total=1.00GiB, used=112.00KiB
>>>>     Metadata, single: total=8.00MiB, used=0.00B
>>>>     GlobalReserve, single: total=16.00MiB, used=0.00B
>>
>> I tried to reproduce your problem with 3.19-rc1.
>> However, this problem doesn't happen. Could you
>> also try to reproduce with the upstream kernel?
> I can still reproduce it in 3.18, but it seems to be fixed in 3.19-rc1 
> already by other patch,
> so this patch is no longer needed.

Oops, my fault. I forgot to test it with upstream. :(

Satoru and Qu, thanx a lot.

Yang
>
> Thanks,
> Qu
>>
>> * Detail
>>
>> test script (named "yang-test.sh" here):
>> =============================================================================== 
>>
>> #!/bin/bash -x
>>
>> PART1=/dev/vdb
>> MNT_PNT=./mnt
>> mkfs.btrfs -f -b 20G ${PART1}
>> mount ${PART1} ${MNT_PNT}
>> fallocate -l 17G ${MNT_PNT}/largefile
>> btrfs fi df ${MNT_PNT}
>> sync
>> btrfs fi df ${MNT_PNT}
>> umount ${MNT_PNT}
>> =============================================================================== 
>>
>>
>> Result:
>> =============================================================================== 
>>
>> # ./yang-test.sh
>> + PART1=/dev/vdb
>> + MNT_PNT=./mnt
>> + mkfs.btrfs -f -b 20G /dev/vdb
>> Btrfs v3.17
>> See http://btrfs.wiki.kernel.org for more information.
>>
>> Turning ON incompat feature 'extref': increased hardlink limit per 
>> file to 65536
>> fs created label (null) on /dev/vdb
>>         nodesize 16384 leafsize 16384 sectorsize 4096 size 20.00GiB
>> + mount /dev/vdb ./mnt
>> + fallocate -l 17G ./mnt/largefile
>> + btrfs fi df ./mnt
>> Data, single: total=17.01GiB, used=17.00GiB   # Used 17GiB properly
>> System, DUP: total=8.00MiB, used=16.00KiB
>> System, single: total=4.00MiB, used=0.00B
>> Metadata, DUP: total=1.00GiB, used=112.00KiB
>> Metadata, single: total=8.00MiB, used=0.00B
>> GlobalReserve, single: total=16.00MiB, used=0.00B
>> + sync
>> + btrfs fi df ./mnt
>> Data, single: total=17.01GiB, used=17.00GiB    # (of course) used 
>> 17GiB too
>> System, DUP: total=8.00MiB, used=16.00KiB
>> System, single: total=4.00MiB, used=0.00B
>> Metadata, DUP: total=1.00GiB, used=112.00KiB
>> Metadata, single: total=8.00MiB, used=0.00B
>> GlobalReserve, single: total=16.00MiB, used=0.00B
>> + umount ./mnt
>> =============================================================================== 
>>
>>
>> Although I ran this test five times, the results are the same.
>>
>> Thanks,
>> Satoru
>>
>>>>     # sync
>>>>     # btrfs fi df /mnt/test
>>>>     Data, single: total=17.49GiB, used=17.00GiB <- After sync, it 
>>>> is expected.
>>>>     System, DUP: total=8.00MiB, used=16.00KiB
>>>>     System, single: total=4.00MiB, used=0.00B
>>>>     Metadata, DUP: total=1.00GiB, used=112.00KiB
>>>>     Metadata, single: total=8.00MiB, used=0.00B
>>>>     GlobalReserve, single: total=16.00MiB, used=0.00B
>>>>
>>>> The value of 6.00GiB is actually calculated in 
>>>> btrfs_get_block_group_info()
>>>> by adding the @block_group->item->used for each group together. In 
>>>> this way,
>>>> it did not consider the bytes in cache.
>>>>
>>>> This patch adds the value of @pinned, @reserved and @bytes_super in
>>>> struct btrfs_block_group_cache to make sure we can get the accurate 
>>>> @used_bytes.
>>>>
>>>> Reported-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
>>>> Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
>>>> ---
>>>>   fs/btrfs/ioctl.c | 4 ++++
>>>>   1 file changed, 4 insertions(+)
>>>>
>>>> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
>>>> index 33c80f5..bc2aaeb 100644
>>>> --- a/fs/btrfs/ioctl.c
>>>> +++ b/fs/btrfs/ioctl.c
>>>> @@ -3892,6 +3892,10 @@ void btrfs_get_block_group_info(struct 
>>>> list_head *groups_list,
>>>>           space->total_bytes += block_group->key.offset;
>>>>           space->used_bytes +=
>>>> btrfs_block_group_used(&block_group->item);
>>>> +        /* Add bytes-info in cache */
>>>> +        space->used_bytes += block_group->pinned;
>>>> +        space->used_bytes += block_group->reserved;
>>>> +        space->used_bytes += block_group->bytes_super;
>>>>       }
>>>>   }
>>>
>>> -- 
>>> 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
>
> .
>

--
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/ioctl.c b/fs/btrfs/ioctl.c
index 33c80f5..bc2aaeb 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -3892,6 +3892,10 @@  void btrfs_get_block_group_info(struct list_head *groups_list,
 		space->total_bytes += block_group->key.offset;
 		space->used_bytes +=
 			btrfs_block_group_used(&block_group->item);
+		/* Add bytes-info in cache */
+		space->used_bytes += block_group->pinned;
+		space->used_bytes += block_group->reserved;
+		space->used_bytes += block_group->bytes_super;
 	}
 }