Merge tag 'ceph-for-5.11-rc2' of git://github.com/ceph/ceph-client
[linux-2.6-microblaze.git] / drivers / md / bcache / features.h
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