FAILED: patch "[PATCH] btrfs: free qgroup pertrans reserve on transaction abort" failed to apply to 6.6-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.6-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]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x b321a52cce062ec7ed385333a33905d22159ce36
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023121836-strike-backlit-ebd3@gregkh' --subject-prefix 'PATCH 6.6.y' HEAD^..
Possible dependencies:
b321a52cce06 ("btrfs: free qgroup pertrans reserve on transaction abort") 091344508249 ("btrfs: qgroup: use qgroup_iterator in qgroup_convert_meta()")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b321a52cce062ec7ed385333a33905d22159ce36 Mon Sep 17 00:00:00 2001
From: Boris Burkov <[email protected]>
Date: Fri, 1 Dec 2023 13:00:11 -0800
Subject: [PATCH] btrfs: free qgroup pertrans reserve on transaction abort
If we abort a transaction, we never run the code that frees the pertrans qgroup reservation. This results in warnings on unmount as that reservation has been leaked. The leak isn't a huge issue since the fs is read-only, but it's better to clean it up when we know we can/should. Do it during the cleanup_transaction step of aborting.
fs/btrfs/disk-io.c +28 -0
@@ -4799,6 +4799,32 @@ void btrfs_cleanup_dirty_bgs(struct btrfs_transaction *cur_trans, } } +static void btrfs_free_all_qgroup_pertrans (struct btrfs_fs_info *fs_info) +{ +struct btrfs_root *gang[8 ]; +int i; +int ret; + +spin_lock (&fs_info->fs_roots_radix_lock); +while (1 ) { + ret =radix_tree_gang_lookup_tag (&fs_info->fs_roots_radix, + (void **)gang,0 , +ARRAY_SIZE (gang), +BTRFS_ROOT_TRANS_TAG ); +if (ret ==0 ) +break ; +for (i =0 ; i < ret; i++) { +struct btrfs_root *root = gang[i]; + +btrfs_qgroup_free_meta_all_pertrans (root); +radix_tree_tag_clear (&fs_info->fs_roots_radix, + (unsigned long )root->root_key.objectid, +BTRFS_ROOT_TRANS_TAG ); + } + } +spin_unlock (&fs_info->fs_roots_radix_lock); +} +void btrfs_cleanup_one_transaction (struct btrfs_transaction *cur_trans,struct btrfs_fs_info *fs_info) {
@@ -4827,6 +4853,8 @@ void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans, EXTENT_DIRTY);btrfs_destroy_pinned_extent (fs_info, &cur_trans->pinned_extents); +btrfs_free_all_qgroup_pertrans (fs_info); + cur_trans->state =TRANS_STATE_COMPLETED ;wake_up (&cur_trans->commit_wait); }
fs/btrfs/qgroup.c +3 -2
@@ -4337,8 +4337,9 @@ static void qgroup_convert_meta(struct btrfs_fs_info *fs_info, u64 ref_root,qgroup_rsv_release (fs_info, qgroup, num_bytes,BTRFS_QGROUP_RSV_META_PREALLOC ); -qgroup_rsv_add (fs_info, qgroup, num_bytes, -BTRFS_QGROUP_RSV_META_PERTRANS ); +if (!sb_rdonly (fs_info->sb)) +qgroup_rsv_add (fs_info, qgroup, num_bytes, +BTRFS_QGROUP_RSV_META_PERTRANS );list_for_each_entry (glist, &qgroup->groups, next_group)qgroup_iterator_add (&qgroup_list, glist->group);
fs/btrfs/transaction.c +0 -2
@@ -37,8 +37,6 @@static struct kmem_cache *btrfs_trans_handle_cachep; -#define BTRFS_ROOT_TRANS_TAG 0 -/* * Transaction states and transitions *
fs/btrfs/transaction.h +3 -0
@@ -12,6 +12,9 @@#include "ctree.h" #include "misc.h" +/* Radix-tree tag for roots that are part of the trasaction. */ +#define BTRFS_ROOT_TRANS_TAG 0 +enum btrfs_trans_state {TRANS_STATE_RUNNING ,TRANS_STATE_COMMIT_PREP ,