File: /usr/src/linux/include/linux/raid/raid1.h
1 #ifndef _RAID1_H
2 #define _RAID1_H
3
4 #include <linux/raid/md.h>
5
6 struct mirror_info {
7 int number;
8 int raid_disk;
9 kdev_t dev;
10 int sect_limit;
11 int head_position;
12
13 /*
14 * State bits:
15 */
16 int operational;
17 int write_only;
18 int spare;
19
20 int used_slot;
21 };
22
23 struct raid1_private_data {
24 mddev_t *mddev;
25 struct mirror_info mirrors[MD_SB_DISKS];
26 int nr_disks;
27 int raid_disks;
28 int working_disks;
29 int last_used;
30 unsigned long next_sect;
31 int sect_count;
32 mdk_thread_t *thread, *resync_thread;
33 int resync_mirrors;
34 struct mirror_info *spare;
35 md_spinlock_t device_lock;
36
37 /* buffer pool */
38 /* buffer_heads that we have pre-allocated have b_pprev -> &freebh
39 * and are linked into a stack using b_next
40 * raid1_bh that are pre-allocated have R1BH_PreAlloc set.
41 * All these variable are protected by device_lock
42 */
43 struct buffer_head *freebh;
44 int freebh_cnt; /* how many are on the list */
45 int freebh_blocked;
46 struct raid1_bh *freer1;
47 int freer1_blocked;
48 int freer1_cnt;
49 struct raid1_bh *freebuf; /* each bh_req has a page allocated */
50 md_wait_queue_head_t wait_buffer;
51
52 /* for use when syncing mirrors: */
53 unsigned long start_active, start_ready,
54 start_pending, start_future;
55 int cnt_done, cnt_active, cnt_ready,
56 cnt_pending, cnt_future;
57 int phase;
58 int window;
59 md_wait_queue_head_t wait_done;
60 md_wait_queue_head_t wait_ready;
61 md_spinlock_t segment_lock;
62 };
63
64 typedef struct raid1_private_data raid1_conf_t;
65
66 /*
67 * this is the only point in the RAID code where we violate
68 * C type safety. mddev->private is an 'opaque' pointer.
69 */
70 #define mddev_to_conf(mddev) ((raid1_conf_t *) mddev->private)
71
72 /*
73 * this is our 'private' 'collective' RAID1 buffer head.
74 * it contains information about what kind of IO operations were started
75 * for this RAID1 operation, and about their status:
76 */
77
78 struct raid1_bh {
79 atomic_t remaining; /* 'have we finished' count,
80 * used from IRQ handlers
81 */
82 int cmd;
83 unsigned long state;
84 mddev_t *mddev;
85 struct buffer_head *master_bh;
86 struct buffer_head *mirror_bh_list;
87 struct buffer_head bh_req;
88 struct raid1_bh *next_r1; /* next for retry or in free list */
89 };
90 /* bits for raid1_bh.state */
91 #define R1BH_Uptodate 1
92 #define R1BH_SyncPhase 2
93 #define R1BH_PreAlloc 3 /* this was pre-allocated, add to free list */
94 #endif
95