Skip to content

Commit 1dfc068

Browse files
Coly Liaxboe
authored andcommitted
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: d721a43 ("bcache: increase super block version for cache device and backing device") Fixes: ffa4703 ("bcache: add bucket_size_hi into struct cache_sb_disk for large bucket") Signed-off-by: Coly Li <[email protected]> Cc: [email protected] # 5.9+ Signed-off-by: Jens Axboe <[email protected]>
1 parent f7b4943 commit 1dfc068

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

drivers/md/bcache/features.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,21 @@ static inline void bch_clear_feature_##name(struct cache_sb *sb) \
7979

8080
BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LARGE_BUCKET);
8181

82+
static inline bool bch_has_unknown_compat_features(struct cache_sb *sb)
83+
{
84+
return ((sb->feature_compat & ~BCH_FEATURE_COMPAT_SUPP) != 0);
85+
}
86+
87+
static inline bool bch_has_unknown_ro_compat_features(struct cache_sb *sb)
88+
{
89+
return ((sb->feature_ro_compat & ~BCH_FEATURE_RO_COMPAT_SUPP) != 0);
90+
}
91+
92+
static inline bool bch_has_unknown_incompat_features(struct cache_sb *sb)
93+
{
94+
return ((sb->feature_incompat & ~BCH_FEATURE_INCOMPAT_SUPP) != 0);
95+
}
96+
8297
int bch_print_cache_set_feature_compat(struct cache_set *c, char *buf, int size);
8398
int bch_print_cache_set_feature_ro_compat(struct cache_set *c, char *buf, int size);
8499
int bch_print_cache_set_feature_incompat(struct cache_set *c, char *buf, int size);

drivers/md/bcache/super.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,20 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev,
228228
sb->feature_compat = le64_to_cpu(s->feature_compat);
229229
sb->feature_incompat = le64_to_cpu(s->feature_incompat);
230230
sb->feature_ro_compat = le64_to_cpu(s->feature_ro_compat);
231+
232+
/* Check incompatible features */
233+
err = "Unsupported compatible feature found";
234+
if (bch_has_unknown_compat_features(sb))
235+
goto err;
236+
237+
err = "Unsupported read-only compatible feature found";
238+
if (bch_has_unknown_ro_compat_features(sb))
239+
goto err;
240+
241+
err = "Unsupported incompatible feature found";
242+
if (bch_has_unknown_incompat_features(sb))
243+
goto err;
244+
231245
err = read_super_common(sb, bdev, s);
232246
if (err)
233247
goto err;

0 commit comments

Comments
 (0)