Blame view

drivers/md/raid1.h 5.06 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _RAID1_H
  #define _RAID1_H
0eaf822cb   Jonathan Brassow   MD RAID1: rename ...
3
  struct raid1_info {
3cb030020   NeilBrown   md: removing type...
4
  	struct md_rdev	*rdev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
  	sector_t	head_position;
be4d3280b   Shaohua Li   md/raid1: make se...
6
7
8
9
10
  
  	/* When choose the best device for a read (read_balance())
  	 * we try to keep sequential reads one the same device
  	 */
  	sector_t	next_seq_sect;
12cee5a8a   Shaohua Li   md/raid1: prevent...
11
  	sector_t	seq_start;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
14
15
16
17
18
19
  };
  
  /*
   * 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.
8f19ccb2f   NeilBrown   md/raid1: Allocat...
20
21
22
   * 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.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
   */
  
  struct pool_info {
fd01b88c7   NeilBrown   md: remove typede...
26
  	struct mddev *mddev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
  	int	raid_disks;
  };
e80963604   NeilBrown   md/raid1: typedef...
29
  struct r1conf {
fd01b88c7   NeilBrown   md: remove typede...
30
  	struct mddev		*mddev;
0eaf822cb   Jonathan Brassow   MD RAID1: rename ...
31
  	struct raid1_info	*mirrors;	/* twice 'raid_disks' to
8f19ccb2f   NeilBrown   md/raid1: Allocat...
32
33
  						 * allow for replacements.
  						 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
  	int			raid_disks;
ce550c205   NeilBrown   md/raid1: add do...
35

ce550c205   NeilBrown   md/raid1: add do...
36
37
38
39
40
  	/* During resync, read_balancing is only allowed on the part
  	 * of the array that has been resynced.  'next_resync' tells us
  	 * where that is.
  	 */
  	sector_t		next_resync;
79ef3a8aa   majianpeng   raid1: Rewrite th...
41
42
43
44
45
46
47
48
49
50
51
52
  	/* When raid1 starts resync, we divide array into four partitions
  	 * |---------|--------------|---------------------|-------------|
  	 *        next_resync   start_next_window       end_window
  	 * start_next_window = next_resync + NEXT_NORMALIO_DISTANCE
  	 * end_window = start_next_window + NEXT_NORMALIO_DISTANCE
  	 * current_window_requests means the count of normalIO between
  	 *   start_next_window and end_window.
  	 * next_window_requests means the count of normalIO after end_window.
  	 * */
  	sector_t		start_next_window;
  	int			current_window_requests;
  	int			next_window_requests;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
  	spinlock_t		device_lock;
9f2c9d12b   NeilBrown   md: remove typede...
54
55
56
  	/* list of 'struct r1bio' that need to be processed by raid1d,
  	 * whether to retry a read, writeout a resync or recovery
  	 * block, or anything else.
ce550c205   NeilBrown   md/raid1: add do...
57
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
  	struct list_head	retry_list;
191ea9b2c   NeilBrown   [PATCH] md: raid1...
59

ce550c205   NeilBrown   md/raid1: add do...
60
61
  	/* queue pending writes to be submitted on unplug */
  	struct bio_list		pending_bio_list;
34db0cd60   NeilBrown   md: add proper wr...
62
  	int			pending_count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63

ce550c205   NeilBrown   md/raid1: add do...
64
65
66
67
68
69
70
  	/* for use when syncing mirrors:
  	 * We don't allow both normal IO and resync/recovery IO at
  	 * the same time - resync/recovery can only happen when there
  	 * is no other IO.  So when either is active, the other has to wait.
  	 * See more details description in raid1.c near raise_barrier().
  	 */
  	wait_queue_head_t	wait_barrier;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
  	spinlock_t		resync_lock;
191ea9b2c   NeilBrown   [PATCH] md: raid1...
72
  	int			nr_pending;
17999be4a   NeilBrown   [PATCH] md: impro...
73
  	int			nr_waiting;
ddaf22aba   NeilBrown   [PATCH] md: attem...
74
  	int			nr_queued;
191ea9b2c   NeilBrown   [PATCH] md: raid1...
75
  	int			barrier;
b364e3d04   majianpeng   raid1: Add a fiel...
76
  	int			array_frozen;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77

ce550c205   NeilBrown   md/raid1: add do...
78
79
80
81
  	/* Set to 1 if a full sync is needed, (fresh device added).
  	 * Cleared when a sync completes.
  	 */
  	int			fullsync;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82

ce550c205   NeilBrown   md/raid1: add do...
83
84
85
86
  	/* When the same as mddev->recovery_disabled we don't allow
  	 * recovery to be attempted as we expect a read error.
  	 */
  	int			recovery_disabled;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87

ddaf22aba   NeilBrown   [PATCH] md: attem...
88

ce550c205   NeilBrown   md/raid1: add do...
89
90
91
92
  	/* poolinfo contains information about the content of the
  	 * mempools - it changes when the array grows or shrinks
  	 */
  	struct pool_info	*poolinfo;
9f2c9d12b   NeilBrown   md: remove typede...
93
94
  	mempool_t		*r1bio_pool;
  	mempool_t		*r1buf_pool;
709ae4879   NeilBrown   md/raid1: add tak...
95

ce550c205   NeilBrown   md/raid1: add do...
96
97
98
99
  	/* temporary buffer to synchronous IO when attempting to repair
  	 * a read error.
  	 */
  	struct page		*tmppage;
709ae4879   NeilBrown   md/raid1: add tak...
100
101
102
  	/* When taking over an array from a different personality, we store
  	 * the new thread here until we fully activate the array.
  	 */
2b8bf3451   NeilBrown   md: remove typede...
103
  	struct md_thread	*thread;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
108
109
110
   * 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:
   */
9f2c9d12b   NeilBrown   md: remove typede...
111
  struct r1bio {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
113
114
  	atomic_t		remaining; /* 'have we finished' count,
  					    * used from IRQ handlers
  					    */
4b6d287f6   NeilBrown   [PATCH] md: add w...
115
116
117
  	atomic_t		behind_remaining; /* number of write-behind ios remaining
  						 * in this BehindIO request
  						 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
  	sector_t		sector;
79ef3a8aa   majianpeng   raid1: Rewrite th...
119
  	sector_t		start_next_window;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
  	int			sectors;
  	unsigned long		state;
fd01b88c7   NeilBrown   md: remove typede...
122
  	struct mddev		*mddev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
125
126
127
128
129
130
131
132
  	/*
  	 * original bio going to /dev/mdx
  	 */
  	struct bio		*master_bio;
  	/*
  	 * if the IO is in READ direction, then this is where we read
  	 */
  	int			read_disk;
  
  	struct list_head	retry_list;
af6d7b760   NeilBrown   md/raid1: improve...
133
  	/* Next two are only valid when R1BIO_BehindIO is set */
2ca68f5ed   NeilBrown   md/raid1: store b...
134
  	struct bio_vec		*behind_bvecs;
af6d7b760   NeilBrown   md/raid1: improve...
135
  	int			behind_page_count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
137
138
139
140
  	/*
  	 * if the IO is in WRITE direction, then multiple bios are used.
  	 * We choose the number when they are allocated.
  	 */
  	struct bio		*bios[0];
191ea9b2c   NeilBrown   [PATCH] md: raid1...
141
  	/* DO NOT PUT ANY NEW FIELDS HERE - bios array is contiguously alloced*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
144
145
146
  };
  
  /* bits for r1bio.state */
  #define	R1BIO_Uptodate	0
  #define	R1BIO_IsSync	1
191ea9b2c   NeilBrown   [PATCH] md: raid1...
147
  #define	R1BIO_Degraded	2
a9701a304   NeilBrown   [PATCH] md: suppo...
148
  #define	R1BIO_BehindIO	3
d2eb35acf   NeilBrown   md/raid1: avoid r...
149
150
151
152
  /* Set ReadError on bios that experience a readerror so that
   * raid1d knows what to do with them.
   */
  #define R1BIO_ReadError 4
4b6d287f6   NeilBrown   [PATCH] md: add w...
153
154
155
156
157
158
159
  /* For write-behind requests, we call bi_end_io when
   * the last non-write-behind device completes, providing
   * any write was successful.  Otherwise we call when
   * any write-behind write succeeds, otherwise we call
   * with failure when last write completes (and all failed).
   * Record that bi_end_io was called with this flag...
   */
9e71f9c84   NeilBrown   [PATCH] DM: Fix b...
160
  #define	R1BIO_Returned 6
4367af556   NeilBrown   md/raid1: clear b...
161
162
163
  /* If a write for this request means we can clear some
   * known-bad-block records, we set this flag
   */
cd5ff9a16   NeilBrown   md/raid1: Handle...
164
165
  #define	R1BIO_MadeGood 7
  #define	R1BIO_WriteError 8
4b6d287f6   NeilBrown   [PATCH] md: add w...
166

fd01b88c7   NeilBrown   md: remove typede...
167
  extern int md_raid1_congested(struct mddev *mddev, int bits);
1ed7242e5   Jonathan Brassow   MD: raid1 changes...
168

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
  #endif