Hi,

Making a snapshot gets us the wrong qgroup numbers. This is very easy to
reproduce. From a fresh btrfs filesystem, simply enable qgroups and create a
snapshot. In this example we have mounted a newly created fresh filesystem
and mounted it at /btrfs:

# btrfs quota enable /btrfs
# btrfs sub sna /btrfs/ /btrfs/snap1
# btrfs qg show /btrfs

qgroupid         rfer         excl 
--------         ----         ---- 
0/5          32.00KiB     32.00KiB 
0/257        16.00KiB     16.00KiB 


In the example above, the default subvolume (0/5) should read 16KiB
referenced and 16KiB exclusive.

A rescan fixes things, so we know the rescan process is doing the math
right:

# btrfs quota rescan /btrfs
# btrfs qgroup show /btrfs
qgroupid         rfer         excl 
--------         ----         ---- 
0/5          16.00KiB     16.00KiB 
0/257        16.00KiB     16.00KiB 



The last kernel to get this right was v4.1:

# uname -r
4.1.20
# btrfs quota enable /btrfs
# btrfs sub sna /btrfs/ /btrfs/snap1
Create a snapshot of '/btrfs/' in '/btrfs/snap1'
# btrfs qg show /btrfs
qgroupid         rfer         excl 
--------         ----         ---- 
0/5          16.00KiB     16.00KiB 
0/257        16.00KiB     16.00KiB 


Which leads me to believe that this was a regression introduced by Qu's
rewrite as that is the biggest change to qgroups during that development
period.


Going back to upstream, I applied my tracing patch from this list
( http://thread.gmane.org/gmane.comp.file-systems.btrfs/54685 ), with a
couple changes - I'm printing the rfer/excl bytecounts in
qgroup_update_counters AND I print them twice - once before we make any
changes and once after the changes. If I enable tracing in
btrfs_qgroup_account_extent and qgroup_update_counters just before the
snapshot creation, we get the following trace:


# btrfs quota enable /btrfs
# <wait a sec for the rescan to finish>
# echo 1 > 
/sys/kernel/debug/tracing/events/btrfs/btrfs_qgroup_account_extent/enable
# echo 1 > //sys/kernel/debug/tracing/events/btrfs/qgroup_update_counters/enable
# btrfs sub sna /btrfs/ /btrfs/snap2
Create a snapshot of '/btrfs/' in '/btrfs/snap2'
# btrfs qg show /btrfs
qgroupid         rfer         excl 
--------         ----         ---- 
0/5          32.00KiB     32.00KiB 
0/257        16.00KiB     16.00KiB 
# fstest1:~ # cat /sys/kernel/debug/tracing/trace

# tracer: nop
#
# entries-in-buffer/entries-written: 13/13   #P:2
#
#                              _-----=> irqs-off
#                             / _----=> need-resched
#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |
           btrfs-10233 [001] .... 260298.823339: btrfs_qgroup_account_extent: 
bytenr = 29360128, num_bytes = 16384, nr_old_roots = 1, nr_new_roots = 0
           btrfs-10233 [001] .... 260298.823342: qgroup_update_counters: qgid = 
5, cur_old_count = 1, cur_new_count = 0, rfer = 16384, excl = 16384
           btrfs-10233 [001] .... 260298.823342: qgroup_update_counters: qgid = 
5, cur_old_count = 1, cur_new_count = 0, rfer = 0, excl = 0
           btrfs-10233 [001] .... 260298.823343: btrfs_qgroup_account_extent: 
bytenr = 29720576, num_bytes = 16384, nr_old_roots = 0, nr_new_roots = 0
           btrfs-10233 [001] .... 260298.823345: btrfs_qgroup_account_extent: 
bytenr = 29736960, num_bytes = 16384, nr_old_roots = 0, nr_new_roots = 0
           btrfs-10233 [001] .... 260298.823347: btrfs_qgroup_account_extent: 
bytenr = 29786112, num_bytes = 16384, nr_old_roots = 0, nr_new_roots = 1
           btrfs-10233 [001] .... 260298.823347: qgroup_update_counters: qgid = 
5, cur_old_count = 0, cur_new_count = 1, rfer = 0, excl = 0
           btrfs-10233 [001] .... 260298.823348: qgroup_update_counters: qgid = 
5, cur_old_count = 0, cur_new_count = 1, rfer = 16384, excl = 16384
           btrfs-10233 [001] .... 260298.823421: btrfs_qgroup_account_extent: 
bytenr = 29786112, num_bytes = 16384, nr_old_roots = 0, nr_new_roots = 0
           btrfs-10233 [001] .... 260298.823422: btrfs_qgroup_account_extent: 
bytenr = 29835264, num_bytes = 16384, nr_old_roots = 0, nr_new_roots = 0
           btrfs-10233 [001] .... 260298.823425: btrfs_qgroup_account_extent: 
bytenr = 29851648, num_bytes = 16384, nr_old_roots = 0, nr_new_roots = 1
           btrfs-10233 [001] .... 260298.823426: qgroup_update_counters: qgid = 
5, cur_old_count = 0, cur_new_count = 1, rfer = 16384, excl = 16384
           btrfs-10233 [001] .... 260298.823426: qgroup_update_counters: qgid = 
5, cur_old_count = 0, cur_new_count = 1, rfer = 32768, excl = 32768

If you read through the whole log we do some ... interesting.. things - at
the start, we *subtract* from qgroup 5, making it's count go to zero. I want
to say that this is kind of unexpected for a snapshot create but perhaps
there's something I'm missing.

Remember that I'm printing each qgroup twice in qgroup_adjust_counters (once
before, once after). Sothen we can see then that extent 29851648 (len 16k)
is the extent being counted against qgroup 5 which makes the count invalid.

