1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #ifndef _MD_H
19 #define _MD_H
20
21 #include <asm/segment.h>
22 #include <linux/major.h>
23 #include <linux/mm.h>
24 #include <linux/ioctl.h>
25
26 #define MD_VERSION "0.35"
27
28
29 #define REGISTER_DEV _IO (MD_MAJOR, 1)
30 #define START_MD _IO (MD_MAJOR, 2)
31 #define STOP_MD _IO (MD_MAJOR, 3)
32 #define MD_INVALID _IO (MD_MAJOR, 4)
33 #define MD_VALID _IO (MD_MAJOR, 5)
34
35
36
37
38
39
40
41
42
43
44
45 #define FAULT_SHIFT 8
46 #define PERSONALITY_SHIFT 16
47
48 #define FACTOR_MASK 0xFFUL
49 #define FAULT_MASK 0xFF00UL
50 #define PERSONALITY_MASK 0xFF0000UL
51
52 #define MD_RESERVED 0
53 #define LINEAR (1UL << PERSONALITY_SHIFT)
54 #define STRIPED (2UL << PERSONALITY_SHIFT)
55 #define STRIPPED STRIPED
56 #define RAID0 STRIPED
57 #define RAID1 (3UL << PERSONALITY_SHIFT)
58 #define RAID5 (4UL << PERSONALITY_SHIFT)
59 #define MAX_PERSONALITY 5
60
61 #ifdef __KERNEL__
62
63 #include <linux/types.h>
64 #include <linux/fs.h>
65 #include <linux/blkdev.h>
66
67 #define MAX_REAL 8
68 #define MAX_MD_DEV 4
69
70 #define FACTOR(a) ((a)->repartition & FACTOR_MASK)
71 #define MAX_FAULT(a) (((a)->repartition & FAULT_MASK)>>8)
72 #define PERSONALITY(a) ((a)->repartition & PERSONALITY_MASK)
73
74 #define FACTOR_SHIFT(a) (PAGE_SHIFT + (a) - 10)
75
76
77 #define VALID 0
78 #define INVALID_NEXT 1
79 #define INVALID_ALWAYS 2
80 #define INVALID 3
81
82
83 #define REDIRECTED_BHREQ 0
84
85 #define REDIRECTED_REQ 1
86 #define REDIRECT_FAILED -1
87
88 struct real_dev
89 {
90 kdev_t dev;
91 int size;
92 int offset;
93
94 struct inode *inode;
95 int fault_count;
96 int invalid;
97
98
99
100
101 };
102
103 struct md_dev;
104
105 struct md_personality
106 {
107 char *name;
108 int (*map)(struct md_dev *md_dev, kdev_t *rdev,
109 unsigned long *rsector, unsigned long size);
110 int (*run)(int minor, struct md_dev *md_dev);
111 int (*stop)(int minor, struct md_dev *md_dev);
112 int (*status)(char *page, int minor, struct md_dev *md_dev);
113 int (*ioctl)(struct inode *inode, struct file *file,
114 unsigned int cmd, unsigned long arg);
115 int max_invalid_dev;
116 };
117
118 struct md_dev
119 {
120 struct md_personality *pers;
121 int repartition;
122 int invalid_dev_count;
123 int busy;
124 int nb_dev;
125 void *private;
126 };
127
128 extern struct real_dev devices[MAX_MD_DEV][MAX_REAL];
129 extern struct md_dev md_dev[MAX_MD_DEV];
130 extern int md_size[MAX_MD_DEV];
131
132 extern char *partition_name (kdev_t dev);
133
134 extern int register_md_personality (int p_num, struct md_personality *p);
135 extern int unregister_md_personality (int p_num);
136
137 #endif __KERNEL__
138 #endif _MD_H