lkml.org 
[lkml]   [2021]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 133/145] bcache: check unsupported feature sets for bcache register
    Date
    From: Coly Li <colyli@suse.de>

    commit 1dfc0686c29a9bbd3a446a29f9ccde3dec3bc75a upstream.

    This patch adds the check for features which is incompatible for
    current supported feature sets.

    Now if the bcache device created by bcache-tools has features that
    current kernel doesn't support, read_super() will fail with error
    messoage. E.g. if an unsupported incompatible feature detected,
    bcache register will fail with dmesg "bcache: register_bcache() error :
    Unsupported incompatible feature found".

    Fixes: d721a43ff69c ("bcache: increase super block version for cache device and backing device")
    Fixes: ffa470327572 ("bcache: add bucket_size_hi into struct cache_sb_disk for large bucket")
    Signed-off-by: Coly Li <colyli@suse.de>
    Cc: stable@vger.kernel.org # 5.9+
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/md/bcache/features.h | 15 +++++++++++++++
    drivers/md/bcache/super.c | 14 ++++++++++++++
    2 files changed, 29 insertions(+)

    --- a/drivers/md/bcache/features.h
    +++ b/drivers/md/bcache/features.h
    @@ -79,6 +79,21 @@ static inline void bch_clear_feature_##n

    BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LARGE_BUCKET);

    +static inline bool bch_has_unknown_compat_features(struct cache_sb *sb)
    +{
    + return ((sb->feature_compat & ~BCH_FEATURE_COMPAT_SUPP) != 0);
    +}
    +
    +static inline bool bch_has_unknown_ro_compat_features(struct cache_sb *sb)
    +{
    + return ((sb->feature_ro_compat & ~BCH_FEATURE_RO_COMPAT_SUPP) != 0);
    +}
    +
    +static inline bool bch_has_unknown_incompat_features(struct cache_sb *sb)
    +{
    + return ((sb->feature_incompat & ~BCH_FEATURE_INCOMPAT_SUPP) != 0);
    +}
    +
    int bch_print_cache_set_feature_compat(struct cache_set *c, char *buf, int size);
    int bch_print_cache_set_feature_ro_compat(struct cache_set *c, char *buf, int size);
    int bch_print_cache_set_feature_incompat(struct cache_set *c, char *buf, int size);
    --- a/drivers/md/bcache/super.c
    +++ b/drivers/md/bcache/super.c
    @@ -228,6 +228,20 @@ static const char *read_super(struct cac
    sb->feature_compat = le64_to_cpu(s->feature_compat);
    sb->feature_incompat = le64_to_cpu(s->feature_incompat);
    sb->feature_ro_compat = le64_to_cpu(s->feature_ro_compat);
    +
    + /* Check incompatible features */
    + err = "Unsupported compatible feature found";
    + if (bch_has_unknown_compat_features(sb))
    + goto err;
    +
    + err = "Unsupported read-only compatible feature found";
    + if (bch_has_unknown_ro_compat_features(sb))
    + goto err;
    +
    + err = "Unsupported incompatible feature found";
    + if (bch_has_unknown_incompat_features(sb))
    + goto err;
    +
    err = read_super_common(sb, bdev, s);
    if (err)
    goto err;

    \
     
     \ /
      Last update: 2021-01-11 14:22    [W:4.113 / U:0.488 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site