On Thu, October 24, 2013 at 16:49 (+0200), Wang Shilong wrote: > Hello Jan, > >> btrfs_dec_ref() queued a delayed ref for owner of a tree block. The qgroup >> tracking is based on delayed refs. The owner of a tree block is set when a >> tree block is allocated, it is never updated. >> >> When you allocate a tree block and then remove the subvolume that did the >> allocation, the qgroup accounting for that removal is correct. However, the >> removal was accounted again for each subvolume deletion that also referenced >> the tree block, because accounting was erroneously based on the owner. >> >> Instead of queueing delayed refs for the non-existent owner, we now >> queue delayed refs for the root being removed. This fixes the qgroup >> accounting. > > Thanks for tracking this, i apply your patch, and using the flowing patch, > found the problem still exist, the test script like the following: Reproduced. Gives more negative numbers due to accounting triggered by the cleaner thread, that's the common part here. I still believe that the fix I sent is correct, it's probably not complete. Looking into it. Thanks, -Jan > #!/bin/sh > > for i in $(seq 1000) > do > dd if=/dev/zero of=<mnt>/$i""aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bs=10K count=1 > done > > btrfs sub snapshot <mnt> <mnt>/1 > for i in $(seq 100) > do > btrfs sub snapshot <mnt>/$i <mnt>/$(($i+1)) > done > > for i in $(seq 101) > do > btrfs sub delete <mnt>/$i > done > > > Thanks, > Wang -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
