bcache: check unsupported feature sets for bcache register
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>
This commit is contained in:
parent
fbb23cd187
commit
a9c413cd0c
@ -79,6 +79,21 @@ static inline void bch_clear_feature_##name(struct cache_sb *sb) \
|
||||
|
||||
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);
|
||||
|
@ -228,6 +228,20 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev,
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user