On Tue, Oct 09, 2018 at 02:36:45PM +0800, Qu Wenruo wrote:
> Some qgroup trace events like btrfs_qgroup_release_data() and
> btrfs_qgroup_free_delayed_ref() can still be triggered even qgroup is
> not enabled.
> 
> This is caused by the lack of qgroup status check before really calling
> qgroup functions.
> Thankfully related functions can handle quota disabled case well and just
> do nothing for qgroup disabled case.
> 
> This patch will do earlier check before triggering related trace events.
> 
> And for enabled <-> disabled race case:
> 1) For enabled->disabled case
>    Disable will wipe out all qgroups data including reservation and
>    excl/rfer. Even we leaks some reserveration or numbers, it will
>    still be wiped, so nothing can go wrong.
> 
> 2) For disabled -> enabled case
>    Current btrfs_qgroup_release_data() will use extent_io tree to ensure
>    we won't underflow reservation. And for delayed_ref we use
>    head->qgroup_reserved to record reserved space, so in that case
>    head->qgroup_reserved should be 0 and we won't underflow.
> 
> Reported-by: Chris Murphy <[email protected]>
> Signed-off-by: Qu Wenruo <[email protected]>

Reviewed-by: David Sterba <[email protected]>

I've added the link to the report.

Reply via email to