hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * raid_class.h - a generic raid visualisation class
 *
 * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com>
 */
#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 *);