raid10.h 3.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6
#ifndef _RAID10_H
#define _RAID10_H

typedef struct mirror_info mirror_info_t;

struct mirror_info {
7
	struct md_rdev	*rdev;
L
Linus Torvalds 已提交
8
	sector_t	head_position;
9 10 11 12 13
	int		recovery_disabled;	/* matches
						 * mddev->recovery_disabled
						 * when we shouldn't try
						 * recovering this device.
						 */
L
Linus Torvalds 已提交
14 15 16 17 18 19 20 21 22 23 24
};

typedef struct r10bio_s r10bio_t;

struct r10_private_data_s {
	mddev_t			*mddev;
	mirror_info_t		*mirrors;
	int			raid_disks;
	spinlock_t		device_lock;

	/* geometry */
L
Lucas De Marchi 已提交
25 26
	int			near_copies;  /* number of copies laid out raid0 style */
	int 			far_copies;   /* number of copies laid out
L
Linus Torvalds 已提交
27 28
					       * at large strides across drives
					       */
29 30 31
	int			far_offset;   /* far_copies are offset by 1 stripe
					       * instead of many
					       */
L
Linus Torvalds 已提交
32 33 34 35
	int			copies;	      /* near_copies * far_copies.
					       * must be <= raid_disks
					       */
	sector_t		stride;	      /* distance between far copies.
36 37 38
					       * This is size / far_copies unless
					       * far_offset, in which case it is
					       * 1 stripe.
L
Linus Torvalds 已提交
39 40
					       */

41 42
	sector_t		dev_sectors;  /* temp copy of mddev->dev_sectors */

L
Linus Torvalds 已提交
43 44 45 46
	int chunk_shift; /* shift from chunks to sectors */
	sector_t chunk_mask;

	struct list_head	retry_list;
47 48 49
	/* queue pending writes and submit them on unplug */
	struct bio_list		pending_bio_list;

L
Linus Torvalds 已提交
50 51 52

	spinlock_t		resync_lock;
	int nr_pending;
53
	int nr_waiting;
54
	int nr_queued;
L
Linus Torvalds 已提交
55 56
	int barrier;
	sector_t		next_resync;
57 58 59 60
	int			fullsync;  /* set to 1 if a full sync is needed,
					    * (fresh device added).
					    * Cleared when a sync completes.
					    */
L
Linus Torvalds 已提交
61

62
	wait_queue_head_t	wait_barrier;
L
Linus Torvalds 已提交
63 64 65

	mempool_t *r10bio_pool;
	mempool_t *r10buf_pool;
66
	struct page		*tmppage;
67 68 69 70 71

	/* When taking over an array from a different personality, we store
	 * the new thread here until we fully activate the array.
	 */
	struct mdk_thread_s	*thread;
L
Linus Torvalds 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
};

typedef struct r10_private_data_s conf_t;

/*
 * this is our 'private' RAID10 bio.
 *
 * it contains information about what kind of IO operations were started
 * for this RAID10 operation, and about their status:
 */

struct r10bio_s {
	atomic_t		remaining; /* 'have we finished' count,
					    * used from IRQ handlers
					    */
	sector_t		sector;	/* virtual sector number */
	int			sectors;
	unsigned long		state;
	mddev_t			*mddev;
	/*
	 * 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_slot;

	struct list_head	retry_list;
	/*
	 * if the IO is in WRITE direction, then multiple bios are used,
	 * one for each copy.
	 * When resyncing we also use one for each copy.
	 * When reconstructing, we use 2 bios, one for read, one for write.
	 * We choose the number when they are allocated.
	 */
	struct {
		struct bio		*bio;
		sector_t addr;
		int devnum;
	} devs[0];
};

115 116 117 118 119 120
/* 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
 */
#define IO_BLOCKED ((struct bio*)1)
121 122 123 124 125 126 127
/* 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 devs[n].bio to IO_MADE_GOOD
 */
#define IO_MADE_GOOD ((struct bio *)2)

#define BIO_SPECIAL(bio) ((unsigned long)bio <= 2)
128

L
Linus Torvalds 已提交
129 130 131 132
/* bits for r10bio.state */
#define	R10BIO_Uptodate	0
#define	R10BIO_IsSync	1
#define	R10BIO_IsRecover 2
133
#define	R10BIO_Degraded 3
134 135 136 137
/* Set ReadError on bios that experience a read error
 * so that raid10d knows what to do with them.
 */
#define	R10BIO_ReadError 4
138 139 140 141
/* If a write for this request means we can clear some
 * known-bad-block records, we set this flag.
 */
#define	R10BIO_MadeGood 5
142
#define	R10BIO_WriteError 6
L
Linus Torvalds 已提交
143
#endif