2
2
#include <linux/kernel.h>
3
3
#include <linux/blkdev.h>
4
4
#include <linux/init.h>
5
- #include <linux/syscalls.h>
6
5
#include <linux/mount.h>
7
6
#include <linux/major.h>
8
7
#include <linux/delay.h>
@@ -120,37 +119,29 @@ static int __init md_setup(char *str)
120
119
return 1 ;
121
120
}
122
121
123
- static inline int create_dev (char * name , dev_t dev )
124
- {
125
- ksys_unlink (name );
126
- return ksys_mknod (name , S_IFBLK |0600 , new_encode_dev (dev ));
127
- }
128
-
129
122
static void __init md_setup_drive (struct md_setup_args * args )
130
123
{
131
- int minor , i , partitioned ;
132
- dev_t dev ;
133
- dev_t devices [MD_SB_DISKS + 1 ];
134
- int fd ;
135
- int err = 0 ;
136
- char * devname ;
137
- mdu_disk_info_t dinfo ;
124
+ char * devname = args -> device_names ;
125
+ dev_t devices [MD_SB_DISKS + 1 ], mdev ;
126
+ struct mdu_array_info_s ainfo = { };
127
+ struct block_device * bdev ;
128
+ struct mddev * mddev ;
129
+ int err = 0 , i ;
138
130
char name [16 ];
139
131
140
- minor = args -> minor ;
141
- partitioned = args -> partitioned ;
142
- devname = args -> device_names ;
132
+ if (args -> partitioned ) {
133
+ mdev = MKDEV (mdp_major , args -> minor << MdpMinorShift );
134
+ sprintf (name , "md_d%d" , args -> minor );
135
+ } else {
136
+ mdev = MKDEV (MD_MAJOR , args -> minor );
137
+ sprintf (name , "md%d" , args -> minor );
138
+ }
143
139
144
- sprintf (name , "/dev/md%s%d" , partitioned ?"_d" :"" , minor );
145
- if (partitioned )
146
- dev = MKDEV (mdp_major , minor << MdpMinorShift );
147
- else
148
- dev = MKDEV (MD_MAJOR , minor );
149
- create_dev (name , dev );
150
140
for (i = 0 ; i < MD_SB_DISKS && devname != NULL ; i ++ ) {
151
141
struct kstat stat ;
152
142
char * p ;
153
143
char comp_name [64 ];
144
+ dev_t dev ;
154
145
155
146
p = strchr (devname , ',' );
156
147
if (p )
@@ -163,7 +154,7 @@ static void __init md_setup_drive(struct md_setup_args *args)
163
154
if (vfs_stat (comp_name , & stat ) == 0 && S_ISBLK (stat .mode ))
164
155
dev = new_decode_dev (stat .rdev );
165
156
if (!dev ) {
166
- printk ( KERN_WARNING "md: Unknown device name: %s\n" , devname );
157
+ pr_warn ( "md: Unknown device name: %s\n" , devname );
167
158
break ;
168
159
}
169
160
@@ -175,68 +166,71 @@ static void __init md_setup_drive(struct md_setup_args *args)
175
166
if (!i )
176
167
return ;
177
168
178
- printk (KERN_INFO "md: Loading md%s%d: %s\n" ,
179
- partitioned ? "_d" : "" , minor ,
180
- args -> device_names );
169
+ pr_info ("md: Loading %s: %s\n" , name , args -> device_names );
181
170
182
- fd = ksys_open (name , 0 , 0 );
183
- if (fd < 0 ) {
184
- printk (KERN_ERR "md: open failed - cannot start "
185
- "array %s\n" , name );
171
+ bdev = blkdev_get_by_dev (mdev , FMODE_READ , NULL );
172
+ if (IS_ERR (bdev )) {
173
+ pr_err ("md: open failed - cannot start array %s\n" , name );
186
174
return ;
187
175
}
188
- if (ksys_ioctl (fd , SET_ARRAY_INFO , 0 ) == - EBUSY ) {
189
- printk (KERN_WARNING
190
- "md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n" ,
191
- minor );
192
- ksys_close (fd );
193
- return ;
176
+
177
+ err = - EIO ;
178
+ if (WARN (bdev -> bd_disk -> fops != & md_fops ,
179
+ "Opening block device %x resulted in non-md device\n" ,
180
+ mdev ))
181
+ goto out_blkdev_put ;
182
+
183
+ mddev = bdev -> bd_disk -> private_data ;
184
+
185
+ err = mddev_lock (mddev );
186
+ if (err ) {
187
+ pr_err ("md: failed to lock array %s\n" , name );
188
+ goto out_blkdev_put ;
189
+ }
190
+
191
+ if (!list_empty (& mddev -> disks ) || mddev -> raid_disks ) {
192
+ pr_warn ("md: Ignoring %s, already autodetected. (Use raid=noautodetect)\n" ,
193
+ name );
194
+ goto out_unlock ;
194
195
}
195
196
196
197
if (args -> level != LEVEL_NONE ) {
197
198
/* non-persistent */
198
- mdu_array_info_t ainfo ;
199
199
ainfo .level = args -> level ;
200
- ainfo .size = 0 ;
201
- ainfo .nr_disks = 0 ;
202
- ainfo .raid_disks = 0 ;
203
- while (devices [ainfo .raid_disks ])
204
- ainfo .raid_disks ++ ;
205
- ainfo .md_minor = minor ;
200
+ ainfo .md_minor = args -> minor ;
206
201
ainfo .not_persistent = 1 ;
207
-
208
202
ainfo .state = (1 << MD_SB_CLEAN );
209
- ainfo .layout = 0 ;
210
203
ainfo .chunk_size = args -> chunk ;
211
- err = ksys_ioctl (fd , SET_ARRAY_INFO , (long )& ainfo );
212
- for (i = 0 ; !err && i <= MD_SB_DISKS ; i ++ ) {
213
- dev = devices [i ];
214
- if (!dev )
215
- break ;
204
+ while (devices [ainfo .raid_disks ])
205
+ ainfo .raid_disks ++ ;
206
+ }
207
+
208
+ err = md_set_array_info (mddev , & ainfo );
209
+
210
+ for (i = 0 ; i <= MD_SB_DISKS && devices [i ]; i ++ ) {
211
+ struct mdu_disk_info_s dinfo = {
212
+ .major = MAJOR (devices [i ]),
213
+ .minor = MINOR (devices [i ]),
214
+ };
215
+
216
+ if (args -> level != LEVEL_NONE ) {
216
217
dinfo .number = i ;
217
218
dinfo .raid_disk = i ;
218
- dinfo .state = (1 <<MD_DISK_ACTIVE )|(1 <<MD_DISK_SYNC );
219
- dinfo .major = MAJOR (dev );
220
- dinfo .minor = MINOR (dev );
221
- err = ksys_ioctl (fd , ADD_NEW_DISK ,
222
- (long )& dinfo );
223
- }
224
- } else {
225
- /* persistent */
226
- for (i = 0 ; i <= MD_SB_DISKS ; i ++ ) {
227
- dev = devices [i ];
228
- if (!dev )
229
- break ;
230
- dinfo .major = MAJOR (dev );
231
- dinfo .minor = MINOR (dev );
232
- ksys_ioctl (fd , ADD_NEW_DISK , (long )& dinfo );
219
+ dinfo .state =
220
+ (1 << MD_DISK_ACTIVE ) | (1 << MD_DISK_SYNC );
233
221
}
222
+
223
+ md_add_new_disk (mddev , & dinfo );
234
224
}
225
+
235
226
if (!err )
236
- err = ksys_ioctl ( fd , RUN_ARRAY , 0 );
227
+ err = do_md_run ( mddev );
237
228
if (err )
238
- printk (KERN_WARNING "md: starting md%d failed\n" , minor );
239
- ksys_close (fd );
229
+ pr_warn ("md: starting %s failed\n" , name );
230
+ out_unlock :
231
+ mddev_unlock (mddev );
232
+ out_blkdev_put :
233
+ blkdev_put (bdev , FMODE_READ );
240
234
}
241
235
242
236
static int __init raid_setup (char * str )
@@ -286,8 +280,6 @@ void __init md_run_setup(void)
286
280
{
287
281
int ent ;
288
282
289
- create_dev ("/dev/md0" , MKDEV (MD_MAJOR , 0 ));
290
-
291
283
if (raid_noautodetect )
292
284
printk (KERN_INFO "md: Skipping autodetection of RAID arrays. (raid=autodetect will force)\n" );
293
285
else
0 commit comments