On Tue, Feb 11, 2020 at 03:25:37PM +0800, Qu Wenruo wrote:
> From: Jeff Mahoney <jeffm@xxxxxxxx>
>
> We clean up the delayed references when we abort a transaction but
> we leave the pending qgroup extent records behind, leaking memory.
>
> This patch destroyes the extent records when we destroy the delayed
> refs and checks to ensure they're gone before releasing the transaction.
>
> Fixes: 3368d001ba5df (btrfs: qgroup: Record possible quota-related extent for qgroup.)
> Signed-off-by: Jeff Mahoney <jeffm@xxxxxxxx>
> [Rebased to latest upstream, remove to_qgroup() helper, use
> rbtree_postorder_for_each_entry_safe() wrapper]
> Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
> ---
> Changelog:
> v2:
> - Update the commit message to remove to_qgroup()
Added to misc-next, thanks.
> +void btrfs_qgroup_destroy_extent_records(struct btrfs_transaction *trans)
> +{
> + struct btrfs_delayed_ref_root *delayed_refs = &trans->delayed_refs;
> + struct btrfs_qgroup_extent_record *entry;
> + struct btrfs_qgroup_extent_record *next;
> + struct rb_root *root = &delayed_refs->dirty_extent_root;
I've removed the delayed_refs varaible indirection:
root = &trans->delayed_refs.dirty_extent_root;
> + rbtree_postorder_for_each_entry_safe(entry, next, root, node) {
> + ulist_free(entry->old_roots);
> + kfree(entry);
> + }
> +}