diff options
-rw-r--r-- | mdk-stage1/NEWS | 3 | ||||
-rw-r--r-- | mdk-stage1/mount.c | 8 | ||||
-rw-r--r-- | mdk-stage1/probing.c | 18 |
3 files changed, 24 insertions, 5 deletions
diff --git a/mdk-stage1/NEWS b/mdk-stage1/NEWS index f6f2a6747..137dabe04 100644 --- a/mdk-stage1/NEWS +++ b/mdk-stage1/NEWS @@ -1,3 +1,6 @@ +1.46: +- create device listed in /proc/partitions with correct major/minor (#57032) + 1.45: - do not list /dev/fd0 when no floppy is found (#58390) diff --git a/mdk-stage1/mount.c b/mdk-stage1/mount.c index 2b3e0f89d..38a17fcf1 100644 --- a/mdk-stage1/mount.c +++ b/mdk-stage1/mount.c @@ -52,9 +52,13 @@ int ensure_dev_exists(const char * dev) /* SCSI disks */ major = 8; minor = (name[2] - 'a') << 4; - if (name[3] && name[4]) + if (name[3] && name[4]) { minor += 10 + (name[4] - '0'); - else if (name[3]) + if (name[3] > 1 || name[4] > 5) { + log_message("I don't know how to create device %s, please post bugreport to me!", dev); + return -1; + } + } else if (name[3]) minor += (name[3] - '0'); } else if (ptr_begins_static_str(name, "hd")) { /* IDE disks/cd's */ diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c index 3f9621705..f2f9fb52c 100644 --- a/mdk-stage1/probing.c +++ b/mdk-stage1/probing.c @@ -766,12 +766,24 @@ void find_media(enum media_bus bus) log_message("Couldn't open /proc/partitions"); } else { while (fgets(buf, sizeof(buf), f)) { - char name[100]; + char name[100] = "/dev/"; int major, minor, blocks; + struct stat statbuf; + char *ptr; memset(name, 0, sizeof(name)); - sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name); - if (streq(name, tmp_name) && tmp[count].type == DISK && ((blocks == 1048575) || (blocks == 1440))) + sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, &name[5]); + if (streq(&name[5], tmp_name) && tmp[count].type == DISK && ((blocks == 1048575) || (blocks == 1440))) tmp[count].type = FLOPPY; + /* Try to create all devices while we have major/minor */ + if ((ptr = strchr(&name[5], '/'))) { + *ptr = '\0'; + if (stat(name, &statbuf)) + mkdir(name, 0755); + *ptr = '/'; + } + if (stat(name, &statbuf) && mknod(name, S_IFBLK | 0600, makedev(major, minor))) { + log_perror(name); + } } fclose(f); } |