]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
added initqueue-settled and refactored code
authorHarald Hoyer <harald@redhat.com>
Mon, 7 Sep 2009 15:40:04 +0000 (17:40 +0200)
committerHarald Hoyer <harald@redhat.com>
Mon, 7 Sep 2009 17:12:01 +0000 (19:12 +0200)
16 files changed:
modules.d/90crypt/cryptroot-ask.sh
modules.d/90dmraid/61-dmraid-imsm.rules
modules.d/90dmraid/dmraid.sh
modules.d/90dmsquash-live/dmsquash-live-genrules.sh
modules.d/90lvm/64-lvm-vol_id.rules [deleted file]
modules.d/90lvm/64-lvm.rules
modules.d/90lvm/install
modules.d/90lvm/lvm_scan.sh
modules.d/90mdraid/65-md-incremental-imsm.rules
modules.d/90mdraid/mdcontainer_start.sh
modules.d/90mdraid/mdraid_start.sh
modules.d/95rootfs-block/block-genrules.sh
modules.d/99base/dracut-lib.sh
modules.d/99base/init
modules.d/99base/initqueue
modules.d/99base/install

index a2ebde6c9d43307ed9266bd9393e2aeb6bd38e0d..7872d6470e93bfc9c8d8b672fead55b2deba3cdb 100755 (executable)
@@ -35,6 +35,4 @@ fi
 # mark device as asked
 >> /tmp/cryptroot-asked-$2
 
-udevsettle
-
 exit 0
index 172e09f16b8545664747091069821c2b150e664e..d6106432186b237936037ad0afb30e13331af501 100644 (file)
@@ -11,7 +11,9 @@ ENV{ID_FS_TYPE}=="isw_raid_member", ENV{rd_NO_MDIMSM}!="?*", GOTO="dm_end"
 ENV{ID_FS_TYPE}!="*_raid_member", , GOTO="dm_end"
 TEST=="/tmp/.dmraid_scan-%k", GOTO="dm_end"
 
-RUN+="/bin/sh -c '>/tmp/.dmraid_scan-%k; /bin/ln -fs /sbin/dmraid_scan /initqueue/dmraid_scan.sh'"
+RUN+="/sbin/initqueue --onetime --unique --settled /sbin/dmraid_scan"
+
+ACTION=="change", RUN+="/bin/sh -c '>/tmp/.dmraid_scan-%k'"
 
 ENV{DEVTYPE}!="partition", \
     RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}"
index 2cd67737b609e6394bbbaec1159f370fdb224978..e38223306fce023556543e5fa74770be0d1b85a5 100755 (executable)
@@ -1,28 +1,25 @@
 #!/bin/sh
 
-if $UDEV_QUEUE_EMPTY >/dev/null 2>&1; then
-    [ -h "$job" ] && rm -f "$job"
-    DM_RAIDS=$(getargs rd_DM_UUID=)
-    # run dmraid if udev has settled
-    info "Scanning for dmraid devices $DM_RAIDS"
-    if [ -n "$DM_RAIDS" ]; then
-       # only activate specified DM RAIDS
-       SETS=$(dmraid -c -s)
-       info "Found dmraid sets:"
-       echo $SETS|vinfo
-       for r in $DM_RAIDS; do 
-           for s in $SETS; do 
-               if [ "${s##$r}" != "$s" ]; then
-                   info "Activating $s"
-                   dmraid -ay $s 2>&1 | vinfo
-                    udevsettle
-               fi
-           done
+. /lib/dracut-lib.sh
+
+DM_RAIDS=$(getargs rd_DM_UUID=)
+# run dmraid if udev has settled
+info "Scanning for dmraid devices $DM_RAIDS"
+if [ -n "$DM_RAIDS" ]; then
+    # only activate specified DM RAIDS
+    SETS=$(dmraid -c -s)
+    info "Found dmraid sets:"
+    echo $SETS|vinfo
+    for r in $DM_RAIDS; do 
+       for s in $SETS; do 
+           if [ "${s##$r}" != "$s" ]; then
+               info "Activating $s"
+               dmraid -ay $s 2>&1 | vinfo
+                udevsettle
+           fi
        done
-    else 
-       # scan and activate all DM RAIDS
-       dmraid -ay 2>&1 | vinfo
-        udevsettle
-    fi
+    done
+else 
+    # scan and activate all DM RAIDS
+    dmraid -ay 2>&1 | vinfo
 fi
