linux/drivers/md/raid1.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _RAID1_H
   3#define _RAID1_H
   4
   5/*
   6 * each barrier unit size is 64MB fow now
   7 * note: it must be larger than RESYNC_DEPTH
   8 */
   9#define BARRIER_UNIT_SECTOR_BITS        17
  10#define BARRIER_UNIT_SECTOR_SIZE        (1<<17)
  11/*
  12 * In struct r1conf, the following members are related to I/O barrier
  13 * buckets,
  14 *      atomic_t        *nr_pending;
  15 *      atomic_t        *nr_waiting;
  16 *      atomic_t        *nr_queued;
  17 *      atomic_t        *barrier;
  18 * Each of them points to array of atomic_t variables, each array is
  19 * designed to have BARRIER_BUCKETS_NR elements and occupy a single
  20 * memory page. The data width of atomic_t variables is 4 bytes, equal
  21 * to 1<<(ilog2(sizeof(atomic_t))), BARRIER_BUCKETS_NR_BITS is defined
  22 * as (PAGE_SHIFT - ilog2(sizeof(int))) to make sure an array of
  23 * atomic_t variables with BARRIER_BUCKETS_NR elements just exactly
  24 * occupies a single memory page.
  25 */
  26#define BARRIER_BUCKETS_NR_BITS         (PAGE_SHIFT - ilog2(sizeof(atomic_t)))
  27#define BARRIER_BUCKETS_NR              (1<<BARRIER_BUCKETS_NR_BITS)
  28
  29struct raid1_info {
  30        struct md_rdev  *rdev;
  31        sector_t        head_position;
  32
  33        /* When choose the best device for a read (read_balance())
  34         * we try to keep sequential reads one the same device
  35         */
  36        sector_t        next_seq_sect;
  37        sector_t        seq_start;
  38};
  39
  40/*
  41 * memory pools need a pointer to the mddev, so they can force an unplug
  42 * when memory is tight, and a count of the number of drives that the
  43 * pool was allocated for, so they know how much to allocate and free.
  44 * mddev->raid_disks cannot be used, as it can change while a pool is active
  45 * These two datums are stored in a kmalloced struct.
  46 * The 'raid_disks' here is twice the raid_disks in r1conf.
  47 * This allows space for each 'real' device can have a replacement in the
  48 * second half of the array.
  49 */
  50
  51struct pool_info {
  52        struct mddev *mddev;
  53        int     raid_disks;
  54};
  55
  56struct r1conf {
  57        struct mddev            *mddev;
  58        struct raid1_info       *mirrors;       /* twice 'raid_disks' to
  59                                                 * allow for replacements.
  60                                                 */
  61        int                     raid_disks;
  62
  63        spinlock_t              device_lock;
  64
  65        /* list of 'struct r1bio' that need to be processed by raid1d,
  66         * whether to retry a read, writeout a resync or recovery
  67         * block, or anything else.
  68         */
  69        struct list_head        retry_list;
  70        /* A separate list of r1bio which just need raid_end_bio_io called.
  71         * This mustn't happen for writes which had any errors if the superblock
  72         * needs to be written.
  73         */
  74        struct list_head        bio_end_io_list;
  75
  76        /* queue pending writes to be submitted on unplug */
  77        struct bio_list         pending_bio_list;
  78        int                     pending_count;
  79
  80        /* for use when syncing mirrors:
  81         * We don't allow both normal IO and resync/recovery IO at
  82         * the same time - resync/recovery can only happen when there
  83         * is no other IO.  So when either is active, the other has to wait.
  84         * See more details description in raid1.c near raise_barrier().
  85         */
  86        wait_queue_head_t       wait_barrier;
  87        spinlock_t              resync_lock;
  88        atomic_t                nr_sync_pending;
  89        atomic_t                *nr_pending;
  90        atomic_t                *nr_waiting;
  91        atomic_t                *nr_queued;
  92        atomic_t                *barrier;
  93        int                     array_frozen;
  94
  95        /* Set to 1 if a full sync is needed, (fresh device added).
  96         * Cleared when a sync completes.
  97         */
  98        int                     fullsync;
  99
 100        /* When the same as mddev->recovery_disabled we don't allow
 101         * recovery to be attempted as we expect a read error.
 102         */
 103        int                     recovery_disabled;
 104
 105        /* poolinfo contains information about the content of the
 106         * mempools - it changes when the array grows or shrinks
 107         */
 108        struct pool_info        *poolinfo;
 109        mempool_t               *r1bio_pool;
 110        mempool_t               *r1buf_pool;
 111
 112        struct bio_set          *bio_split;
 113
 114        /* temporary buffer to synchronous IO when attempting to repair
 115         * a read error.
 116         */
 117        struct page             *tmppage;
 118
 119        /* When taking over an array from a different personality, we store
 120         * the new thread here until we fully activate the array.
 121         */
 122        struct md_thread        *thread;
 123
 124        /* Keep track of cluster resync window to send to other
 125         * nodes.
 126         */
 127        sector_t                cluster_sync_low;
 128        sector_t                cluster_sync_high;
 129
 130};
 131
 132/*
 133 * this is our 'private' RAID1 bio.
 134 *
 135 * it contains information about what kind of IO operations were started
 136 * for this RAID1 operation, and about their status:
 137 */
 138
 139struct r1bio {
 140        atomic_t                remaining; /* 'have we finished' count,
 141                                            * used from IRQ handlers
 142                                            */
 143        atomic_t                behind_remaining; /* number of write-behind ios remaining
 144                                                 * in this BehindIO request
 145                                                 */
 146        sector_t                sector;
 147        int                     sectors;
 148        unsigned long           state;
 149        struct mddev            *mddev;
 150        /*
 151         * original bio going to /dev/mdx
 152         */
 153        struct bio              *master_bio;
 154        /*
 155         * if the IO is in READ direction, then this is where we read
 156         */
 157        int                     read_disk;
 158
 159        struct list_head        retry_list;
 160
 161        /*
 162         * When R1BIO_BehindIO is set, we store pages for write behind
 163         * in behind_master_bio.
 164         */
 165        struct bio              *behind_master_bio;
 166
 167        /*
 168         * if the IO is in WRITE direction, then multiple bios are used.
 169         * We choose the number when they are allocated.
 170         */
 171        struct bio              *bios[0];
 172        /* DO NOT PUT ANY NEW FIELDS HERE - bios array is contiguously alloced*/
 173};
 174
 175/* bits for r1bio.state */
 176enum r1bio_state {
 177        R1BIO_Uptodate,
 178        R1BIO_IsSync,
 179        R1BIO_Degraded,
 180        R1BIO_BehindIO,
 181/* Set ReadError on bios that experience a readerror so that
 182 * raid1d knows what to do with them.
 183 */
 184        R1BIO_ReadError,
 185/* For write-behind requests, we call bi_end_io when
 186 * the last non-write-behind device completes, providing
 187 * any write was successful.  Otherwise we call when
 188 * any write-behind write succeeds, otherwise we call
 189 * with failure when last write completes (and all failed).
 190 * Record that bi_end_io was called with this flag...
 191 */
 192        R1BIO_Returned,
 193/* If a write for this request means we can clear some
 194 * known-bad-block records, we set this flag
 195 */
 196        R1BIO_MadeGood,
 197        R1BIO_WriteError,
 198        R1BIO_FailFast,
 199};
 200
 201static inline int sector_to_idx(sector_t sector)
 202{
 203        return hash_long(sector >> BARRIER_UNIT_SECTOR_BITS,
 204                         BARRIER_BUCKETS_NR_BITS);
 205}
 206#endif
 207