>From a btrfs-debug-tree I get the following records referencing that extent:

>From the root tree:
        item 3 key (FS_TREE ROOT_ITEM 0) itemoff 14949 itemsize 439
                root data bytenr 29851648 level 0 dirid 256 refs 1 gen 10 
lastsnap 10
                uuid 00000000-0000-0000-0000-000000000000
                ctransid 10 otransid 0 stransid 0 rtransid 0

>From the extent tree:
        item 9 key (29851648 METADATA_ITEM 0) itemoff 15960 itemsize 33
                extent refs 1 gen 10 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 5

And here is the block itself:

fs tree key (FS_TREE ROOT_ITEM 0) 
leaf 29851648 items 4 free space 15941 generation 10 owner 5
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (256 INODE_ITEM 0) itemoff 16123 itemsize 160
                inode generation 3 transid 10 size 10 nbytes 16384
                block group 0 mode 40755 links 1 uid 0 gid 0
                rdev 0 flags 0x0
        item 1 key (256 INODE_REF 256) itemoff 16111 itemsize 12
                inode ref index 0 namelen 2 name: ..
        item 2 key (256 DIR_ITEM 3390559794) itemoff 16076 itemsize 35
                location key (257 ROOT_ITEM -1) type DIR
                namelen 5 datalen 0 name: snap2
        item 3 key (256 DIR_INDEX 2) itemoff 16041 itemsize 35
                location key (257 ROOT_ITEM -1) type DIR
                namelen 5 datalen 0 name: snap2


So unless I'm mistaken, it seems like we're counting the original snapshot
root against itself when creating a snapshot.

I found this looking for what I believe to be a _different_ corruption in
qgroups. In the meantime while I track that one down though I was hoping
that someone might be able to shed some light on this particular issue.

Qu, do you have any ideas how we might fix this?

Thanks,
        --Mark

PS: I have attached the output of btrfs-debug-tree for the FS used in this
example.

--
Mark Fasheh
root tree
leaf 29884416 items 17 free space 11820 generation 11 owner 1
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (EXTENT_TREE ROOT_ITEM 0) itemoff 15844 itemsize 439
                root data bytenr 29900800 level 0 dirid 0 refs 1 gen 11 
lastsnap 0
                uuid 00000000-0000-0000-0000-000000000000
        item 1 key (DEV_TREE ROOT_ITEM 0) itemoff 15405 itemsize 439
                root data bytenr 29507584 level 0 dirid 0 refs 1 gen 6 lastsnap 0
                uuid 00000000-0000-0000-0000-000000000000
        item 2 key (FS_TREE INODE_REF 6) itemoff 15388 itemsize 17
                inode ref index 0 namelen 7 name: default
        item 3 key (FS_TREE ROOT_ITEM 0) itemoff 14949 itemsize 439
                root data bytenr 29851648 level 0 dirid 256 refs 1 gen 10 
