Create missing /dev files where needed.
Whenever we need a device file to open, if one cannot be found in /dev, create a temporary one. Signed-off-by: Neil Brown <neilb@suse.de>
This commit is contained in:
parent
8352ab3e2c
commit
16c6fa807c
6
Detail.c
6
Detail.c
|
@ -105,12 +105,12 @@ int Detail(char *dev, int brief, int test)
|
||||||
disk.major == 0 &&
|
disk.major == 0 &&
|
||||||
disk.minor == 0)
|
disk.minor == 0)
|
||||||
continue;
|
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))) {
|
if (!super && (disk.state & (1<<MD_DISK_ACTIVE))) {
|
||||||
/* try to read the superblock from this device
|
/* try to read the superblock from this device
|
||||||
* to get more info
|
* to get more info
|
||||||
*/
|
*/
|
||||||
int fd2 = open(dv, O_RDONLY);
|
int fd2 = dev_open(dv, O_RDONLY);
|
||||||
if (fd2 >=0 && st &&
|
if (fd2 >=0 && st &&
|
||||||
st->ss->load_super(st, fd2, &super, NULL) == 0) {
|
st->ss->load_super(st, fd2, &super, NULL) == 0) {
|
||||||
struct mdinfo info;
|
struct mdinfo info;
|
||||||
|
@ -307,7 +307,7 @@ int Detail(char *dev, int brief, int test)
|
||||||
rv |= 2;
|
rv |= 2;
|
||||||
rv |= 1;
|
rv |= 1;
|
||||||
}
|
}
|
||||||
if ((dv=map_dev(disk.major, disk.minor))) {
|
if ((dv=map_dev(disk.major, disk.minor, 0))) {
|
||||||
if (brief) {
|
if (brief) {
|
||||||
if (devices) {
|
if (devices) {
|
||||||
devices = realloc(devices,
|
devices = realloc(devices,
|
||||||
|
|
24
Grow.c
24
Grow.c
|
@ -92,13 +92,13 @@ int Grow_Add_device(char *devname, int fd, char *newdev)
|
||||||
d);
|
d);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
dv = map_dev(disk.major, disk.minor);
|
dv = map_dev(disk.major, disk.minor, 1);
|
||||||
if (!dv) {
|
if (!dv) {
|
||||||
fprintf(stderr, Name ": cannot find device file for device %d\n",
|
fprintf(stderr, Name ": cannot find device file for device %d\n",
|
||||||
d);
|
d);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fd2 = open(dv, O_RDWR);
|
fd2 = dev_open(dv, O_RDWR);
|
||||||
if (!fd2) {
|
if (!fd2) {
|
||||||
fprintf(stderr, Name ": cannot open device file %s\n", dv);
|
fprintf(stderr, Name ": cannot open device file %s\n", dv);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -154,13 +154,13 @@ int Grow_Add_device(char *devname, int fd, char *newdev)
|
||||||
d);
|
d);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
dv = map_dev(disk.major, disk.minor);
|
dv = map_dev(disk.major, disk.minor, 1);
|
||||||
if (!dv) {
|
if (!dv) {
|
||||||
fprintf(stderr, Name ": cannot find device file for device %d\n",
|
fprintf(stderr, Name ": cannot find device file for device %d\n",
|
||||||
d);
|
d);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fd2 = open(dv, O_RDWR);
|
fd2 = dev_open(dv, O_RDWR);
|
||||||
if (fd2 < 0) {
|
if (fd2 < 0) {
|
||||||
fprintf(stderr, Name ": cannot open device file %s\n", dv);
|
fprintf(stderr, Name ": cannot open device file %s\n", dv);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -298,10 +298,10 @@ int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int
|
||||||
continue;
|
continue;
|
||||||
if ((disk.state & (1<<MD_DISK_SYNC))==0)
|
if ((disk.state & (1<<MD_DISK_SYNC))==0)
|
||||||
continue;
|
continue;
|
||||||
dv = map_dev(disk.major, disk.minor);
|
dv = map_dev(disk.major, disk.minor, 1);
|
||||||
if (dv) {
|
if (dv) {
|
||||||
void *super;
|
void *super;
|
||||||
int fd2 = open(dv, O_RDWR);
|
int fd2 = dev_open(dv, O_RDWR);
|
||||||
if (fd2 < 0)
|
if (fd2 < 0)
|
||||||
continue;
|
continue;
|
||||||
if (st->ss->load_super(st, fd2, &super, NULL)==0) {
|
if (st->ss->load_super(st, fd2, &super, NULL)==0) {
|
||||||
|
@ -343,9 +343,9 @@ int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int
|
||||||
if ((disk.major==0 && disk.minor==0) ||
|
if ((disk.major==0 && disk.minor==0) ||
|
||||||
(disk.state & (1<<MD_DISK_REMOVED)))
|
(disk.state & (1<<MD_DISK_REMOVED)))
|
||||||
continue;
|
continue;
|
||||||
dv = map_dev(disk.major, disk.minor);
|
dv = map_dev(disk.major, disk.minor, 1);
|
||||||
if (!dv) continue;
|
if (!dv) continue;
|
||||||
fd2 = open(dv, O_RDONLY);
|
fd2 = dev_open(dv, O_RDONLY);
|
||||||
if (fd2 >= 0 &&
|
if (fd2 >= 0 &&
|
||||||
st->ss->load_super(st, fd2, &super, NULL) == 0) {
|
st->ss->load_super(st, fd2, &super, NULL) == 0) {
|
||||||
close(fd2);
|
close(fd2);
|
||||||
|
@ -647,8 +647,8 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
||||||
if (sd->state & (1<<MD_DISK_FAULTY))
|
if (sd->state & (1<<MD_DISK_FAULTY))
|
||||||
continue;
|
continue;
|
||||||
if (sd->state & (1<<MD_DISK_SYNC)) {
|
if (sd->state & (1<<MD_DISK_SYNC)) {
|
||||||
char *dn = map_dev(sd->major, sd->minor);
|
char *dn = map_dev(sd->major, sd->minor, 1);
|
||||||
fdlist[sd->role] = open(dn, O_RDONLY);
|
fdlist[sd->role] = dev_open(dn, O_RDONLY);
|
||||||
offsets[sd->role] = sd->offset;
|
offsets[sd->role] = sd->offset;
|
||||||
if (fdlist[sd->role] < 0) {
|
if (fdlist[sd->role] < 0) {
|
||||||
fprintf(stderr, Name ": %s: cannot open component %s\n",
|
fprintf(stderr, Name ": %s: cannot open component %s\n",
|
||||||
|
@ -657,8 +657,8 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* spare */
|
/* spare */
|
||||||
char *dn = map_dev(sd->major, sd->minor);
|
char *dn = map_dev(sd->major, sd->minor, 1);
|
||||||
fdlist[d] = open(dn, O_RDWR);
|
fdlist[d] = dev_open(dn, O_RDWR);
|
||||||
offsets[d] = sd->offset;
|
offsets[d] = sd->offset;
|
||||||
if (fdlist[d]<0) {
|
if (fdlist[d]<0) {
|
||||||
fprintf(stderr, Name ": %s: cannot open component %s\n",
|
fprintf(stderr, Name ": %s: cannot open component %s\n",
|
||||||
|
|
4
Manage.c
4
Manage.c
|
@ -249,9 +249,9 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
continue;
|
continue;
|
||||||
if ((disc.state & 4)==0) continue; /* sync */
|
if ((disc.state & 4)==0) continue; /* sync */
|
||||||
/* Looks like a good device to try */
|
/* 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;
|
if (!dev) continue;
|
||||||
dfd = open(dev, O_RDONLY);
|
dfd = dev_open(dev, O_RDONLY);
|
||||||
if (dfd < 0) continue;
|
if (dfd < 0) continue;
|
||||||
if (st->ss->load_super(st, dfd, &dsuper, NULL)) {
|
if (st->ss->load_super(st, dfd, &dsuper, NULL)) {
|
||||||
close(dfd);
|
close(dfd);
|
||||||
|
|
|
@ -309,7 +309,7 @@ int Monitor(mddev_dev_t devlist,
|
||||||
disc.number = i;
|
disc.number = i;
|
||||||
if (ioctl(fd, GET_DISK_INFO, &disc)>= 0) {
|
if (ioctl(fd, GET_DISK_INFO, &disc)>= 0) {
|
||||||
newstate = disc.state;
|
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))
|
} else if (mse && mse->pattern && i < strlen(mse->pattern))
|
||||||
switch(mse->pattern[i]) {
|
switch(mse->pattern[i]) {
|
||||||
case 'U': newstate = 6 /* ACTIVE/SYNC */; break;
|
case 'U': newstate = 6 /* ACTIVE/SYNC */; break;
|
||||||
|
@ -317,7 +317,7 @@ int Monitor(mddev_dev_t devlist,
|
||||||
}
|
}
|
||||||
if (dv == NULL && st->devid[i])
|
if (dv == NULL && st->devid[i])
|
||||||
dv = map_dev(major(st->devid[i]),
|
dv = map_dev(major(st->devid[i]),
|
||||||
minor(st->devid[i]));
|
minor(st->devid[i]), 1);
|
||||||
change = newstate ^ st->devstate[i];
|
change = newstate ^ st->devstate[i];
|
||||||
if (st->utime && change && !st->err) {
|
if (st->utime && change && !st->err) {
|
||||||
if (i < (unsigned)array.raid_disks &&
|
if (i < (unsigned)array.raid_disks &&
|
||||||
|
|
6
config.c
6
config.c
|
@ -229,11 +229,7 @@ mddev_dev_t load_partitions(void)
|
||||||
continue;
|
continue;
|
||||||
minor = strtoul(mp, NULL, 10);
|
minor = strtoul(mp, NULL, 10);
|
||||||
|
|
||||||
name = map_dev(major, minor);
|
name = map_dev(major, minor, 1);
|
||||||
if (!name) {
|
|
||||||
snprintf(buf, 1024, "%d:%d", major, minor);
|
|
||||||
name = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
d = malloc(sizeof(*d));
|
d = malloc(sizeof(*d));
|
||||||
d->devname = strdup(name);
|
d->devname = strdup(name);
|
||||||
|
|
2
mdadm.h
2
mdadm.h
|
@ -246,7 +246,7 @@ extern char *map_num(mapping_t *map, int num);
|
||||||
extern int map_name(mapping_t *map, char *name);
|
extern int map_name(mapping_t *map, char *name);
|
||||||
extern mapping_t r5layout[], pers[], modes[], faultylayout[];
|
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 {
|
extern struct superswitch {
|
||||||
|
|
|
@ -97,7 +97,7 @@ int main() {
|
||||||
continue;
|
continue;
|
||||||
rv |= Assemble(array_list->st, array_list->devname, mdfd,
|
rv |= Assemble(array_list->st, array_list->devname, mdfd,
|
||||||
array_list, configfile,
|
array_list, configfile,
|
||||||
NULL,
|
NULL, NULL,
|
||||||
readonly, runstop, NULL, verbose, force);
|
readonly, runstop, NULL, verbose, force);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2
mdopen.c
2
mdopen.c
|
@ -176,7 +176,7 @@ int open_mddev(char *dev, int autof)
|
||||||
minor = (-1-num) << MdpMinorShift;
|
minor = (-1-num) << MdpMinorShift;
|
||||||
else
|
else
|
||||||
minor = num;
|
minor = num;
|
||||||
dn = map_dev(major,minor);
|
dn = map_dev(major,minor, 0);
|
||||||
if (dn==NULL || is_standard(dn, NULL)) {
|
if (dn==NULL || is_standard(dn, NULL)) {
|
||||||
/* this number only used by a 'standard' name,
|
/* this number only used by a 'standard' name,
|
||||||
* so it is safe to use
|
* so it is safe to use
|
||||||
|
|
2
super0.c
2
super0.c
|
@ -204,7 +204,7 @@ static void examine_super0(void *sbv)
|
||||||
if (dp->state & (1<<MD_DISK_REMOVED)) printf(" removed");
|
if (dp->state & (1<<MD_DISK_REMOVED)) printf(" removed");
|
||||||
if (wonly) printf(" write-mostly");
|
if (wonly) printf(" write-mostly");
|
||||||
if (dp->state == 0) printf(" spare");
|
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(" %s", dv);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
if (d == -1) printf("\n");
|
if (d == -1) printf("\n");
|
||||||
|
|
12
util.c
12
util.c
|
@ -358,7 +358,7 @@ int devlist_ready = 0;
|
||||||
int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
|
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
|
#if 0
|
||||||
fprintf(stderr, "Warning - fail to map %d,%d to a device name\n",
|
fprintf(stderr, "Warning - fail to map %d,%d to a device name\n",
|
||||||
|
@ -404,7 +404,7 @@ int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
|
||||||
* deliberately so prefer it over a standard name.
|
* deliberately so prefer it over a standard name.
|
||||||
* This applies only to names for MD devices.
|
* 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;
|
struct devmap *p;
|
||||||
char *std = NULL, *nonstd=NULL;
|
char *std = NULL, *nonstd=NULL;
|
||||||
|
@ -431,6 +431,12 @@ char *map_dev(int major, int minor)
|
||||||
nonstd = p->name;
|
nonstd = p->name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (create && !std && !nonstd) {
|
||||||
|
static char buf[30];
|
||||||
|
snprintf(buf, 1024, "%d:%d", major, minor);
|
||||||
|
nonstd = buf;
|
||||||
|
}
|
||||||
|
|
||||||
return nonstd ? nonstd : std;
|
return nonstd ? nonstd : std;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -573,7 +579,7 @@ char *get_md_name(int dev)
|
||||||
&& (stb.st_rdev == rdev))
|
&& (stb.st_rdev == rdev))
|
||||||
return devname;
|
return devname;
|
||||||
}
|
}
|
||||||
dn = map_dev(major(rdev), minor(rdev));
|
dn = map_dev(major(rdev), minor(rdev), 0);
|
||||||
if (dn)
|
if (dn)
|
||||||
return dn;
|
return dn;
|
||||||
snprintf(devname, sizeof(devname), "/dev/.tmp.md%d", dev);
|
snprintf(devname, sizeof(devname), "/dev/.tmp.md%d", dev);
|
||||||
|
|
Loading…
Reference in New Issue