@@ -27,7 +27,7 @@ static int __initdata raid_noautodetect=1;
27
27
#endif
28
28
static int __initdata raid_autopart ;
29
29
30
- static struct {
30
+ static struct md_setup_args {
31
31
int minor ;
32
32
int partitioned ;
33
33
int level ;
@@ -126,122 +126,117 @@ static inline int create_dev(char *name, dev_t dev)
126
126
return ksys_mknod (name , S_IFBLK |0600 , new_encode_dev (dev ));
127
127
}
128
128
129
- static void __init md_setup_drive (void )
129
+ static void __init md_setup_drive (struct md_setup_args * args )
130
130
{
131
- int minor , i , ent , partitioned ;
131
+ int minor , i , partitioned ;
132
132
dev_t dev ;
133
133
dev_t devices [MD_SB_DISKS + 1 ];
134
+ int fd ;
135
+ int err = 0 ;
136
+ char * devname ;
137
+ mdu_disk_info_t dinfo ;
138
+ char name [16 ];
134
139
135
- for (ent = 0 ; ent < md_setup_ents ; ent ++ ) {
136
- int fd ;
137
- int err = 0 ;
138
- char * devname ;
139
- mdu_disk_info_t dinfo ;
140
- char name [16 ];
140
+ minor = args -> minor ;
141
+ partitioned = args -> partitioned ;
142
+ devname = args -> device_names ;
141
143
142
- minor = md_setup_args [ent ].minor ;
143
- partitioned = md_setup_args [ent ].partitioned ;
144
- devname = md_setup_args [ent ].device_names ;
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
+ for (i = 0 ; i < MD_SB_DISKS && devname != NULL ; i ++ ) {
151
+ struct kstat stat ;
152
+ char * p ;
153
+ char comp_name [64 ];
145
154
146
- sprintf (name , "/dev/md%s%d" , partitioned ?"_d" :"" , minor );
147
- if (partitioned )
148
- dev = MKDEV (mdp_major , minor << MdpMinorShift );
149
- else
150
- dev = MKDEV (MD_MAJOR , minor );
151
- create_dev (name , dev );
152
- for (i = 0 ; i < MD_SB_DISKS && devname != NULL ; i ++ ) {
153
- struct kstat stat ;
154
- char * p ;
155
- char comp_name [64 ];
155
+ p = strchr (devname , ',' );
156
+ if (p )
157
+ * p ++ = 0 ;
156
158
157
- p = strchr (devname , ',' );
158
- if (p )
159
- * p ++ = 0 ;
159
+ dev = name_to_dev_t (devname );
160
+ if (strncmp (devname , "/dev/" , 5 ) == 0 )
161
+ devname += 5 ;
162
+ snprintf (comp_name , 63 , "/dev/%s" , devname );
163
+ if (vfs_stat (comp_name , & stat ) == 0 && S_ISBLK (stat .mode ))
164
+ dev = new_decode_dev (stat .rdev );
165
+ if (!dev ) {
166
+ printk (KERN_WARNING "md: Unknown device name: %s\n" , devname );
167
+ break ;
168
+ }
160
169
161
- dev = name_to_dev_t (devname );
162
- if (strncmp (devname , "/dev/" , 5 ) == 0 )
163
- devname += 5 ;
164
- snprintf (comp_name , 63 , "/dev/%s" , devname );
165
- if (vfs_stat (comp_name , & stat ) == 0 &&
166
- S_ISBLK (stat .mode ))
167
- dev = new_decode_dev (stat .rdev );
168
- if (!dev ) {
169
- printk (KERN_WARNING "md: Unknown device name: %s\n" , devname );
170
- break ;
171
- }
170
+ devices [i ] = dev ;
171
+ devname = p ;
172
+ }
173
+ devices [i ] = 0 ;
172
174
173
- devices [i ] = dev ;
175
+ if (!i )
176
+ return ;
174
177
175
- devname = p ;
176
- }
177
- devices [ i ] = 0 ;
178
+ printk ( KERN_INFO "md: Loading md%s%d: %s\n" ,
179
+ partitioned ? "_d" : "" , minor ,
180
+ args -> device_names ) ;
178
181
179
- if (!i )
180
- continue ;
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 );
186
+ return ;
187
+ }
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 ;
194
+ }
181
195
182
- printk (KERN_INFO "md: Loading md%s%d: %s\n" ,
183
- partitioned ? "_d" : "" , minor ,
184
- md_setup_args [ent ].device_names );
196
+ if (args -> level != LEVEL_NONE ) {
197
+ /* non-persistent */
198
+ mdu_array_info_t ainfo ;
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 ;
206
+ ainfo .not_persistent = 1 ;
185
207
186
- fd = ksys_open (name , 0 , 0 );
187
- if (fd < 0 ) {
188
- printk (KERN_ERR "md: open failed - cannot start "
189
- "array %s\n" , name );
190
- continue ;
191
- }
192
- if (ksys_ioctl (fd , SET_ARRAY_INFO , 0 ) == - EBUSY ) {
193
- printk (KERN_WARNING
194
- "md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n" ,
195
- minor );
196
- ksys_close (fd );
197
- continue ;
208
+ ainfo .state = (1 << MD_SB_CLEAN );
209
+ ainfo .layout = 0 ;
210
+ 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 ;
216
+ dinfo .number = i ;
217
+ 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 );
198
223
}
199
-
200
- if (md_setup_args [ent ].level != LEVEL_NONE ) {
201
- /* non-persistent */
202
- mdu_array_info_t ainfo ;
203
- ainfo .level = md_setup_args [ent ].level ;
204
- ainfo .size = 0 ;
205
- ainfo .nr_disks = 0 ;
206
- ainfo .raid_disks = 0 ;
207
- while (devices [ainfo .raid_disks ])
208
- ainfo .raid_disks ++ ;
209
- ainfo .md_minor = minor ;
210
- ainfo .not_persistent = 1 ;
211
-
212
- ainfo .state = (1 << MD_SB_CLEAN );
213
- ainfo .layout = 0 ;
214
- ainfo .chunk_size = md_setup_args [ent ].chunk ;
215
- err = ksys_ioctl (fd , SET_ARRAY_INFO , (long )& ainfo );
216
- for (i = 0 ; !err && i <= MD_SB_DISKS ; i ++ ) {
217
- dev = devices [i ];
218
- if (!dev )
219
- break ;
220
- dinfo .number = i ;
221
- dinfo .raid_disk = i ;
222
- dinfo .state = (1 <<MD_DISK_ACTIVE )|(1 <<MD_DISK_SYNC );
223
- dinfo .major = MAJOR (dev );
224
- dinfo .minor = MINOR (dev );
225
- err = ksys_ioctl (fd , ADD_NEW_DISK ,
226
- (long )& dinfo );
227
- }
228
- } else {
229
- /* persistent */
230
- for (i = 0 ; i <= MD_SB_DISKS ; i ++ ) {
231
- dev = devices [i ];
232
- if (!dev )
233
- break ;
234
- dinfo .major = MAJOR (dev );
235
- dinfo .minor = MINOR (dev );
236
- ksys_ioctl (fd , ADD_NEW_DISK , (long )& dinfo );
237
- }
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 );
238
233
}
239
- if (!err )
240
- err = ksys_ioctl (fd , RUN_ARRAY , 0 );
241
- if (err )
242
- printk (KERN_WARNING "md: starting md%d failed\n" , minor );
243
- ksys_close (fd );
244
234
}
235
+ if (!err )
236
+ err = ksys_ioctl (fd , RUN_ARRAY , 0 );
237
+ if (err )
238
+ printk (KERN_WARNING "md: starting md%d failed\n" , minor );
239
+ ksys_close (fd );
245
240
}
246
241
247
242
static int __init raid_setup (char * str )
@@ -289,11 +284,15 @@ static void __init autodetect_raid(void)
289
284
290
285
void __init md_run_setup (void )
291
286
{
287
+ int ent ;
288
+
292
289
create_dev ("/dev/md0" , MKDEV (MD_MAJOR , 0 ));
293
290
294
291
if (raid_noautodetect )
295
292
printk (KERN_INFO "md: Skipping autodetection of RAID arrays. (raid=autodetect will force)\n" );
296
293
else
297
294
autodetect_raid ();
298
- md_setup_drive ();
295
+
296
+ for (ent = 0 ; ent < md_setup_ents ; ent ++ )
297
+ md_setup_drive (& md_setup_args [ent ]);
299
298
}
0 commit comments