[arch-general] [PATCH] rc.sysinit: only call modprobe once

Dave Reisner d at falconindy.com
Mon Sep 20 11:56:04 EDT 2010


On Mon, Sep 20, 2010 at 05:39:25PM +0200, Kurt J. Bosch wrote:
> 2010-09-20 04:10, Dave Reisner:
> >On Mon, Sep 20, 2010 at 11:57:06AM +1000, Allan McRae wrote:
> >>On 20/09/10 11:54, Dave Reisner wrote:
> >>>Use modprobe -a and a bash PE to filter the MODULES array.
> >>>
> >>>Signed-off-by: Dave Reisner<d at falconindy.com>
> >>>---
> >>>  rc.sysinit |   12 ++++--------
> >>>  1 files changed, 4 insertions(+), 8 deletions(-)
> >>>
> >>>diff --git a/rc.sysinit b/rc.sysinit
> >>>index 09d5e97..4b6e1e7 100755
> >>>--- a/rc.sysinit
> >>>+++ b/rc.sysinit
> >>>@@ -92,14 +92,10 @@ if /bin/pidof -o %PPID /sbin/udevd>/dev/null; then
> >>>  fi
> >>>
> >>>  # Load modules from the MODULES array defined in rc.conf
> >>>-if [[ $load_modules != off&&   -f /proc/modules ]]; then
> >>>-    stat_busy "Loading Modules"
> >>>-    for mod in "${MODULES[@]}"; do
> >>>-	if [[ $mod = ${mod#!} ]]; then
> >>>-	    /sbin/modprobe $mod
> >>>-	fi
> >>>-    done
> >>>-    stat_done
> >>>+if [[ $load_modules != off&&   -f /proc/modules ]]&&   (( ${#MODULES[@]}>   0 )); then
> >>>+	stat_busy "Loading Modules"
> >>>+		/sbin/modprobe -a "${MODULES[@]/#\!*/}"
> >>>+	stat_done
> >>>  fi
> >>>
> >>>  # Wait for udev uevents
> >>
> >>Does this still work in the "null" case where there is only modules
> >>specified with "!" in the front?
> >>
> >>Allan
> >>
> >
> >Excellent observation -- it would not. Counting the size of the array
> >with the PE in place isn't possible (or desirable), either. Perhaps a
> >more graceful solution is to reassign the output of the PE to a new
> >array and operate based on that. Certainly still beats calling modprobe
> >for every element in the array, imo.
> >
> >d
> >
> 
> I think it could be done like so:
> 
> From 6465c90fc851b12cfce791228415ae1c2823e050 Mon Sep 17 00:00:00 2001
> From: Kurt J. Bosch <kjb-temp-2009 at alpenjodel.de>
> Date: Mon, 20 Sep 2010 17:31:54 +0200
> Subject: [PATCH] rc.sysinit: only call modprobe once (as proposed by
> Dave Reisner)
> 
> ---
>  rc.sysinit |    9 +++------
>  1 files changed, 3 insertions(+), 6 deletions(-)
> 
> diff --git a/rc.sysinit b/rc.sysinit
> index 09d5e97..07b3f67 100755
> --- a/rc.sysinit
> +++ b/rc.sysinit
> @@ -92,13 +92,10 @@ if /bin/pidof -o %PPID /sbin/udevd >/dev/null; then
>  fi
> 
>  # Load modules from the MODULES array defined in rc.conf
> -if [[ $load_modules != off && -f /proc/modules ]]; then
> +modules=$( echo ${MODULES[*]/\!*/} )
> +if [[ $modules && $load_modules != off && -f /proc/modules ]]; then
>      stat_busy "Loading Modules"
> -    for mod in "${MODULES[@]}"; do
> -	if [[ $mod = ${mod#!} ]]; then
> -	    /sbin/modprobe $mod
> -	fi
> -    done
> +    /sbin/modprobe -a $modules
>      stat_done
>  fi
> 
> -- 
> 1.7.0.3
> 

Your echo is redundant. Just quote the expansion and assign it.

modules="${MODULES[@]/#\!*}"

I think we're a looooong way away from the day when there's a '!' as
part of a module name, but I think it's probably best to anchor the
expression to the start of each element regardless.

d


More information about the arch-general mailing list