FAILED: patch "[PATCH] btrfs: destroy qgroup extent records on transaction abort" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 81f7eb00ff5bb8326e82503a32809421d14abb8a Mon Sep 17 00:00:00 2001
From: Jeff Mahoney <[email protected]>
Date: Tue, 11 Feb 2020 15:25:37 +0800
Subject: [PATCH] btrfs: destroy qgroup extent records on transaction abort
We clean up the delayed references when we abort a transaction but we leave the pending qgroup extent records behind, leaking memory.
This patch destroys the extent records when we destroy the delayed refs and makes sure ensure they're gone before releasing the transaction.
[ Rebased to latest upstream, remove to_qgroup() helper, use
rbtree_postorder_for_each_entry_safe() wrapper ]
fs/btrfs/disk-io.c +1 -0
@@ -4276,6 +4276,7 @@ static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans,cond_resched ();spin_lock (&delayed_refs->lock); } +btrfs_qgroup_destroy_extent_records (trans);spin_unlock (&delayed_refs->lock);
fs/btrfs/qgroup.c +13 -0
@@ -4002,3 +4002,16 @@ int btrfs_qgroup_trace_subtree_after_cow(struct btrfs_trans_handle *trans, }return ret; } + +void btrfs_qgroup_destroy_extent_records (struct btrfs_transaction *trans) +{ +struct btrfs_qgroup_extent_record *entry; +struct btrfs_qgroup_extent_record *next; +struct rb_root *root; + + root = &trans->delayed_refs.dirty_extent_root; +rbtree_postorder_for_each_entry_safe (entry, next, root, node) { +ulist_free (entry->old_roots); +kfree (entry); + } +}
fs/btrfs/qgroup.h +1 -0
@@ -414,5 +414,6 @@ int btrfs_qgroup_add_swapped_blocks(struct btrfs_trans_handle *trans, u64 last_snapshot);int btrfs_qgroup_trace_subtree_after_cow (struct btrfs_trans_handle *trans,struct btrfs_root *root,struct extent_buffer *eb); +void btrfs_qgroup_destroy_extent_records (struct btrfs_transaction *trans);#endif
fs/btrfs/transaction.c +2 -0
@@ -121,6 +121,8 @@ void btrfs_put_transaction(struct btrfs_transaction *transaction)BUG_ON (!list_empty (&transaction->list));WARN_ON (!RB_EMPTY_ROOT ( &transaction->delayed_refs.href_root.rb_root)); +WARN_ON (!RB_EMPTY_ROOT ( + &transaction->delayed_refs.dirty_extent_root));if (transaction->delayed_refs.pending_csums) btrfs_err(transaction->fs_info, "pending csums is %llu",