|  | /* | 
|  | * 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_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 *); | 
|  |  |