lastsnap 10
                uuid 00000000-0000-0000-0000-000000000000
                ctransid 10 otransid 0 stransid 0 rtransid 0
        item 4 key (FS_TREE ROOT_REF 257) itemoff 14926 itemsize 23
                root ref key dirid 256 sequence 2 name snap2
        item 5 key (ROOT_TREE_DIR INODE_ITEM 0) itemoff 14766 itemsize 160
                inode generation 3 transid 0 size 0 nbytes 16384
                block group 0 mode 40755 links 1 uid 0 gid 0
                rdev 0 flags 0x0
        item 6 key (ROOT_TREE_DIR INODE_REF 6) itemoff 14754 itemsize 12
                inode ref index 0 namelen 2 name: ..
        item 7 key (ROOT_TREE_DIR DIR_ITEM 2378154706) itemoff 14717 itemsize 37
                location key (FS_TREE ROOT_ITEM -1) type DIR
                namelen 7 datalen 0 name: default
        item 8 key (CSUM_TREE ROOT_ITEM 0) itemoff 14278 itemsize 439
                root data bytenr 29933568 level 0 dirid 0 refs 1 gen 11 
lastsnap 0
                uuid 00000000-0000-0000-0000-000000000000
        item 9 key (QUOTA_TREE ROOT_ITEM 0) itemoff 13839 itemsize 439
                root data bytenr 29917184 level 0 dirid 0 refs 1 gen 11 
lastsnap 0
                uuid d66e47c6-9943-ae4e-9adb-6d97065f6358
        item 10 key (UUID_TREE ROOT_ITEM 0) itemoff 13400 itemsize 439
                root data bytenr 29802496 level 0 dirid 0 refs 1 gen 10 
lastsnap 0
                uuid 4bded89b-be0f-ba46-becf-15604fcc58fc
        item 11 key (256 INODE_ITEM 0) itemoff 13240 itemsize 160
                inode generation 11 transid 11 size 262144 nbytes 1572864
                block group 0 mode 100600 links 1 uid 0 gid 0
                rdev 0 flags 0x1b
        item 12 key (256 EXTENT_DATA 0) itemoff 13187 itemsize 53
                extent data disk byte 12845056 nr 262144
                extent data offset 0 nr 262144 ram 262144
                extent compression 0
        item 13 key (257 ROOT_ITEM 10) itemoff 12748 itemsize 439
                root data bytenr 29736960 level 0 dirid 256 refs 1 gen 10 
lastsnap 10
                uuid fb326c16-07e8-4944-aba6-9154d860322c
        item 14 key (257 ROOT_BACKREF 5) itemoff 12725 itemsize 23
                root backref key dirid 256 sequence 2 name snap2
        item 15 key (FREE_SPACE UNTYPED 29360128) itemoff 12684 itemsize 41
                location key (256 INODE_ITEM 0)
                cache generation 11 entries 10 bitmaps 0
        item 16 key (DATA_RELOC_TREE ROOT_ITEM 0) itemoff 12245 itemsize 439
                root data bytenr 29442048 level 0 dirid 256 refs 1 gen 4 
lastsnap 0
                uuid 00000000-0000-0000-0000-000000000000
chunk tree
leaf 20987904 items 4 free space 15781 generation 5 owner 3
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (DEV_ITEMS DEV_ITEM 1) itemoff 16185 itemsize 98
                dev item devid 1 total_bytes 17178820608 bytes used 2172649472
                dev uuid 24080b38-13bb-4f4c-8c9f-c6d5313c8621
        item 1 key (FIRST_CHUNK_TREE CHUNK_ITEM 12582912) itemoff 16105 
itemsize 80
                chunk length 8388608 owner 2 stripe_len 65536
                type DATA num_stripes 1
                        stripe 0 devid 1 offset 12582912
                        dev uuid: 24080b38-13bb-4f4c-8c9f-c6d5313c8621
        item 2 key (FIRST_CHUNK_TREE CHUNK_ITEM 20971520) itemoff 15993 
