v2.4.9.9 -> v2.4.9.10
[opensuse:kernel.git] / include / linux / raid / multipath.h
1 #ifndef _MULTIPATH_H
2 #define _MULTIPATH_H
3
4 #include <linux/raid/md.h>
5
6 struct multipath_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 multipath_private_data {
24         mddev_t                 *mddev;
25         struct multipath_info   multipaths[MD_SB_DISKS];
26         int                     nr_disks;
27         int                     raid_disks;
28         int                     working_disks;
29         mdk_thread_t            *thread;
30         struct multipath_info   *spare;
31         md_spinlock_t           device_lock;
32
33         /* buffer pool */
34         /* buffer_heads that we have pre-allocated have b_pprev -> &freebh
35          * and are linked into a stack using b_next
36          * multipath_bh that are pre-allocated have MPBH_PreAlloc set.
37          * All these variable are protected by device_lock
38          */
39         struct buffer_head      *freebh;
40         int                     freebh_cnt;     /* how many are on the list */
41         struct multipath_bh     *freer1;
42         struct multipath_bh     *freebuf;       /* each bh_req has a page allocated */
43         md_wait_queue_head_t    wait_buffer;
44
45         /* for use when syncing multipaths: */
46         unsigned long   start_active, start_ready,
47                 start_pending, start_future;
48         int     cnt_done, cnt_active, cnt_ready,
49                 cnt_pending, cnt_future;
50         int     phase;
51         int     window;
52         md_wait_queue_head_t    wait_done;
53         md_wait_queue_head_t    wait_ready;
54         md_spinlock_t           segment_lock;
55 };
56
57 typedef struct multipath_private_data multipath_conf_t;
58
59 /*
60  * this is the only point in the RAID code where we violate
61  * C type safety. mddev->private is an 'opaque' pointer.
62  */
63 #define mddev_to_conf(mddev) ((multipath_conf_t *) mddev->private)
64
65 /*
66  * this is our 'private' 'collective' MULTIPATH buffer head.
67  * it contains information about what kind of IO operations were started
68  * for this MULTIPATH operation, and about their status:
69  */
70
71 struct multipath_bh {
72         atomic_t                remaining; /* 'have we finished' count,
73                                             * used from IRQ handlers
74                                             */
75         int                     cmd;
76         unsigned long           state;
77         mddev_t                 *mddev;
78         struct buffer_head      *master_bh;
79         struct buffer_head      *multipath_bh_list;
80         struct buffer_head      bh_req;
81         struct multipath_bh     *next_r1;       /* next for retry or in free list */
82 };
83 /* bits for multipath_bh.state */
84 #define MPBH_Uptodate   1
85 #define MPBH_SyncPhase  2
86 #define MPBH_PreAlloc   3       /* this was pre-allocated, add to free list */
87 #endif