[PATCH] btrfs: fix leaking BTRFS_FS_STATE_REMOUNTING flag

Qu Wenruo <[email protected]>
Newsgroups org.kernel.vger.linux-btrfs
Message-ID <60a629f78bbd03c07e8907101a23368722c47662.1783153727.git.wqu@suse.com>
[BUG]
The following script can lead to unexpected qgroup rescan failure:

 # mkfs.btrfs -f -O quota $dev
 # mount $dev $mnt
 # mount -o remount,rescue=ibadroots $mnt
   ^^^^^ This above command is expected to fail

 # btrfs quota rescan -w $mnt
   ^^^^^ The above qgroup rescan is not expected to fail

 # btrfs qgroup show $mnt
 WARNING: qgroup data inconsistent, rescan recommended
 Qgroupid    Referenced    Exclusive   Path
 --------    ----------    ---------   ----
 0/5           16.00KiB     16.00KiB   <toplevel>

The above short script will be converted to a proper fstests case.

[CAUSE]
Inside btrfs_reconfigure(), if either btrfs_check_options() or
btrfs_check_features() failed, we will always have
BTRFS_FS_STATE_REMOUNTING set for the fs until the next successful
remount.

That BTRFS_FS_STATE_REMOUNTING flag will interrupt several operations,
including:

- Qgroup rescan
- Auto defrag
- Space reclaim

[FIX]
Change the error handling of btrfs_check_options() and
btrfs_check_features() to goto restore label.

Fixes: eddb1a433f26 ("btrfs: add reconfigure callback for fs_context")
Signed-off-by: Qu Wenruo <[email protected]>
---
 fs/btrfs/super.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index a8c55f7571d0..5843254e3aaf 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -1510,12 +1510,14 @@ static int btrfs_reconfigure(struct fs_context *fc)
 	sync_filesystem(sb);
 	set_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state);
 
-	if (!btrfs_check_options(fs_info, &ctx->mount_opt, fc->sb_flags))
-		return -EINVAL;
+	if (!btrfs_check_options(fs_info, &ctx->mount_opt, fc->sb_flags)) {
+		ret = -EINVAL;
+		goto restore;
+	}
 
 	ret = btrfs_check_features(fs_info, !(fc->sb_flags & SB_RDONLY));
 	if (ret < 0)
-		return ret;
+		goto restore;
 
 	btrfs_ctx_to_info(fs_info, ctx);
 	btrfs_remount_begin(fs_info, old_ctx.mount_opt, fc->sb_flags);
-- 
2.54.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.