| /* | |
| * raid_class.h - a generic raid visualisation class | |
| * | |
| * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com> | |
| * | |
| * This file is licensed under GPLv2 | |
| */ | |
| #include <linux/transport_class.h> | |
| struct raid_template { | |
| struct transport_container raid_attrs; | |
| }; | |
| struct raid_function_template { | |
| void *cookie; | |
| int (*is_raid)(struct device *); | |
| void (*get_resync)(struct device *); | |
| void (*get_state)(struct device *); | |
| }; | |
| enum raid_state { | |
| RAID_STATE_UNKNOWN = 0, | |
| RAID_STATE_ACTIVE, | |
| RAID_STATE_DEGRADED, | |
| RAID_STATE_RESYNCING, | |
| RAID_STATE_OFFLINE, | |
| }; | |
| enum raid_level { | |
| RAID_LEVEL_UNKNOWN = 0, | |
| RAID_LEVEL_LINEAR, | |
| RAID_LEVEL_0, | |
| RAID_LEVEL_1, | |
| RAID_LEVEL_10, | |
| RAID_LEVEL_1E, | |
| RAID_LEVEL_3, | |
| RAID_LEVEL_4, | |
| RAID_LEVEL_5, | |
| RAID_LEVEL_50, | |
| RAID_LEVEL_6, | |
| }; | |
| struct raid_data { | |
| struct list_head component_list; | |
| int component_count; | |
| enum raid_level level; | |
| enum raid_state state; | |
| int resync; | |
| }; | |
| /* resync complete goes from 0 to this */ | |
| #define RAID_MAX_RESYNC (10000) | |
| #define DEFINE_RAID_ATTRIBUTE(type, attr) \ | |
| static inline void \ | |
| raid_set_##attr(struct raid_template *r, struct device *dev, type value) { \ | |
| struct device *device = \ | |
| attribute_container_find_class_device(&r->raid_attrs.ac, dev);\ | |
| struct raid_data *rd; \ | |
| BUG_ON(!device); \ | |
| rd = dev_get_drvdata(device); \ | |
| rd->attr = value; \ | |
| } \ | |
| static inline type \ | |
| raid_get_##attr(struct raid_template *r, struct device *dev) { \ | |
| struct device *device = \ | |
| attribute_container_find_class_device(&r->raid_attrs.ac, dev);\ | |
| struct raid_data *rd; \ | |
| BUG_ON(!device); \ | |
| rd = dev_get_drvdata(device); \ | |
| return rd->attr; \ | |
| } | |
| DEFINE_RAID_ATTRIBUTE(enum raid_level, level) | |
| DEFINE_RAID_ATTRIBUTE(int, resync) | |
| DEFINE_RAID_ATTRIBUTE(enum raid_state, state) | |
| struct raid_template *raid_class_attach(struct raid_function_template *); | |
| void raid_class_release(struct raid_template *); | |
| int __must_check raid_component_add(struct raid_template *, struct device *, | |
| struct device *); | |