mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
bcache: check unsupported feature sets for bcache register
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:d721a43ff6
("bcache: increase super block version for cache device and backing device") Fixes:ffa4703275
("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>
This commit is contained in:
parent
f7b4943dea
commit
1dfc0686c2
@ -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…
Reference in New Issue
Block a user