On Tue, Dec 21, 2004 at 10:15:54AM -0800, Marc Singer wrote: > On Mon, Dec 20, 2004 at 02:52:50AM +0100, Goswin von Brederlow wrote: > > Marc Singer <[EMAIL PROTECTED]> writes: > > > > > On running mdadm --assemble /dev/md0 > > > > > > mdadm[4247]: segfault at 000000000000002c rip 000000000804b19e rsp > > > 00000000ffffdb80 error 4 > > > mdadm[4253]: segfault at 000000000000002c rip 000000000804b19e rsp > > > 00000000ffffdb80 error 4 > > > > That doesn't mean much. Unaligned access gets reported as such as > > well for example. > > > > Could you paste a gdb stack backtrace preverably after rebuilding > > mdadm with debug info? > > I've had a look at the mdadm side of this problem. It looks like it > is crashing because there is no configuration file. From mdadm.c > > break; > case ASSEMBLE: > if (devs_found == 1 && ident.uuid_set == 0 && > ident.super_minor == UnSet && !scan ) { > /* Only a device has been given, so get details from config > file */ > mddev_ident_t array_ident = conf_get_ident(configfile, > devlist->devname); > mdfd = open_mddev(devlist->devname, array_ident->autof); > > The conf_get_ident() is returning 0 which is then dereferenced by the > open_mddev() call and segfault'ing. configfile is NULL because none > was given. AFAICT, configfile never defaults. And even if it did, > there is no config file on my machine. > > I haven't yet looked into the code within the initrd to see what it > does. It is possible that the only way that my setup can work is if > the md driver is compiled in. > > Still, I wonder about the ioctl errors that I see with fdisk.
I took a breif look at initrd and for reference have included how it handles mdadm below. I think that the important bit is that it passes not only the md device but its component devices to mdadm -A (--assemble). It seems to me that as your invocation does not do that, it is going into a code path in mdadm that has a bug in it and thus segfaults. In a nutshell, I don't think it is a kernel problem. -- Horms getraid_mdadm() { mdadm=$(mdadm -D "$device") || { echo "$PROG: mdadm -D $device failed" >&2 exit 1 } eval "$( echo "$mdadm" | awk ' $1 == "Raid" && $2 == "Level" { print "echo " $4; next } $1 == "Number" && $2 == "Major" { start = 1; next } $1 == "UUID" { print "uuid=" $3; start = 0; next } !start { next } $2 == 0 && $3 == 0 { next } { devices = devices " " $NF } END { print "devices='\''" devices "'\''" } ' )" printf '%s\n' $devices > getroot echo mdadm -A /devfs/md/$minor -R -u $uuid $devices \ > md$minor-script echo /sbin/mdadm >&6 }