[klibc] create_dev and raid

Aaron Griffin aaronmgriffin at gmail.com
Mon May 8 00:12:28 PDT 2006

Yet another one of those "it would make sense it" posts.

Currently, create_dev in do_mounts.c simply unlinks the device and recreates it.

This doesn't seem right.  If /dev/hda3 has already been created, by
some early-userspace app (udev), there's no need to unlink or even
parse the name again.  Now, when talking about simple block devices,
this doesn't make much of a difference (except when you take into
account the FS-mount looping).  However, if you take a look at 
do_mounts_md, if the raid array has already been assembled (say, for
instance, because the array was encrypted, or part of an lvm group),
kinit will again try to assemble it, spit out a mess of error
messages, and carry on.

The addition of a simple check in the md loop would fix this issue
[see below].  The reason being that, even if /dev/md0 is not identical
to the way kinit would have created it, it has been assembled by
early-userland apps and is probably supposed to be overridden.

--- do_mounts_md.c      2006-05-08 01:51:02.000000000 -0500
+++ do_mounts_md.old    2006-05-08 02:07:35.000000000 -0500
@@ -222,7 +222,6 @@
                char *devname;
                mdu_disk_info_t dinfo;
                char name[16];
+        struct stat st;

                dev_minor = md_setup_args[ent].minor;
                partitioned = md_setup_args[ent].partitioned;
@@ -231,8 +230,6 @@
                snprintf(name, sizeof name,
                         "/dev/md%s%d", partitioned?"_d":"", dev_minor);

+        if (!stat(name,&st)) continue;
                if (partitioned)
                        dev = makedev(mdp_major(), dev_minor << MdpMinorShift);

More information about the klibc mailing list