95 lines
2.3 KiB
C
95 lines
2.3 KiB
C
#ifndef _RAID1_H
|
|
#define _RAID1_H
|
|
|
|
#include <linux/raid/md.h>
|
|
|
|
struct mirror_info {
|
|
int number;
|
|
int raid_disk;
|
|
kdev_t dev;
|
|
int sect_limit;
|
|
int head_position;
|
|
|
|
/*
|
|
* State bits:
|
|
*/
|
|
int operational;
|
|
int write_only;
|
|
int spare;
|
|
|
|
int used_slot;
|
|
};
|
|
|
|
struct raid1_private_data {
|
|
mddev_t *mddev;
|
|
struct mirror_info mirrors[MD_SB_DISKS];
|
|
int nr_disks;
|
|
int raid_disks;
|
|
int working_disks;
|
|
int last_used;
|
|
unsigned long next_sect;
|
|
int sect_count;
|
|
mdk_thread_t *thread, *resync_thread;
|
|
int resync_mirrors;
|
|
struct mirror_info *spare;
|
|
md_spinlock_t device_lock;
|
|
|
|
/* buffer pool */
|
|
/* buffer_heads that we have pre-allocated have b_pprev -> &freebh
|
|
* and are linked into a stack using b_next
|
|
* raid1_bh that are pre-allocated have R1BH_PreAlloc set.
|
|
* All these variable are protected by device_lock
|
|
*/
|
|
struct buffer_head *freebh;
|
|
int freebh_cnt; /* how many are on the list */
|
|
int freebh_blocked;
|
|
struct raid1_bh *freer1;
|
|
int freer1_blocked;
|
|
int freer1_cnt;
|
|
struct raid1_bh *freebuf; /* each bh_req has a page allocated */
|
|
md_wait_queue_head_t wait_buffer;
|
|
|
|
/* for use when syncing mirrors: */
|
|
unsigned long start_active, start_ready,
|
|
start_pending, start_future;
|
|
int cnt_done, cnt_active, cnt_ready,
|
|
cnt_pending, cnt_future;
|
|
int phase;
|
|
int window;
|
|
md_wait_queue_head_t wait_done;
|
|
md_wait_queue_head_t wait_ready;
|
|
md_spinlock_t segment_lock;
|
|
};
|
|
|
|
typedef struct raid1_private_data raid1_conf_t;
|
|
|
|
/*
|
|
* this is the only point in the RAID code where we violate
|
|
* C type safety. mddev->private is an 'opaque' pointer.
|
|
*/
|
|
#define mddev_to_conf(mddev) ((raid1_conf_t *) mddev->private)
|
|
|
|
/*
|
|
* this is our 'private' 'collective' RAID1 buffer head.
|
|
* it contains information about what kind of IO operations were started
|
|
* for this RAID1 operation, and about their status:
|
|
*/
|
|
|
|
struct raid1_bh {
|
|
atomic_t remaining; /* 'have we finished' count,
|
|
* used from IRQ handlers
|
|
*/
|
|
int cmd;
|
|
unsigned long state;
|
|
mddev_t *mddev;
|
|
struct buffer_head *master_bh;
|
|
struct buffer_head *mirror_bh_list;
|
|
struct buffer_head bh_req;
|
|
struct raid1_bh *next_r1; /* next for retry or in free list */
|
|
};
|
|
/* bits for raid1_bh.state */
|
|
#define R1BH_Uptodate 1
|
|
#define R1BH_SyncPhase 2
|
|
#define R1BH_PreAlloc 3 /* this was pre-allocated, add to free list */
|
|
#endif
|