forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.1 KiB
83 lines
2.1 KiB
/* SPDX-License-Identifier: GPL-2.0-only */ |
|
/* |
|
* raid_class.h - a generic raid visualisation class |
|
* |
|
* Copyright (c) 2005 - James Bottomley <[email protected]> |
|
*/ |
|
#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, |
|
RAID_LEVEL_JBOD, |
|
}; |
|
|
|
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 *); |
|
|
|
|