itemsize 112
                chunk length 8388608 owner 2 stripe_len 65536
                type SYSTEM|DUP num_stripes 2
                        stripe 0 devid 1 offset 20971520
                        dev uuid: 24080b38-13bb-4f4c-8c9f-c6d5313c8621
                        stripe 1 devid 1 offset 29360128
                        dev uuid: 24080b38-13bb-4f4c-8c9f-c6d5313c8621
        item 3 key (FIRST_CHUNK_TREE CHUNK_ITEM 29360128) itemoff 15881 
itemsize 112
                chunk length 1073741824 owner 2 stripe_len 65536
                type METADATA|DUP num_stripes 2
                        stripe 0 devid 1 offset 37748736
                        dev uuid: 24080b38-13bb-4f4c-8c9f-c6d5313c8621
                        stripe 1 devid 1 offset 1111490560
                        dev uuid: 24080b38-13bb-4f4c-8c9f-c6d5313c8621
extent tree key (EXTENT_TREE ROOT_ITEM 0) 
leaf 29900800 items 14 free space 15478 generation 11 owner 2
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (12582912 BLOCK_GROUP_ITEM 8388608) itemoff 16259 itemsize 24
                block group used 262144 chunk_objectid 256 flags DATA
        item 1 key (12845056 EXTENT_ITEM 262144) itemoff 16206 itemsize 53
                extent refs 1 gen 11 flags DATA
                extent data backref root 1 objectid 256 offset 0 count 1
        item 2 key (20971520 BLOCK_GROUP_ITEM 8388608) itemoff 16182 itemsize 24
                block group used 16384 chunk_objectid 256 flags SYSTEM|DUP
        item 3 key (20987904 METADATA_ITEM 0) itemoff 16149 itemsize 33
                extent refs 1 gen 5 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 3
        item 4 key (29360128 BLOCK_GROUP_ITEM 1073741824) itemoff 16125 
itemsize 24
                block group used 147456 chunk_objectid 256 flags METADATA|DUP
        item 5 key (29442048 METADATA_ITEM 0) itemoff 16092 itemsize 33
                extent refs 1 gen 4 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 18446744073709551607
        item 6 key (29507584 METADATA_ITEM 0) itemoff 16059 itemsize 33
                extent refs 1 gen 6 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 4
        item 7 key (29736960 METADATA_ITEM 0) itemoff 16026 itemsize 33
                extent refs 1 gen 10 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 257
        item 8 key (29802496 METADATA_ITEM 0) itemoff 15993 itemsize 33
                extent refs 1 gen 10 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 9
        item 9 key (29851648 METADATA_ITEM 0) itemoff 15960 itemsize 33
                extent refs 1 gen 10 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 5
        item 10 key (29884416 METADATA_ITEM 0) itemoff 15927 itemsize 33
                extent refs 1 gen 11 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 1
        item 11 key (29900800 METADATA_ITEM 0) itemoff 15894 itemsize 33
                extent refs 1 gen 11 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 2
        item 12 key (29917184 METADATA_ITEM 0) itemoff 15861 itemsize 33
                extent refs 1 gen 11 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 8
        item 13 key (29933568 METADATA_ITEM 0) itemoff 15828 itemsize 33
                extent refs 1 gen 11 flags TREE_BLOCK
                tree block skinny level 0
                tree block backref root 7
device tree key (DEV_TREE ROOT_ITEM 0) 
leaf 29507584 items 6 free space 15853 generation 6 owner 4
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (0 DEV_STATS 1) itemoff 16243 itemsize 40
                device stats
        item 1 key (1 DEV_EXTENT 12582912) itemoff 16195 itemsize 48
                dev extent chunk_tree 3
                chunk objectid 256 chunk offset 12582912 length 8388608
        item 2 key (1 DEV_EXTENT 20971520) itemoff 16147 itemsize 48
                dev extent chunk_tree 3
                chunk objectid 256 chunk offset 20971520 length 8388608
        item 3 key (1 DEV_EXTENT 29360128) itemoff 16099 itemsize 48
                dev extent chunk_tree 3
                chunk objectid 256 chunk offset 20971520 length 8388608
        item 4 key (1 DEV_EXTENT 37748736) itemoff 16051 itemsize 48
                dev extent chunk_tree 3
                chunk objectid 256 chunk offset 29360128 length 1073741824
        item 5 key (1 DEV_EXTENT 1111490560) itemoff 16003 itemsize 48
                dev extent chunk_tree 3
                chunk objectid 256 chunk offset 29360128 length 1073741824
