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