Bug #1565 ยป vinum.patch
| sys/dev/raid/vinum/vinumio.c | ||
|---|---|---|
|
int result;
|
||
|
struct vinum_hdr *vhdr;
|
||
|
error = init_drive(drive, 0); /* find the drive */
|
||
|
error = init_drive(drive, verbose); /* find the drive */
|
||
|
if (error) /* find the drive */
|
||
|
return DL_CANT_OPEN; /* not ours */
|
||
| ... | ... | |
|
char part; /* UNIX partition */
|
||
|
int slice;
|
||
|
int founddrive; /* flag when we find a vinum drive */
|
||
|
int has_slice = 0;
|
||
|
int has_slice = -1;
|
||
|
int has_part = 0;
|
||
|
char *tmp;
|
||
| ... | ... | |
|
*/
|
||
|
if ((tmp = rindex(devicename[driveno], '/')) == NULL)
|
||
|
tmp = devicename[driveno];
|
||
|
while (*tmp && (*tmp < '0' || *tmp > '9'))
|
||
|
++tmp;
|
||
|
while (*tmp && *tmp >= '0' && *tmp <= '9')
|
||
|
++tmp;
|
||
|
if (*tmp == 's')
|
||
|
has_slice = strtol(tmp + 1, &tmp, 0);
|
||
|
if (*tmp >= 'a' && *tmp <= 'p')
|
||
|
has_part = *tmp;
|
||
|
else
|
||
|
tmp++;
|
||
|
ksscanf(tmp, "%*[a-z]%*d%*[s]%d%c", &has_slice, &has_part);
|
||
|
/*
|
||
|
* Scan slices if no slice was specified, only if no partition was
|
||
|
* specified.
|
||
|
*/
|
||
|
if (has_slice == 0 && has_part == 0)
|
||
|
for (slice = 0; slice < MAX_SLICES; slice++) {
|
||
|
if (has_slice && slice != has_slice)
|
||
|
if (has_slice >= 0 && slice != has_slice)
|
||
|
continue;
|
||
|
for (part = 'a'; part < 'a' + MAXPARTITIONS; part++) {
|
||
|
if (has_part && part != has_part)
|
||
|
continue;
|
||
|
if (part == 'c')
|
||
|
continue;
|
||
|
ksnprintf(partname, DRIVENAMELEN,
|
||
|
"%ss%d%c", devicename[driveno], slice, part);
|
||
|
if (has_part && part != has_part)
|
||
|
continue;
|
||
|
if (has_slice >= 0 && has_part)
|
||
|
strncpy(partname, devicename[driveno], DRIVENAMELEN);
|
||
|
else if (has_slice >= 0)
|
||
|
ksnprintf(partname, DRIVENAMELEN,
|
||
|
"%s%c", devicename[driveno], part);
|
||
|
else
|
||
|
ksnprintf(partname, DRIVENAMELEN,
|
||
|
"%ss%d%c", devicename[driveno], slice, part);
|
||
|
drive = check_drive(partname); /* try to open it */
|
||
|
if ((drive->lasterror != 0) /* didn't work, */
|
||
|
||(drive->state != drive_up))
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
}
|
||
|
if (founddrive == 0 && has_slice == 0) { /* didn't find anything, */
|
||
|
for (part = 'a'; part < 'a' + MAXPARTITIONS; part++) { /* try the compatibility partition */
|
||
|
if (has_part && has_part != part)
|
||
|
continue;
|
||
|
if (part == 'c')
|
||
|
continue;
|
||
|
if (has_part) {
|
||
|
ksnprintf(partname, DRIVENAMELEN,
|
||
|
"%s", devicename[driveno]);
|
||
|
} else {
|
||
|
ksnprintf(partname, DRIVENAMELEN,
|
||
|
"%s%c", devicename[driveno], part);
|
||
|
}
|
||
|
drive = check_drive(partname); /* try to open it */
|
||
|
if ((drive->lasterror != 0) /* didn't work, */
|
||
|
||(drive->state != drive_up))
|
||
|
free_drive(drive); /* get rid of it */
|
||
|
else if (drive->flags & VF_CONFIGURED) /* already read this config, */
|
||
|
log(LOG_WARNING,
|
||
|
"vinum: already read config from %s\n", /* say so */
|
||
|
drive->label.name);
|
||
|
else {
|
||
|
drivelist[gooddrives] = drive->driveno; /* keep the drive index */
|
||
|
drive->flags &= ~VF_NEWBORN; /* which is no longer newly born */
|
||
|
gooddrives++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (gooddrives == 0) {
|
||