lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 119/862] btrfs: enhance unsupported compat RO flags handling
    Date
    From: Qu Wenruo <wqu@suse.com>

    commit 81d5d61454c365718655cfc87d8200c84e25d596 upstream.

    Currently there are two corner cases not handling compat RO flags
    correctly:

    - Remount
    We can still mount the fs RO with compat RO flags, then remount it RW.
    We should not allow any write into a fs with unsupported RO flags.

    - Still try to search block group items
    In fact, behavior/on-disk format change to extent tree should not
    need a full incompat flag.

    And since we can ensure fs with unsupported RO flags never got any
    writes (with above case fixed), then we can even skip block group
    items search at mount time.

    This patch will enhance the unsupported RO compat flags by:

    - Reject read-write remount if there are unsupported RO compat flags

    - Go dummy block group items directly for unsupported RO compat flags
    In fact, only changes to chunk/subvolume/root/csum trees should go
    incompat flags.

    The latter part should allow future change to extent tree to be compat
    RO flags.

    Thus this patch also needs to be backported to all stable trees.

    CC: stable@vger.kernel.org # 4.9+
    Reviewed-by: Nikolay Borisov <nborisov@suse.com>
    Signed-off-by: Qu Wenruo <wqu@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/btrfs/block-group.c | 11 ++++++++++-
    fs/btrfs/super.c | 9 +++++++++
    2 files changed, 19 insertions(+), 1 deletion(-)

    --- a/fs/btrfs/block-group.c
    +++ b/fs/btrfs/block-group.c
    @@ -2190,7 +2190,16 @@ int btrfs_read_block_groups(struct btrfs
    int need_clear = 0;
    u64 cache_gen;

    - if (!root)
    + /*
    + * Either no extent root (with ibadroots rescue option) or we have
    + * unsupported RO options. The fs can never be mounted read-write, so no
    + * need to waste time searching block group items.
    + *
    + * This also allows new extent tree related changes to be RO compat,
    + * no need for a full incompat flag.
    + */
    + if (!root || (btrfs_super_compat_ro_flags(info->super_copy) &
    + ~BTRFS_FEATURE_COMPAT_RO_SUPP))
    return fill_dummy_bgs(info);

    key.objectid = 0;
    --- a/fs/btrfs/super.c
    +++ b/fs/btrfs/super.c
    @@ -2112,6 +2112,15 @@ static int btrfs_remount(struct super_bl
    ret = -EINVAL;
    goto restore;
    }
    + if (btrfs_super_compat_ro_flags(fs_info->super_copy) &
    + ~BTRFS_FEATURE_COMPAT_RO_SUPP) {
    + btrfs_err(fs_info,
    + "can not remount read-write due to unsupported optional flags 0x%llx",
    + btrfs_super_compat_ro_flags(fs_info->super_copy) &
    + ~BTRFS_FEATURE_COMPAT_RO_SUPP);
    + ret = -EINVAL;
    + goto restore;
    + }
    if (fs_info->fs_devices->rw_devices == 0) {
    ret = -EACCES;
    goto restore;

    \
     
     \ /
      Last update: 2022-10-19 15:28    [W:4.135 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site