summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-03-28 06:26:53 +0000
committerNeil Brown <neilb@suse.de>2006-03-28 06:26:53 +0000
commit16c6fa807c1e43a1a12bbeb7668b4166d14b2cc8 (patch)
tree903679d6d0832899f1b36279bcb66e75b1e4c98f
parent8352ab3e2cd6f892ca53cd4e276c11017f6a4bdf (diff)
downloadmdadm-16c6fa807c1e43a1a12bbeb7668b4166d14b2cc8.tar.gz
mdadm-16c6fa807c1e43a1a12bbeb7668b4166d14b2cc8.tar.xz
mdadm-16c6fa807c1e43a1a12bbeb7668b4166d14b2cc8.zip
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>
-rw-r--r--Detail.c6
-rw-r--r--Grow.c24
-rw-r--r--Manage.c4
-rw-r--r--Monitor.c4
-rw-r--r--config.c6
-rw-r--r--mdadm.h2
-rw-r--r--mdassemble.c2
-rw-r--r--mdopen.c2
-rw-r--r--super0.c2
-rw-r--r--util.c12
10 files changed, 33 insertions, 31 deletions
diff --git a/Detail.c b/Detail.c
index a113933..d322732 100644
--- a/Detail.c
+++ b/Detail.c
@@ -105,12 +105,12 @@ int Detail(char *dev, int brief, int test)
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;
@@ -307,7 +307,7 @@ int Detail(char *dev, int brief, int test)
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,
diff --git a/Grow.c b/Grow.c
index 4a225c7..de53df1 100644
--- a/Grow.c
+++ b/Grow.c
@@ -92,13 +92,13 @@ int Grow_Add_device(char *devname, int fd, char *newdev)
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;
@@ -154,13 +154,13 @@ int Grow_Add_device(char *devname, int fd, char *newdev)
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;
@@ -298,10 +298,10 @@ int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int
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) {
@@ -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) ||
(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);
@@ -647,8 +647,8 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
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",
@@ -657,8 +657,8 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
}
} 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",
diff --git a/Manage.c b/Manage.c
index f7f3f6e..9e64316 100644
--- a/Manage.c
+++ b/Manage.c
@@ -249,9 +249,9 @@ int Manage_subdevs(char *devname, int fd,
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);
diff --git a/Monitor.c b/Monitor.c
index 2ea0bc8..0ab5e0c 100644
--- a/Monitor.c
+++ b/Monitor.c
@@ -309,7 +309,7 @@ int Monitor(mddev_dev_t devlist,
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;
@@ -317,7 +317,7 @@ int Monitor(mddev_dev_t devlist,
}
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 &&
diff --git a/config.c b/config.c
index c09c206..1408b25 100644
--- a/config.c
+++ b/config.c
@@ -229,11 +229,7 @@ mddev_dev_t load_partitions(void)
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);
diff --git a/mdadm.h b/mdadm.h
index 1752623..a9ae698 100644
--- a/mdadm.h
+++ b/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 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 {
diff --git a/mdassemble.c b/mdassemble.c
index 597cdb8..fc0c7a1 100644
--- a/mdassemble.c
+++ b/mdassemble.c
@@ -97,7 +97,7 @@ int main() {
continue;
rv |= Assemble(array_list->st, array_list->devname, mdfd,
array_list, configfile,
- NULL,
+ NULL, NULL,
readonly, runstop, NULL, verbose, force);
}
}
diff --git a/mdopen.c b/mdopen.c
index e4139e5..8c3eabb 100644
--- a/mdopen.c
+++ b/mdopen.c
@@ -176,7 +176,7 @@ int open_mddev(char *dev, int autof)
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
diff --git a/super0.c b/super0.c
index c7f2f61..a36b0a7 100644
--- a/super0.c
+++ b/super0.c
@@ -204,7 +204,7 @@ static void examine_super0(void *sbv)
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");
diff --git a/util.c b/util.c
index ab606ab..873deba 100644
--- a/util.c
+++ b/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)
{
}
-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",
@@ -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.
* 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;
@@ -431,6 +431,12 @@ char *map_dev(int major, int minor)
nonstd = p->name;
}
}
+ if (create && !std && !nonstd) {
+ static char buf[30];
+ snprintf(buf, 1024, "%d:%d", major, minor);
+ nonstd = buf;
+ }
+
return nonstd ? nonstd : std;
}
@@ -573,7 +579,7 @@ char *get_md_name(int dev)
&& (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);