From: Greg Kroah-Hartman Date: Fri, 24 Jul 2020 09:47:21 +0000 (+0200) Subject: 5.7-stable patches X-Git-Tag: v4.14.190~40 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bb6e8bc4255e961159c28552b552a7f87fe86912;p=thirdparty%2Fkernel%2Fstable-queue.git 5.7-stable patches added patches: btrfs-reloc-clear-dead_reloc_tree-bit-for-orphan-roots-to-prevent-runaway-balance.patch --- diff --git a/queue-5.7/btrfs-reloc-clear-dead_reloc_tree-bit-for-orphan-roots-to-prevent-runaway-balance.patch b/queue-5.7/btrfs-reloc-clear-dead_reloc_tree-bit-for-orphan-roots-to-prevent-runaway-balance.patch new file mode 100644 index 00000000000..75b2708a255 --- /dev/null +++ b/queue-5.7/btrfs-reloc-clear-dead_reloc_tree-bit-for-orphan-roots-to-prevent-runaway-balance.patch @@ -0,0 +1,66 @@ +From 1dae7e0e58b484eaa43d530f211098fdeeb0f404 Mon Sep 17 00:00:00 2001 +From: Qu Wenruo +Date: Wed, 20 May 2020 14:58:51 +0800 +Subject: btrfs: reloc: clear DEAD_RELOC_TREE bit for orphan roots to prevent runaway balance + +From: Qu Wenruo + +commit 1dae7e0e58b484eaa43d530f211098fdeeb0f404 upstream. + +[BUG] +There are several reported runaway balance, that balance is flooding the +log with "found X extents" where the X never changes. + +[CAUSE] +Commit d2311e698578 ("btrfs: relocation: Delay reloc tree deletion after +merge_reloc_roots") introduced BTRFS_ROOT_DEAD_RELOC_TREE bit to +indicate that one subvolume has finished its tree blocks swap with its +reloc tree. + +However if balance is canceled or hits ENOSPC halfway, we didn't clear +the BTRFS_ROOT_DEAD_RELOC_TREE bit, leaving that bit hanging forever +until unmount. + +Any subvolume root with that bit, would cause backref cache to skip this +tree block, as it has finished its tree block swap. This would cause +all tree blocks of that root be ignored by balance, leading to runaway +balance. + +[FIX] +Fix the problem by also clearing the BTRFS_ROOT_DEAD_RELOC_TREE bit for +the original subvolume of orphan reloc root. + +Add an umount check for the stale bit still set. + +Fixes: d2311e698578 ("btrfs: relocation: Delay reloc tree deletion after merge_reloc_roots") +Signed-off-by: Qu Wenruo +Signed-off-by: David Sterba +Signed-off-by: Greg Kroah-Hartman + + +--- + fs/btrfs/disk-io.c | 1 + + fs/btrfs/relocation.c | 2 ++ + 2 files changed, 3 insertions(+) + +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -1998,6 +1998,7 @@ void btrfs_put_root(struct btrfs_root *r + + if (refcount_dec_and_test(&root->refs)) { + WARN_ON(!RB_EMPTY_ROOT(&root->inode_tree)); ++ WARN_ON(test_bit(BTRFS_ROOT_DEAD_RELOC_TREE, &root->state)); + if (root->anon_dev) + free_anon_bdev(root->anon_dev); + btrfs_drew_lock_destroy(&root->snapshot_lock); +--- a/fs/btrfs/relocation.c ++++ b/fs/btrfs/relocation.c +@@ -2642,6 +2642,8 @@ again: + root->reloc_root = NULL; + btrfs_put_root(reloc_root); + } ++ clear_bit(BTRFS_ROOT_DEAD_RELOC_TREE, ++ &root->state); + btrfs_put_root(root); + } + diff --git a/queue-5.7/series b/queue-5.7/series index e7f9cb82e24..9a301ae5b2e 100644 --- a/queue-5.7/series +++ b/queue-5.7/series @@ -28,3 +28,4 @@ exfat-fix-overflow-issue-in-exfat_cluster_to_sector.patch exfat-fix-wrong-hint_stat-initialization-in-exfat_find_dir_entry.patch exfat-fix-wrong-size-update-of-stream-entry-by-typo.patch exfat-fix-name_hash-computation-on-big-endian-systems.patch +btrfs-reloc-clear-dead_reloc_tree-bit-for-orphan-roots-to-prevent-runaway-balance.patch