[patch] 2.6.8 Errors during initrd loading with / on LVM over RAID

From: Frans Pop
Date: Sat Jul 30 2005 - 14:52:52 EST


I'm aware that devfs is being removed in 2.6.13, but this patch may still
interest maintainers of older versions.
I've debugged this problem using kernel version 2.6.8, but a check showed
this code is unchanged in 2.6.12. My system is Debian Sarge.

During boot using an initrd on a system having / on LVM over RAID, I
noticed the following messages on console and in /var/log/kern.log:

kernel: Inspecting /boot/System.map-2.6.8-2-686
kernel: Loaded 27390 symbols from /boot/System.map-2.6.8-2-686.
kernel: Symbols match kernel version 2.6.8.
kernel: No module symbols loaded - kernel modules not enabled.
kernel: ould not append to parent for /disc
kernel: devfs_mk_dir: invalid argument.<4>devfs_mk_dev: could not append
to parent for /disc
last message repeated 151 times


Cleaned for a missing \n in a printk and with added debug printk's in
fs/devfs/base.c, this looks like:
kernel: devfs_mk_dir: invalid argument, buf: .
kernel: _devfs_append_entry: -EEXIST for :disc
kernel: devfs_mk_dev: could not append to parent for /disc
(repeated)

The last two errors are a consequence of the error in devfs_mk_dir, so
can be ignored. The basic problem is that buf is empty when devfs_mk_dir
is called.

Tracing back I ended up in fs/partitions/check.c, which has the following
code in function register_disk:

/* No minors to use for partitions */
if (disk->minors == 1) {
if (disk->devfs_name[0] != '\0')
devfs_add_disk(disk);
return;
}

/* always add handle for the whole disk */
devfs_add_partitioned(disk);

This looks unlogical: why does the first statement check for empty
disk->devfs_name and is the second one called blindly?

Changing the last statement to:
if (disk->devfs_name[0] != '\0')
devfs_add_partitioned(disk);
else
printk(KERN_WARNING "%s: No devfs_name for %s.\n",
__FUNCTION__, disk->disk_name);
resulted in the errors disappearing and the following log output:

kernel: register_disk: No devfs_name for md_d0.
kernel: register_disk: No devfs_name for md_d64.
kernel: register_disk: No devfs_name for md_d128.
kernel: register_disk: No devfs_name for md_d192.
kernel: register_disk: No devfs_name for md_d4.
kernel: register_disk: No devfs_name for md_d68.
kernel: register_disk: No devfs_name for md_d132.
kernel: register_disk: No devfs_name for md_d196.
(repeated to md_d255)

The attached patch fixes the problem (and adds the missing \n).

--- fs/partitions/check.c.orig 2005-05-19 12:52:23.000000000 +0200
+++ fs/partitions/check.c 2005-07-29 00:36:04.523385998 +0200
@@ -348,7 +348,8 @@
}

/* always add handle for the whole disk */
- devfs_add_partitioned(disk);
+ if (disk->devfs_name[0] != '\0')
+ devfs_add_partitioned(disk);

/* No such device (e.g., media were just removed) */
if (!get_capacity(disk))
--- fs/devfs/base.c.orig 2005-07-29 00:32:03.329992027 +0200
+++ fs/devfs/base.c 2005-07-29 00:32:52.000008934 +0200
@@ -1644,7 +1644,7 @@
va_start(args, fmt);
n = vsnprintf(buf, 64, fmt, args);
if (n >= 64 || !buf[0]) {
- printk(KERN_WARNING "%s: invalid argument.", __FUNCTION__);
+ printk(KERN_WARNING "%s: invalid argument.\n", __FUNCTION__);
return -EINVAL;
}

Attachment: pgp00000.pgp
Description: PGP signature