fs tree key (FS_TREE ROOT_ITEM 0) 
leaf 29851648 items 4 free space 15941 generation 10 owner 5
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (256 INODE_ITEM 0) itemoff 16123 itemsize 160
                inode generation 3 transid 10 size 10 nbytes 16384
                block group 0 mode 40755 links 1 uid 0 gid 0
                rdev 0 flags 0x0
        item 1 key (256 INODE_REF 256) itemoff 16111 itemsize 12
                inode ref index 0 namelen 2 name: ..
        item 2 key (256 DIR_ITEM 3390559794) itemoff 16076 itemsize 35
                location key (257 ROOT_ITEM -1) type DIR
                namelen 5 datalen 0 name: snap2
        item 3 key (256 DIR_INDEX 2) itemoff 16041 itemsize 35
                location key (257 ROOT_ITEM -1) type DIR
                namelen 5 datalen 0 name: snap2
checksum tree key (CSUM_TREE ROOT_ITEM 0) 
leaf 29933568 items 0 free space 16283 generation 11 owner 7
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
quota tree key (QUOTA_TREE ROOT_ITEM 0) 
leaf 29917184 items 5 free space 15966 generation 11 owner 8
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (0 QGROUP_STATUS 0) itemoff 16251 itemsize 32
                version 1 generation 11 flags ON scan -1
        item 1 key (0 QGROUP_INFO 0/5) itemoff 16211 itemsize 40
                generation 10
                referenced 32768 referenced compressed 32768
                exclusive 32768 exclusive compressed 32768
        item 2 key (0 QGROUP_INFO 0/257) itemoff 16171 itemsize 40
                generation 10
                referenced 16384 referenced compressed 16384
                exclusive 16384 exclusive compressed 16384
        item 3 key (0 QGROUP_LIMIT 0/5) itemoff 16131 itemsize 40
                flags 0
                max referenced 0 max exclusive 0
                rsv referenced 0 rsv exclusive 0
        item 4 key (0 QGROUP_LIMIT 0/257) itemoff 16091 itemsize 40
                flags 0
                max referenced 0 max exclusive 0
                rsv referenced 0 rsv exclusive 0
uuid tree key (UUID_TREE ROOT_ITEM 0) 
leaf 29802496 items 1 free space 16250 generation 10 owner 9
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (0x4449e807166c32fb UUID_KEY_SUBVOL 0x2c3260d85491a6ab) 
itemoff 16275 itemsize 8
                subvol_id 257
file tree key (257 ROOT_ITEM 10) 
leaf 29736960 items 2 free space 16061 generation 10 owner 257
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (256 INODE_ITEM 0) itemoff 16123 itemsize 160
                inode generation 3 transid 0 size 0 nbytes 16384
                block group 0 mode 40755 links 1 uid 0 gid 0
                rdev 0 flags 0x0
        item 1 key (256 INODE_REF 256) itemoff 16111 itemsize 12
                inode ref index 0 namelen 2 name: ..
data reloc tree key (DATA_RELOC_TREE ROOT_ITEM 0) 
leaf 29442048 items 2 free space 16061 generation 4 owner 18446744073709551607
fs uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
chunk uuid b78fe016-e35f-4f57-8211-796cbc9be3a4
        item 0 key (256 INODE_ITEM 0) itemoff 16123 itemsize 160
                inode generation 3 transid 0 size 0 nbytes 16384
                block group 0 mode 40755 links 1 uid 0 gid 0
                rdev 0 flags 0x0
        item 1 key (256 INODE_REF 256) itemoff 16111 itemsize 12
                inode ref index 0 namelen 2 name: ..
total bytes 17178820608
bytes used 425984
uuid f7e55c97-b0b3-44e5-bab1-1fd55d54409b
btrfs-progs v4.4+20160122

Reply via email to