From bcb7572fe42c8efb712e5124f25935568c951103 Mon Sep 17 00:00:00 2001 From: Bill Nottingham Date: Wed, 4 Mar 2009 17:51:48 -0500 Subject: Fix various issues with dmraid handling (#485895, ) I've been doing a lot of work on mkinitrd's dmraid support lately some of the lessons learned there also apply to the activation of (not used for /) dmraid arrays in rc.sysinit, this will esp. help the livecd proerly activating and using dmraid sets. The patch fixes the following issues: 1) rc.sysinit (and mkinitrd used to) calls dm_resolve_name() on the output of dmraid, this is not necessary as dm_resolve_name is only needed when the name is /dev/dm-#, it is actually harmful as dm_resolve_name sometimes fails when used like this, causing us to fail to activate dmraid sets 2) rc.sysinit does not remove the partitions from the raw disks used in a raidset the initrd used to use special nash functionality to tell the kernels to forget about the partitions of the raw disks it had scanned at boot. The issue here is, say we have a mirror of sda and sdb, and that mirror has 2 partitions. Then the kernel when scanning the raw disks will find sda1,sda2,sdb1,sdb2. But we do not want anything using those, they should use the devicemapper versions as those are mirrored! I've even seen mounting by LABEL / UUID do the wrong thing by using the raw partitions instead of the raidset partitions. I've recently done a patch to dmraid adding a --rm_partitions cmdline option which makes dmraid do the ioctl which makes the kernel forget about the partitions of the rawdisk (which in turn makes udev remove the device nodes). This way we no longer need the nash magic. Part of my rc.sysinit patch is adding --rm_partitions to the dmraid invocation 3) rc.sysinit uses dmraid -p, which tells dmraid to not setup device maps for the partitions of the raidset and then kalls kpartx to setup the device maps for the partitions. This can be simplified by removing the -p argument to dmraid 4) with all these changes in place there is no longer a reason to loop, a single dmraid invocation is enough. p.s. AFAIK with this patch the last user of dm_resolve_name is gone, so that function can be removed. Better check twice though. --- rc.d/rc.sysinit | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'rc.d/rc.sysinit') diff --git a/rc.d/rc.sysinit b/rc.d/rc.sysinit index 832bcc2a..17b4de6f 100755 --- a/rc.d/rc.sysinit +++ b/rc.d/rc.sysinit @@ -358,14 +358,7 @@ fi if ! strstr "$cmdline" nodmraid && [ -x /sbin/dmraid ]; then modprobe dm-mirror >/dev/null 2>&1 - for x in $(/sbin/dmraid -ay -i -p -t 2>/dev/null | \ - egrep -iv "^no " | \ - (IFS=":";while read a rest;do echo $a;done)) ; do - dmname=$(resolve_dm_name $x) - [ -z "$dmname" ] && continue - /sbin/dmraid -ay -i -p "$dmname" >/dev/null 2>&1 - /sbin/kpartx -a -p p "/dev/mapper/$dmname" - done + /sbin/dmraid -ay -i --rm_partitions >/dev/null 2>&1 fi if [ -x /sbin/lvm ]; then -- cgit v1.2.1