/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _RAID1_H #define _RAID1_H /* * each barrier unit size is 64MB fow now * note: it must be larger than RESYNC_DEPTH */ #define BARRIER_UNIT_SECTOR_BITS … #define BARRIER_UNIT_SECTOR_SIZE … /* * In struct r1conf, the following members are related to I/O barrier * buckets, * atomic_t *nr_pending; * atomic_t *nr_waiting; * atomic_t *nr_queued; * atomic_t *barrier; * Each of them points to array of atomic_t variables, each array is * designed to have BARRIER_BUCKETS_NR elements and occupy a single * memory page. The data width of atomic_t variables is 4 bytes, equal * to 1<<(ilog2(sizeof(atomic_t))), BARRIER_BUCKETS_NR_BITS is defined * as (PAGE_SHIFT - ilog2(sizeof(int))) to make sure an array of * atomic_t variables with BARRIER_BUCKETS_NR elements just exactly * occupies a single memory page. */ #define BARRIER_BUCKETS_NR_BITS … #define BARRIER_BUCKETS_NR … /* Note: raid1_info.rdev can be set to NULL asynchronously by raid1_remove_disk. * There are three safe ways to access raid1_info.rdev. * 1/ when holding mddev->reconfig_mutex * 2/ when resync/recovery is known to be happening - i.e. in code that is * called as part of performing resync/recovery. * 3/ while holding rcu_read_lock(), use rcu_dereference to get the pointer * and if it is non-NULL, increment rdev->nr_pending before dropping the * RCU lock. * When .rdev is set to NULL, the nr_pending count checked again and if it has * been incremented, the pointer is put back in .rdev. */ struct raid1_info { … }; /* * memory pools need a pointer to the mddev, so they can force an unplug * when memory is tight, and a count of the number of drives that the * pool was allocated for, so they know how much to allocate and free. * mddev->raid_disks cannot be used, as it can change while a pool is active * These two datums are stored in a kmalloced struct. * The 'raid_disks' here is twice the raid_disks in r1conf. * This allows space for each 'real' device can have a replacement in the * second half of the array. */ struct pool_info { … }; struct r1conf { … }; /* * this is our 'private' RAID1 bio. * * it contains information about what kind of IO operations were started * for this RAID1 operation, and about their status: */ struct r1bio { … }; /* bits for r1bio.state */ enum r1bio_state { … }; static inline int sector_to_idx(sector_t sector) { … } #endif