]>
Commit | Line | Data |
---|---|---|
61a7afa2 | 1 | /* |
b1081ea6 JB |
2 | * raid_class.h - a generic raid visualisation class |
3 | * | |
4 | * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com> | |
5 | * | |
6 | * This file is licensed under GPLv2 | |
61a7afa2 JB |
7 | */ |
8 | #include <linux/transport_class.h> | |
9 | ||
10 | struct raid_template { | |
11 | struct transport_container raid_attrs; | |
12 | }; | |
13 | ||
14 | struct raid_function_template { | |
15 | void *cookie; | |
16 | int (*is_raid)(struct device *); | |
17 | void (*get_resync)(struct device *); | |
18 | void (*get_state)(struct device *); | |
19 | }; | |
20 | ||
21 | enum raid_state { | |
b1081ea6 JB |
22 | RAID_STATE_UNKNOWN = 0, |
23 | RAID_STATE_ACTIVE, | |
24 | RAID_STATE_DEGRADED, | |
25 | RAID_STATE_RESYNCING, | |
26 | RAID_STATE_OFFLINE, | |
27 | }; | |
28 | ||
29 | enum raid_level { | |
30 | RAID_LEVEL_UNKNOWN = 0, | |
31 | RAID_LEVEL_LINEAR, | |
32 | RAID_LEVEL_0, | |
33 | RAID_LEVEL_1, | |
8e32ca49 | 34 | RAID_LEVEL_10, |
f7c95ef0 | 35 | RAID_LEVEL_1E, |
b1081ea6 JB |
36 | RAID_LEVEL_3, |
37 | RAID_LEVEL_4, | |
38 | RAID_LEVEL_5, | |
8e32ca49 | 39 | RAID_LEVEL_50, |
b1081ea6 | 40 | RAID_LEVEL_6, |
34e81f7a | 41 | RAID_LEVEL_JBOD, |
61a7afa2 JB |
42 | }; |
43 | ||
44 | struct raid_data { | |
45 | struct list_head component_list; | |
46 | int component_count; | |
b1081ea6 | 47 | enum raid_level level; |
61a7afa2 JB |
48 | enum raid_state state; |
49 | int resync; | |
50 | }; | |
51 | ||
b1081ea6 JB |
52 | /* resync complete goes from 0 to this */ |
53 | #define RAID_MAX_RESYNC (10000) | |
54 | ||
61a7afa2 JB |
55 | #define DEFINE_RAID_ATTRIBUTE(type, attr) \ |
56 | static inline void \ | |
57 | raid_set_##attr(struct raid_template *r, struct device *dev, type value) { \ | |
ee959b00 | 58 | struct device *device = \ |
61a7afa2 JB |
59 | attribute_container_find_class_device(&r->raid_attrs.ac, dev);\ |
60 | struct raid_data *rd; \ | |
ee959b00 TJ |
61 | BUG_ON(!device); \ |
62 | rd = dev_get_drvdata(device); \ | |
61a7afa2 JB |
63 | rd->attr = value; \ |
64 | } \ | |
65 | static inline type \ | |
66 | raid_get_##attr(struct raid_template *r, struct device *dev) { \ | |
ee959b00 | 67 | struct device *device = \ |
61a7afa2 JB |
68 | attribute_container_find_class_device(&r->raid_attrs.ac, dev);\ |
69 | struct raid_data *rd; \ | |
ee959b00 TJ |
70 | BUG_ON(!device); \ |
71 | rd = dev_get_drvdata(device); \ | |
61a7afa2 JB |
72 | return rd->attr; \ |
73 | } | |
74 | ||
b1081ea6 | 75 | DEFINE_RAID_ATTRIBUTE(enum raid_level, level) |
61a7afa2 JB |
76 | DEFINE_RAID_ATTRIBUTE(int, resync) |
77 | DEFINE_RAID_ATTRIBUTE(enum raid_state, state) | |
78 | ||
79 | struct raid_template *raid_class_attach(struct raid_function_template *); | |
80 | void raid_class_release(struct raid_template *); | |
81 | ||
ed542bed JG |
82 | int __must_check raid_component_add(struct raid_template *, struct device *, |
83 | struct device *); | |
84 |