]>
Commit | Line | Data |
---|---|---|
61a7afa2 JB |
1 | /* |
2 | */ | |
3 | #include <linux/transport_class.h> | |
4 | ||
5 | struct raid_template { | |
6 | struct transport_container raid_attrs; | |
7 | }; | |
8 | ||
9 | struct raid_function_template { | |
10 | void *cookie; | |
11 | int (*is_raid)(struct device *); | |
12 | void (*get_resync)(struct device *); | |
13 | void (*get_state)(struct device *); | |
14 | }; | |
15 | ||
16 | enum raid_state { | |
17 | RAID_ACTIVE = 1, | |
18 | RAID_DEGRADED, | |
19 | RAID_RESYNCING, | |
20 | RAID_OFFLINE, | |
21 | }; | |
22 | ||
23 | struct raid_data { | |
24 | struct list_head component_list; | |
25 | int component_count; | |
26 | int level; | |
27 | enum raid_state state; | |
28 | int resync; | |
29 | }; | |
30 | ||
31 | #define DEFINE_RAID_ATTRIBUTE(type, attr) \ | |
32 | static inline void \ | |
33 | raid_set_##attr(struct raid_template *r, struct device *dev, type value) { \ | |
34 | struct class_device *cdev = \ | |
35 | attribute_container_find_class_device(&r->raid_attrs.ac, dev);\ | |
36 | struct raid_data *rd; \ | |
37 | BUG_ON(!cdev); \ | |
38 | rd = class_get_devdata(cdev); \ | |
39 | rd->attr = value; \ | |
40 | } \ | |
41 | static inline type \ | |
42 | raid_get_##attr(struct raid_template *r, struct device *dev) { \ | |
43 | struct class_device *cdev = \ | |
44 | attribute_container_find_class_device(&r->raid_attrs.ac, dev);\ | |
45 | struct raid_data *rd; \ | |
46 | BUG_ON(!cdev); \ | |
47 | rd = class_get_devdata(cdev); \ | |
48 | return rd->attr; \ | |
49 | } | |
50 | ||
51 | DEFINE_RAID_ATTRIBUTE(int, level) | |
52 | DEFINE_RAID_ATTRIBUTE(int, resync) | |
53 | DEFINE_RAID_ATTRIBUTE(enum raid_state, state) | |
54 | ||
55 | struct raid_template *raid_class_attach(struct raid_function_template *); | |
56 | void raid_class_release(struct raid_template *); | |
57 | ||
58 | void raid_component_add(struct raid_template *, struct device *, | |
59 | struct device *); |