On Tue, Oct 11, 2022 at 10:50:09AM -0400, Sasha Levin wrote:
From: Qu Wenruo wqu@suse.com
[ Upstream commit d7f67ac9a928fa158a95573406eac0a887bbc28c ]
[BUG] When one user did a wrong attempt to clear block group tree, which can not be done through mount option, by using "-o clear_cache,space_cache=v2", it will cause the following error on a fs with block-group-tree feature:
BTRFS info (device dm-1): force clearing of disk cache BTRFS info (device dm-1): using free space tree BTRFS info (device dm-1): clearing free space tree BTRFS info (device dm-1): clearing compat-ro feature flag for FREE_SPACE_TREE (0x1) BTRFS info (device dm-1): clearing compat-ro feature flag for FREE_SPACE_TREE_VALID (0x2) BTRFS error (device dm-1): block-group-tree feature requires fres-space-tree and no-holes BTRFS error (device dm-1): super block corruption detected before writing it to disk BTRFS: error (device dm-1) in write_all_supers:4318: errno=-117 Filesystem corrupted (unexpected superblock corruption detected) BTRFS warning (device dm-1: state E): Skipping commit of aborted transaction.
[CAUSE] Although the dependency for block-group-tree feature is just an artificial one (to reduce test matrix), we put the dependency check into btrfs_validate_super().
This is too strict, and during space cache clearing, we will have a window where free space tree is cleared, and we need to commit the super block.
In that window, we had block group tree without v2 cache, and triggered the artificial dependency check.
This is not necessary at all, especially for such a soft dependency.
[FIX] Introduce a new helper, btrfs_check_features(), to do all the runtime limitation checks, including:
Unsupported incompat flags check
Unsupported compat RO flags check
Setting missing incompat flags
Artificial feature dependency checks Currently only block group tree will rely on this.
Subpage runtime check for v1 cache
With this helper, we can move quite some checks from open_ctree()/btrfs_remount() into it, and just call it after btrfs_parse_options().
Now "-o clear_cache,space_cache=v2" will not trigger the above error anymore.
Signed-off-by: Qu Wenruo wqu@suse.com Reviewed-by: David Sterba dsterba@suse.com [ edit messages ] Signed-off-by: David Sterba dsterba@suse.com Signed-off-by: Sasha Levin sashal@kernel.org
Please drop this from the stable queue, it's for an unreleased feature (ETA 6.1).