Blame view

drivers/md/raid1.h 5.08 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _RAID1_H
  #define _RAID1_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
  struct mirror_info {
3cb030020   NeilBrown   md: removing type...
4
  	struct md_rdev	*rdev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
10
11
12
13
  	sector_t	head_position;
  };
  
  /*
   * 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...
14
15
16
   * 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
17
18
19
   */
  
  struct pool_info {
fd01b88c7   NeilBrown   md: remove typede...
20
  	struct mddev *mddev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
  	int	raid_disks;
  };
e80963604   NeilBrown   md/raid1: typedef...
23
  struct r1conf {
fd01b88c7   NeilBrown   md: remove typede...
24
  	struct mddev		*mddev;
8f19ccb2f   NeilBrown   md/raid1: Allocat...
25
26
27
  	struct mirror_info	*mirrors;	/* twice 'raid_disks' to
  						 * allow for replacements.
  						 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
  	int			raid_disks;
ce550c205   NeilBrown   md/raid1: add do...
29
30
31
32
33
  
  	/* When choose the best device for a read (read_balance())
  	 * we try to keep sequential reads one the same device
  	 * using 'last_used' and 'next_seq_sect'
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
  	int			last_used;
  	sector_t		next_seq_sect;
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;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  	spinlock_t		device_lock;
9f2c9d12b   NeilBrown   md: remove typede...
42
43
44
  	/* 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...
45
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  	struct list_head	retry_list;
191ea9b2c   NeilBrown   [PATCH] md: raid1...
47

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

ce550c205   NeilBrown   md/raid1: add do...
52
53
54
55
56
57
58
  	/* 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
59
  	spinlock_t		resync_lock;
191ea9b2c   NeilBrown   [PATCH] md: raid1...
60
  	int			nr_pending;
17999be4a   NeilBrown   [PATCH] md: impro...
61
  	int			nr_waiting;
ddaf22aba   NeilBrown   [PATCH] md: attem...
62
  	int			nr_queued;
191ea9b2c   NeilBrown   [PATCH] md: raid1...
63
  	int			barrier;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64

ce550c205   NeilBrown   md/raid1: add do...
65
66
67
68
  	/* 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
69

ce550c205   NeilBrown   md/raid1: add do...
70
71
72
73
  	/* 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
74

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

ce550c205   NeilBrown   md/raid1: add do...
76
77
78
79
  	/* 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...
80
81
  	mempool_t		*r1bio_pool;
  	mempool_t		*r1buf_pool;
709ae4879   NeilBrown   md/raid1: add tak...
82

ce550c205   NeilBrown   md/raid1: add do...
83
84
85
86
  	/* temporary buffer to synchronous IO when attempting to repair
  	 * a read error.
  	 */
  	struct page		*tmppage;
709ae4879   NeilBrown   md/raid1: add tak...
87
88
89
  	/* 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...
90
  	struct md_thread	*thread;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
95
96
97
   * 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...
98
  struct r1bio {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
100
101
  	atomic_t		remaining; /* 'have we finished' count,
  					    * used from IRQ handlers
  					    */
4b6d287f6   NeilBrown   [PATCH] md: add w...
102
103
104
  	atomic_t		behind_remaining; /* number of write-behind ios remaining
  						 * in this BehindIO request
  						 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
106
107
  	sector_t		sector;
  	int			sectors;
  	unsigned long		state;
fd01b88c7   NeilBrown   md: remove typede...
108
  	struct mddev		*mddev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
111
112
113
114
115
116
117
118
  	/*
  	 * 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...
119
  	/* Next two are only valid when R1BIO_BehindIO is set */
2ca68f5ed   NeilBrown   md/raid1: store b...
120
  	struct bio_vec		*behind_bvecs;
af6d7b760   NeilBrown   md/raid1: improve...
121
  	int			behind_page_count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
123
124
125
126
  	/*
  	 * 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...
127
  	/* DO NOT PUT ANY NEW FIELDS HERE - bios array is contiguously alloced*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
128
  };
cf30a473a   NeilBrown   [PATCH] md: handl...
129
130
131
132
133
  /* when we get a read error on a read-only array, we redirect to another
   * device without failing the first device, or trying to over-write to
   * correct the read error.  To keep track of bad blocks on a per-bio
   * level, we store IO_BLOCKED in the appropriate 'bios' pointer
   */
4367af556   NeilBrown   md/raid1: clear b...
134
135
136
137
138
139
140
141
  #define IO_BLOCKED ((struct bio *)1)
  /* When we successfully write to a known bad-block, we need to remove the
   * bad-block marking which must be done from process context.  So we record
   * the success by setting bios[n] to IO_MADE_GOOD
   */
  #define IO_MADE_GOOD ((struct bio *)2)
  
  #define BIO_SPECIAL(bio) ((unsigned long)bio <= 2)
cf30a473a   NeilBrown   [PATCH] md: handl...
142

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
144
145
  /* bits for r1bio.state */
  #define	R1BIO_Uptodate	0
  #define	R1BIO_IsSync	1
191ea9b2c   NeilBrown   [PATCH] md: raid1...
146
  #define	R1BIO_Degraded	2
a9701a304   NeilBrown   [PATCH] md: suppo...
147
  #define	R1BIO_BehindIO	3
d2eb35acf   NeilBrown   md/raid1: avoid r...
148
149
150
151
  /* 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...
152
153
154
155
156
157
158
  /* 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...
159
  #define	R1BIO_Returned 6
4367af556   NeilBrown   md/raid1: clear b...
160
161
162
  /* If a write for this request means we can clear some
   * known-bad-block records, we set this flag
   */
cd5ff9a16   NeilBrown   md/raid1: Handle...
163
164
  #define	R1BIO_MadeGood 7
  #define	R1BIO_WriteError 8
4b6d287f6   NeilBrown   [PATCH] md: add w...
165

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

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