Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6] / include / linux / raid_class.h
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 *);