disk.major == 0 &&
disk.minor == 0)
continue;
- if ((dv=map_dev(disk.major, disk.minor))) {
+ if ((dv=map_dev(disk.major, disk.minor, 1))) {
if (!super && (disk.state & (1<<MD_DISK_ACTIVE))) {
/* try to read the superblock from this device
* to get more info
*/
- int fd2 = open(dv, O_RDONLY);
+ int fd2 = dev_open(dv, O_RDONLY);
if (fd2 >=0 && st &&
st->ss->load_super(st, fd2, &super, NULL) == 0) {
struct mdinfo info;
rv |= 2;
rv |= 1;
}
- if ((dv=map_dev(disk.major, disk.minor))) {
+ if ((dv=map_dev(disk.major, disk.minor, 0))) {
if (brief) {
if (devices) {
devices = realloc(devices,
d);
return 1;
}
- dv = map_dev(disk.major, disk.minor);
+ dv = map_dev(disk.major, disk.minor, 1);
if (!dv) {
fprintf(stderr, Name ": cannot find device file for device %d\n",
d);
return 1;
}
- fd2 = open(dv, O_RDWR);
+ fd2 = dev_open(dv, O_RDWR);
if (!fd2) {
fprintf(stderr, Name ": cannot open device file %s\n", dv);
return 1;
d);
return 1;
}
- dv = map_dev(disk.major, disk.minor);
+ dv = map_dev(disk.major, disk.minor, 1);
if (!dv) {
fprintf(stderr, Name ": cannot find device file for device %d\n",
d);
return 1;
}
- fd2 = open(dv, O_RDWR);
+ fd2 = dev_open(dv, O_RDWR);
if (fd2 < 0) {
fprintf(stderr, Name ": cannot open device file %s\n", dv);
return 1;
continue;
if ((disk.state & (1<<MD_DISK_SYNC))==0)
continue;
- dv = map_dev(disk.major, disk.minor);
+ dv = map_dev(disk.major, disk.minor, 1);
if (dv) {
void *super;
- int fd2 = open(dv, O_RDWR);
+ int fd2 = dev_open(dv, O_RDWR);
if (fd2 < 0)
continue;
if (st->ss->load_super(st, fd2, &super, NULL)==0) {
if ((disk.major==0 && disk.minor==0) ||
(disk.state & (1<<MD_DISK_REMOVED)))
continue;
- dv = map_dev(disk.major, disk.minor);
+ dv = map_dev(disk.major, disk.minor, 1);
if (!dv) continue;
- fd2 = open(dv, O_RDONLY);
+ fd2 = dev_open(dv, O_RDONLY);
if (fd2 >= 0 &&
st->ss->load_super(st, fd2, &super, NULL) == 0) {
close(fd2);
if (sd->state & (1<<MD_DISK_FAULTY))
continue;
if (sd->state & (1<<MD_DISK_SYNC)) {
- char *dn = map_dev(sd->major, sd->minor);
- fdlist[sd->role] = open(dn, O_RDONLY);
+ char *dn = map_dev(sd->major, sd->minor, 1);
+ fdlist[sd->role] = dev_open(dn, O_RDONLY);
offsets[sd->role] = sd->offset;
if (fdlist[sd->role] < 0) {
fprintf(stderr, Name ": %s: cannot open component %s\n",
}
} else {
/* spare */
- char *dn = map_dev(sd->major, sd->minor);
- fdlist[d] = open(dn, O_RDWR);
+ char *dn = map_dev(sd->major, sd->minor, 1);
+ fdlist[d] = dev_open(dn, O_RDWR);
offsets[d] = sd->offset;
if (fdlist[d]<0) {
fprintf(stderr, Name ": %s: cannot open component %s\n",
continue;
if ((disc.state & 4)==0) continue; /* sync */
/* Looks like a good device to try */
- dev = map_dev(disc.major, disc.minor);
+ dev = map_dev(disc.major, disc.minor, 1);
if (!dev) continue;
- dfd = open(dev, O_RDONLY);
+ dfd = dev_open(dev, O_RDONLY);
if (dfd < 0) continue;
if (st->ss->load_super(st, dfd, &dsuper, NULL)) {
close(dfd);
disc.number = i;
if (ioctl(fd, GET_DISK_INFO, &disc)>= 0) {
newstate = disc.state;
- dv = map_dev(disc.major, disc.minor);
+ dv = map_dev(disc.major, disc.minor, 1);
} else if (mse && mse->pattern && i < strlen(mse->pattern))
switch(mse->pattern[i]) {
case 'U': newstate = 6 /* ACTIVE/SYNC */; break;
}
if (dv == NULL && st->devid[i])
dv = map_dev(major(st->devid[i]),
- minor(st->devid[i]));
+ minor(st->devid[i]), 1);
change = newstate ^ st->devstate[i];
if (st->utime && change && !st->err) {
if (i < (unsigned)array.raid_disks &&
continue;
minor = strtoul(mp, NULL, 10);
- name = map_dev(major, minor);
- if (!name) {
- snprintf(buf, 1024, "%d:%d", major, minor);
- name = buf;
- }
+ name = map_dev(major, minor, 1);
d = malloc(sizeof(*d));
d->devname = strdup(name);
extern int map_name(mapping_t *map, char *name);
extern mapping_t r5layout[], pers[], modes[], faultylayout[];
-extern char *map_dev(int major, int minor);
+extern char *map_dev(int major, int minor, int create);
extern struct superswitch {
continue;
rv |= Assemble(array_list->st, array_list->devname, mdfd,
array_list, configfile,
- NULL,
+ NULL, NULL,
readonly, runstop, NULL, verbose, force);
}
}
minor = (-1-num) << MdpMinorShift;
else
minor = num;
- dn = map_dev(major,minor);
+ dn = map_dev(major,minor, 0);
if (dn==NULL || is_standard(dn, NULL)) {
/* this number only used by a 'standard' name,
* so it is safe to use
if (dp->state & (1<<MD_DISK_REMOVED)) printf(" removed");
if (wonly) printf(" write-mostly");
if (dp->state == 0) printf(" spare");
- if ((dv=map_dev(dp->major, dp->minor)))
+ if ((dv=map_dev(dp->major, dp->minor, 0)))
printf(" %s", dv);
printf("\n");
if (d == -1) printf("\n");
int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
{
}
-char *map_dev(int major, int minor)
+char *map_dev(int major, int minor, int create)
{
#if 0
fprintf(stderr, "Warning - fail to map %d,%d to a device name\n",
* deliberately so prefer it over a standard name.
* This applies only to names for MD devices.
*/
-char *map_dev(int major, int minor)
+char *map_dev(int major, int minor, int create)
{
struct devmap *p;
char *std = NULL, *nonstd=NULL;
nonstd = p->name;
}
}
+ if (create && !std && !nonstd) {
+ static char buf[30];
+ snprintf(buf, 1024, "%d:%d", major, minor);
+ nonstd = buf;
+ }
+
return nonstd ? nonstd : std;
}
&& (stb.st_rdev == rdev))
return devname;
}
- dn = map_dev(major(rdev), minor(rdev));
+ dn = map_dev(major(rdev), minor(rdev), 0);
if (dn)
return dn;
snprintf(devname, sizeof(devname), "/dev/.tmp.md%d", dev);