linux/include/linux/raid_class.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * raid_class.h - a generic raid visualisation class
   4 *
   5 * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com>
   6 */
   7#include <linux/transport_class.h>
   8
   9struct raid_template {
  10        struct transport_container raid_attrs;
  11};
  12
  13struct raid_function_template {
  14        void *cookie;
  15        int (*is_raid)(struct device *);
  16        void (*get_resync)(struct device *);
  17        void (*get_state)(struct device *);
  18};
  19
  20enum raid_state {
  21        RAID_STATE_UNKNOWN = 0,
  22        RAID_STATE_ACTIVE,
  23        RAID_STATE_DEGRADED,
  24        RAID_STATE_RESYNCING,
  25        RAID_STATE_OFFLINE,
  26};
  27
  28enum raid_level {
  29        RAID_LEVEL_UNKNOWN = 0,
  30        RAID_LEVEL_LINEAR,
  31        RAID_LEVEL_0,
  32        RAID_LEVEL_1,
  33        RAID_LEVEL_10,
  34        RAID_LEVEL_1E,
  35        RAID_LEVEL_3,
  36        RAID_LEVEL_4,
  37        RAID_LEVEL_5,
  38        RAID_LEVEL_50,
  39        RAID_LEVEL_6,
  40        RAID_LEVEL_JBOD,
  41};
  42
  43struct raid_data {
  44        struct list_head component_list;
  45        int component_count;
  46        enum raid_level level;
  47        enum raid_state state;
  48        int resync;
  49};
  50
  51/* resync complete goes from 0 to this */
  52#define RAID_MAX_RESYNC         (10000)
  53
  54#define DEFINE_RAID_ATTRIBUTE(type, attr)                                     \
  55static inline void                                                            \
  56raid_set_##attr(struct raid_template *r, struct device *dev, type value) {    \
  57        struct device *device =                                               \
  58                attribute_container_find_class_device(&r->raid_attrs.ac, dev);\
  59        struct raid_data *rd;                                                 \
  60        BUG_ON(!device);                                                      \
  61        rd = dev_get_drvdata(device);                                         \
  62        rd->attr = value;                                                     \
  63}                                                                             \
  64static inline type                                                            \
  65raid_get_##attr(struct raid_template *r, struct device *dev) {                \
  66        struct device *device =                                               \
  67                attribute_container_find_class_device(&r->raid_attrs.ac, dev);\
  68        struct raid_data *rd;                                                 \
  69        BUG_ON(!device);                                                      \
  70        rd = dev_get_drvdata(device);                                         \
  71        return rd->attr;                                                      \
  72}
  73
  74DEFINE_RAID_ATTRIBUTE(enum raid_level, level)
  75DEFINE_RAID_ATTRIBUTE(int, resync)
  76DEFINE_RAID_ATTRIBUTE(enum raid_state, state)
  77        
  78struct raid_template *raid_class_attach(struct raid_function_template *);
  79void raid_class_release(struct raid_template *);
  80
  81int __must_check raid_component_add(struct raid_template *, struct device *,
  82                                    struct device *);
  83
  84