at v2.6.14 1.6 kB view raw
1/* 2 */ 3#include <linux/transport_class.h> 4 5struct raid_template { 6 struct transport_container raid_attrs; 7}; 8 9struct 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 16enum raid_state { 17 RAID_ACTIVE = 1, 18 RAID_DEGRADED, 19 RAID_RESYNCING, 20 RAID_OFFLINE, 21}; 22 23struct 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) \ 32static inline void \ 33raid_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} \ 41static inline type \ 42raid_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 51DEFINE_RAID_ATTRIBUTE(int, level) 52DEFINE_RAID_ATTRIBUTE(int, resync) 53DEFINE_RAID_ATTRIBUTE(enum raid_state, state) 54 55struct raid_template *raid_class_attach(struct raid_function_template *); 56void raid_class_release(struct raid_template *); 57 58void raid_component_add(struct raid_template *, struct device *, 59 struct device *);