-
index a3858e1fe29662be8a336a78a374a3460cc3e4da..4bf993dbe890ddda511fbc3be8a1290c248f0da6 100644 (file)
@@ -4,9 +4,9 @@ if [ "${root%%:*}" = "live" ]; then
        ${root#live:/dev/} 
     printf 'SYMLINK=="%s", SYMLINK+="live"\n' \
        ${root#live:/dev/} 
-    printf 'KERNEL=="%s", RUN+="/sbin/initqueue --onetime /sbin/dmsquash-live-root $env{DEVNAME}"\n' \
+    printf 'KERNEL=="%s", RUN+="/sbin/initqueue --onetime --unique /sbin/dmsquash-live-root $env{DEVNAME}"\n' \
        ${root#live:/dev/} 
-    printf 'SYMLINK=="%s", RUN+="/sbin/initqueue --onetime /sbin/dmsquash-live-root $env{DEVNAME}"\n' \
+    printf 'SYMLINK=="%s", RUN+="/sbin/initqueue --onetime --unique /sbin/dmsquash-live-root $env{DEVNAME}"\n' \
        ${root#live:/dev/} 
 
     ) >> /etc/udev/rules.d/99-live-mount.rules
diff --git a/modules.d/90lvm/64-lvm-vol_id.rules b/modules.d/90lvm/64-lvm-vol_id.rules
deleted file mode 100644 (file)
index 4f349a6..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# hacky rules to try to activate lvm when we get new block devs...
-#
-# Copyright 2008, Red Hat, Inc.
-# Jeremy Katz <katzj@redhat.com>
-
-
-SUBSYSTEM!="block", GOTO="lvm_end"
-ACTION!="add|change", GOTO="lvm_end"
-KERNEL=="dm-[0-9]*", ACTION!="change", GOTO="lvm_end"
-
-ENV{ID_FS_TYPE}=="LVM2_member", \
-    TEST!="/tmp/.lvm_scan-%k", \
-    RUN+="/bin/sh -c '>/tmp/.lvm_scan-%k; /bin/ln -fs /sbin/lvm_scan /initqueue/lvm_scan.sh'"
-
-KERNEL!="dm-[0-9]*", GOTO="lvm_end"
-
-OPTIONS="link_priority=-100"
-ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
-ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}"
-
-
-LABEL="lvm_end"
index 0a053aed39b8a1ebfe6a9d11ee3418aa19944c0d..a200add8971a0e36dc6c9a4e4087b08fb6e45022 100644 (file)
@@ -7,9 +7,12 @@
 SUBSYSTEM!="block", GOTO="lvm_end"
 ACTION!="add|change", GOTO="lvm_end"
 KERNEL=="dm-[0-9]*", ACTION=="add", GOTO="lvm_end"
+ENV{ID_FS_TYPE}!="LVM2_member", GOTO="lvm_end"
 
-ENV{ID_FS_TYPE}=="LVM2_member", \
-    TEST!="/tmp/.lvm_scan-%k", \
-    RUN+="/bin/sh -c '>/tmp/.lvm_scan-%k; /bin/ln -fs /sbin/lvm_scan /initqueue/lvm_scan.sh'"
+TEST!="/tmp/.lvm_change-%k", \
+    RUN+="/sbin/initqueue --settled --onetime --unique /sbin/lvm_scan"
+
+ACTION=="add", RUN+="/bin/sh -c '>/tmp/.lvm_scan-%k;'"
+ACTION=="change", RUN+="/bin/sh -c '>/tmp/.lvm_change-%k;>/tmp/.lvm_scan-%k;'"
 
 LABEL="lvm_end"
index ad4d2e2de081c0860b30ee16c85ed509fa22846d..c0952e26119e35140487098ec922b85a8ee5a009 100755 (executable)
@@ -1,10 +1,7 @@
 #!/bin/bash
 inst lvm
-if [ -x /lib/udev/vol_id ]; then
-    inst_rules "$moddir/64-lvm-vol_id.rules" 64-device-mapper.rules
-else
-    inst_rules "$moddir/64-lvm.rules" 64-device-mapper.rules
-fi
+
+inst_rules "$moddir/64-lvm.rules" 64-lvm.rules
 
 if [[ $hostonly ]]; then 
     [ -f /etc/lvm/lvm.conf ] && inst /etc/lvm/lvm.conf
index a40b6774de24961792275eacb8d0c5d1664736f2..f606055ca08c425c8d95f655083abfbb19a86807 100755 (executable)
@@ -1,38 +1,35 @@
 #!/bin/sh
 
-if $UDEV_QUEUE_EMPTY >/dev/null 2>&1; then
-    [ -h "$job" ] && rm -f "$job"
-    # run lvm scan if udev has settled
+# run lvm scan if udev has settled
 
-    VGS=$(getargs rd_LVM_VG=)
+. /lib/dracut-lib.sh
 
-    [ -d /etc/lvm ] || mkdir -p /etc/lvm
-    # build a list of devices to scan
-    lvmdevs=$(
-       for f in /tmp/.lvm_scan-*; do
-           [ -e "$f" ] || continue
-           echo -n "${f##/tmp/.lvm_scan-} "
-       done
-       )
+VGS=$(getargs rd_LVM_VG=)
 
-    if [ ! -e /etc/lvm/lvm.conf ]; then 
-        {
-           echo 'devices {';
-           echo -n '    filter = [ '
-           for dev in $lvmdevs; do
-               printf '"a|^/dev/%s$|", ' $dev;
-           done;
-           echo '"r/.*/" ]';
-           echo 'types = [ "blkext", 1024 , "cciss0", 1024 ]'
-           echo '}';     
-        } > /etc/lvm/lvm.conf
-       lvmwritten=1
-    fi
-    info "Scanning devices $lvmdevs for LVM volume groups $VGS"
-    lvm vgscan 2>&1 | vinfo
-    lvm vgchange -ay $VGS 2>&1 | vinfo
-    [ "$lvmwritten" ] && rm -f /etc/lvm/lvm.conf
-    unset lvmwritten
-    udevsettle
-fi
+[ -d /etc/lvm ] || mkdir -p /etc/lvm
+# build a list of devices to scan
+lvmdevs=$(
+    for f in /tmp/.lvm_scan-*; do
+       [ -e "$f" ] || continue
+       echo -n "${f##/tmp/.lvm_scan-} "
+    done
+)
 
+if [ ! -e /etc/lvm/lvm.conf ]; then 
+    {
+       echo 'devices {';
+       echo -n '    filter = [ '
+       for dev in $lvmdevs; do
+           printf '"a|^/dev/%s$|", ' $dev;
+       done;
+       echo '"r/.*/" ]';
+       echo 'types = [ "blkext", 1024 , "cciss0", 1024 ]'
+       echo '}';         
+    } > /etc/lvm/lvm.conf
+    lvmwritten=1
+fi
+info "Scanning devices $lvmdevs for LVM volume groups $VGS"
+lvm vgscan 2>&1 | vinfo
+lvm vgchange -ay $VGS 2>&1 | vinfo
+[ "$lvmwritten" ] && rm -f /etc/lvm/lvm.conf
+unset lvmwritten
index 5104fc51b19fff4898c2c55d2a0b61c37feb0033..0a06988b65aab38b21709ad28c79f47a9cd2a106 100644 (file)
@@ -20,12 +20,46 @@ ENV{DEVTYPE}!="partition", \
 
 RUN+="/sbin/mdadm -I --no-degraded $env{DEVNAME}"
 
-RUN+="/bin/sh -c '>/tmp/.mdraid_start-%k; /bin/ln -s /sbin/mdraid_start /initqueue/mdraid_start.sh'"
-
 LABEL="md_inc_end"
 
+#
+# Handle non-container raid arrays
+#
+ACTION=="add|change", \
+       KERNEL=="md[0-9]*|md/*", \
+       ENV{DEVTYPE}!="partition", \
+       ENV{MD_LEVEL}!="container", \
+       GOTO="do_raidstart"
+
+GOTO="end_raidstart"
+
+LABEL="do_raidstart"
+
+TEST!="/tmp/.mdraid_start-%k", \
+       RUN+="/sbin/initqueue --settled --onetime --unique /sbin/mdraid_start"
+
+ACTION=="change", \
+       RUN+="/bin/sh -c '>/tmp/.mdraid_start-%k'"
+
+LABEL="end_raidstart"
+
+#
+# Handle container raid arrays
+#
 ACTION=="add|change", \
+       KERNEL=="md[0-9]*|md/*", \
        ENV{DEVTYPE}!="partition", \
        ENV{MD_LEVEL}=="container", \
-       TEST!="/tmp/.mdcontainer_start-%k", \
-       RUN+="/bin/sh -c '>/tmp/.mdcontainer_start-%k; initqueue /sbin/mdcontainer_start $env{DEVNAME}'"
+       GOTO="do_container"
+
+GOTO="end_container"
+
+LABEL="do_container"
+
+TEST!="/tmp/.mdcontainer_start-%k", \
+       RUN+="/sbin/initqueue --settled --onetime /sbin/mdcontainer_start $env{DEVNAME}"
+
+ACTION=="change", \
+       RUN+="/bin/sh -c '>/tmp/.mdcontainer_start-%k'"
+
+LABEL="end_container"
index 403b62b9a932b9a7ae8a82784ed7c1c6d2531489..4cb282dcc971e60858b882a1e4220968170a8af2 100755 (executable)
@@ -1,9 +1,6 @@
 #!/bin/sh
 . /lib/dracut-lib.sh
 
-if $UDEV_QUEUE_EMPTY >/dev/null 2>&1; then
-    # run mdadm if udev has settled
-    md=$1
-    # and activate any containers
-    mdadm -IR $md 2>&1 | vinfo
-fi
+md=$1
+# and activate any containers
+mdadm -IR $md 2>&1 | vinfo
index 55e7d9c643fa54c1d7e9eb70e0f39a9b87d8c299..ee9362c0c18c794a8b6a1e2e837831346958e326 100755 (executable)
@@ -1,9 +1,6 @@
 #!/bin/sh
 
-if $UDEV_QUEUE_EMPTY >/dev/null 2>&1; then
-    [ -h "$job" ] && rm -f "$job"
-    # run mdadm if udev has settled
-    info "Assembling MD RAID arrays"
-    mdadm -IRs 2>&1 | vinfo
-    udevsettle 
-fi
+. /lib/dracut-lib.sh
+# run mdadm if udev has settled
+info "Assembling MD RAID arrays"
+mdadm -IRs 2>&1 | vinfo
index 10471ea5ed52b55368dc1cc85ed804b937135537..f12a6b93ed45d2b5b992c8179a77d0b8b0296591 100644 (file)
@@ -8,5 +8,5 @@ if [ "${root%%:*}" = "block" ]; then
     (
     printf '[ -e "%s" ] && { ln -s "%s" /dev/root; rm "$job"; }\n' \
        "${root#block:}" "${root#block:}"
-    ) >> /initqueue/blocksymlink.sh
+    ) >> /initqueue-settled/blocksymlink.sh
 fi
index a717bb4b2f8e5fa69545ac788b7e9505e149de77..9e33cf3bbf584b8ed01b0ccf43f1d83eaa36a2a5 100644 (file)
@@ -117,3 +117,10 @@ udevsettle() {
         udevadm settle --timeout=30
     fi
 }
+
+if [ -e /proc/cmdline ]; then
+       if getarg rdinitdebug; then
+           set -x
+       fi
+fi
+
index d94a3a27a288dbf101d3426a0f913bb08542519c..14505edc6070b9957ce884756e649bd1810e87b2 100755 (executable)
@@ -138,7 +138,22 @@ while :; do
     [ -n "$queuetriggered" ] && continue
 
     if $UDEV_QUEUE_EMPTY >/dev/null 2>&1; then
-        # no more udev jobs
+        unset queuetriggered
+       for job in /initqueue-settled/*.sh; do
+           [ -e "$job" ] || break
+
+           queuetriggered="1"
+
+            job=$job . $job
+           
+            # bail out, if we have mounted the root filesystem
+            [ -d "$NEWROOT/proc" ] && break 2;
+
+            # check if root can be mounted
+            [ -e /dev/root ] && break 2;
+       done
+
+        # no more udev jobs and queues empty.
         sleep 0.5
         i=$(($i+1))
         [ $i -gt 20 ] \
index a5c6ef64ad7d9c68fa18689e69c356d12d2df2aa..b2d4406184e757b687d858ac80b0effe3d286678 100755 (executable)
@@ -1,12 +1,32 @@
 #!/bin/sh
 
-if [ "$1" = "--onetime" ]; then
-    onetime="yes"
-    shift
+. /lib/dracut-lib.sh
+
+while [ $# -gt 0 ]; do
+    case "$1" in
+       --onetime)
+           onetime="yes"
+           shift;;
+       --settled)
+           settled="-settled"
+           shift;;
+       --unique)
+           unique="yes"
+           shift;;
+       *)
+           break;;
+    esac
+done
+
+if [ -z "$unique" ]; then
+       job=$$
+else
+       job=${1##*/}
 fi
-echo "$@" > /tmp/$$.sh
+
+echo "$@" > /tmp/${job}.sh
 if [ -n "$onetime" ]; then
-   echo '[ -e "$job" ] && rm "$job"' >> /tmp/$$.sh
+   echo '[ -e "$job" ] && rm "$job"' >> /tmp/${job}.sh
 fi
-mv /tmp/$$.sh /initqueue/
->> /initqueue/work
+mv -f /tmp/${job}.sh /initqueue${settled}/
+[ -z "$settled" ] && >> /initqueue/work
index bc2336a9983dcdab1a2dcd356a5619413ebbba5f..08ca8f0c7a66b1167403e3b5ebae9ead4622fcf2 100755 (executable)
@@ -9,6 +9,7 @@ fi
 inst "$moddir/init" "/init"
 inst "$moddir/initqueue" "/sbin/initqueue"
 mkdir -p ${initdir}/initqueue
+mkdir -p ${initdir}/initqueue-settled
 mkdir -p ${initdir}/tmp
 # Bail out if switch_root does not exist
 if which switch_root >/dev/null 2>&1; then