diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-02-19 06:14:24 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-02-19 06:14:24 +0000 |
commit | 6fafeb146e9efd59140ea58cebd7dd38ae9a6379 (patch) | |
tree | 7db89ba6a28932514b105d620bba4884ec332ec3 /libdde_linux26/contrib/include/linux/raid_class.h | |
parent | 38c2c2458e3f4ecb329ff35621806252aac209b9 (diff) | |
parent | 8df772b3c665e663f6f9d2a70f9c691590bd3f91 (diff) |
Merge branch 'dde' into upstream-merged
Diffstat (limited to 'libdde_linux26/contrib/include/linux/raid_class.h')
-rw-r--r-- | libdde_linux26/contrib/include/linux/raid_class.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/libdde_linux26/contrib/include/linux/raid_class.h b/libdde_linux26/contrib/include/linux/raid_class.h new file mode 100644 index 00000000..6b537f1a --- /dev/null +++ b/libdde_linux26/contrib/include/linux/raid_class.h @@ -0,0 +1,82 @@ +/* + * 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 *); + |