xref: /linux/drivers/md/bcache/features.h (revision 48dea9a700c8728cc31a1dd44588b97578de86ee)
1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 #ifndef _BCACHE_FEATURES_H
3 #define _BCACHE_FEATURES_H
4 
5 #include <linux/bcache.h>
6 #include <linux/kernel.h>
7 #include <linux/types.h>
8 
9 #define BCH_FEATURE_COMPAT		0
10 #define BCH_FEATURE_RO_COMPAT		1
11 #define BCH_FEATURE_INCOMPAT		2
12 #define BCH_FEATURE_TYPE_MASK		0x03
13 
14 /* Feature set definition */
15 /* Incompat feature set */
16 #define BCH_FEATURE_INCOMPAT_LARGE_BUCKET	0x0001 /* 32bit bucket size */
17 
18 #define BCH_FEATURE_COMPAT_SUUP		0
19 #define BCH_FEATURE_RO_COMPAT_SUUP	0
20 #define BCH_FEATURE_INCOMPAT_SUUP	BCH_FEATURE_INCOMPAT_LARGE_BUCKET
21 
22 #define BCH_HAS_COMPAT_FEATURE(sb, mask) \
23 		((sb)->feature_compat & (mask))
24 #define BCH_HAS_RO_COMPAT_FEATURE(sb, mask) \
25 		((sb)->feature_ro_compat & (mask))
26 #define BCH_HAS_INCOMPAT_FEATURE(sb, mask) \
27 		((sb)->feature_incompat & (mask))
28 
29 #define BCH_FEATURE_COMPAT_FUNCS(name, flagname) \
30 static inline int bch_has_feature_##name(struct cache_sb *sb) \
31 { \
32 	return (((sb)->feature_compat & \
33 		BCH##_FEATURE_COMPAT_##flagname) != 0); \
34 } \
35 static inline void bch_set_feature_##name(struct cache_sb *sb) \
36 { \
37 	(sb)->feature_compat |= \
38 		BCH##_FEATURE_COMPAT_##flagname; \
39 } \
40 static inline void bch_clear_feature_##name(struct cache_sb *sb) \
41 { \
42 	(sb)->feature_compat &= \
43 		~BCH##_FEATURE_COMPAT_##flagname; \
44 }
45 
46 #define BCH_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
47 static inline int bch_has_feature_##name(struct cache_sb *sb) \
48 { \
49 	return (((sb)->feature_ro_compat & \
50 		BCH##_FEATURE_RO_COMPAT_##flagname) != 0); \
51 } \
52 static inline void bch_set_feature_##name(struct cache_sb *sb) \
53 { \
54 	(sb)->feature_ro_compat |= \
55 		BCH##_FEATURE_RO_COMPAT_##flagname; \
56 } \
57 static inline void bch_clear_feature_##name(struct cache_sb *sb) \
58 { \
59 	(sb)->feature_ro_compat &= \
60 		~BCH##_FEATURE_RO_COMPAT_##flagname; \
61 }
62 
63 #define BCH_FEATURE_INCOMPAT_FUNCS(name, flagname) \
64 static inline int bch_has_feature_##name(struct cache_sb *sb) \
65 { \
66 	return (((sb)->feature_incompat & \
67 		BCH##_FEATURE_INCOMPAT_##flagname) != 0); \
68 } \
69 static inline void bch_set_feature_##name(struct cache_sb *sb) \
70 { \
71 	(sb)->feature_incompat |= \
72 		BCH##_FEATURE_INCOMPAT_##flagname; \
73 } \
74 static inline void bch_clear_feature_##name(struct cache_sb *sb) \
75 { \
76 	(sb)->feature_incompat &= \
77 		~BCH##_FEATURE_INCOMPAT_##flagname; \
78 }
79 
80 BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LARGE_BUCKET);
81 
82 int bch_print_cache_set_feature_compat(struct cache_set *c, char *buf, int size);
83 int bch_print_cache_set_feature_ro_compat(struct cache_set *c, char *buf, int size);
84 int bch_print_cache_set_feature_incompat(struct cache_set *c, char *buf, int size);
85 
86 #endif
87