On Sun, Feb 22, 2004 at 10:48:40PM +0530, Deboo wrote:
> I have converted my partitions to ext3 but I learnt the other day while
> trying to use bdflush to make the hdd spin down, that it won't work with
> ext3 partitions ecause ext3 partitions wrrite to disk every 5 seconds, the
> journal get written I mean. Is there no way to make the hdd spin down with
> ext3? If no, then is reiser or any other kind of journalled FS work with
> bdflush? Or is there any other bdflush type utility to do this?
> 

I am guessing you are using laptop mode because otherwise the kernel
flushes its buffers every 30 seconds anyway.
Is it a custom kernel or a debian one. If its a debian one, for the
moment you will need the script from 2.6 which uses the commit mount
option with a small change (it doesn't reset the value).
If its a custom kernel I can send you a patch (I am currently working
on a fix, but its in a testing phase now and it will probably be some
time before it hits the standard kernels.)
I attached a modified laptop-mode script you can use for now.
Just note that although it has options for xfs and reiserfs they won't
work for the moment as they require a patch to add the needed support
(reiserfs doesn't have the support at all at the moment and xfs is
limited to 5 minutes).

> Regards,
> Deboo
> 
> 
> -- 
> To UNSUBSCRIBE, email to [EMAIL PROTECTED] 
> with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
> 
>  
>  +++++++++++++++++++++++++++++++++++++++++++
>  This Mail Was Scanned By Mail-seCure System
>  at the Tel-Aviv University CC.
> 
#!/bin/sh

# start or stop laptop_mode, best run by a power management daemon when
# ac gets connected/disconnected from a laptop
#
# install as /sbin/laptop_mode
#
# Contributors to this script:  Kiko Piris
#                               Bart Samwel
#                               Dax Kelson
# Original Linux 2.4 version by: Jens Axboe

parse_mount_opts () {
        OPT="$1"
        shift
        echo "$*"                       | \
        sed 's/.*/,&,/'                 | \
        sed 's/,'"$OPT"'=[0-9]*,/,/g'   | \
        sed 's/,,*/,/g'                 | \
        sed 's/^,//'                    | \
        sed 's/,$//'                    | \
        cat -
}

parse_mount_opts_wfstab () {
        L_DEV=$1
        shift
        OPT=$1
        shift
        L_OPTS="$*"

        PARSEDOPTS1="$(parse_mount_opts $OPT $L_OPTS)"
        # Watch for a default commit/transaction in fstab
        FSTAB_OPTS="$(cat /etc/fstab | sed 's/  / /g' | grep ^\ *"$L_DEV " | awk '{ 
print $4 }')"
        if [ -z "$(echo "$FSTAB_OPTS" | grep "$OPT=")" ] ; then
                # no commit/transaction option specified in fstab: set it to 0
                echo "$PARSEDOPTS1,$OPT=30"
        else
                # commit/transaction option specified in fstab: extract the value, and 
use it
                echo -n "$PARSEDOPTS1,$OPT="
                echo "$FSTAB_OPTS"      | \
                sed 's/.*/,&,/'         | \
                sed 's/.*,'"$OPT"'=//'  | \
                sed 's/,.*//'           | \
                cat -
        fi
}

KLEVEL="$(uname -r | cut -c1-3)"
case "$KLEVEL" in
        "2.4"|"2.6")
                true
                ;;
        *)
                echo "Unhandled kernel version: $KLEVEL ('uname -r' = '$(uname -r)')"
                exit 1
                ;;
esac

# Shall we remount journaled fs. with appropiate commit/transaction interval? (1=yes)
DO_REMOUNTS=1

# age time, in seconds. should be put into a sysconfig file
MAX_AGE=600

# Allowed dirty ratio, in pct. should be put into a sysconfig file as well.
DIRTY_RATIO=40

# kernel default dirty buffer age
DEF_AGE=30
DEF_UPDATE=5
DEF_DIRTY_BACKGROUND_RATIO=10
DEF_DIRTY_RATIO=40

# This is temporary: we have to read this from the kernel somewhere.
HZ=100

# hdparm spindown settings
ACAD_HD=0
BATT_HD=4

if [ ! -e /proc/sys/vm/laptop_mode ]; then
        echo "Kernel is not patched with laptop_mode patch."
        exit 1
fi

if [ ! -w /proc/sys/vm/laptop_mode ]; then
        echo "You do not have enough privileges to enable laptop_mode."
        exit 1
fi

case "$1" in
        start)
                # XFS counts in jiffies, the others in centisecs.
                AGE=$((100*$MAX_AGE))
                XFS_AGE=$(($HZ*$MAX_AGE))
                echo -n "Starting laptop_mode"
                echo "1" > /proc/sys/vm/laptop_mode
                case "$KLEVEL" in
                        "2.4")
                                echo "30 500 0 0 $AGE $AGE 60 20 0"     > 
/proc/sys/vm/bdflush
                                ;;
                        "2.6")
                                echo "$AGE"                             > 
/proc/sys/vm/dirty_writeback_centisecs
                                echo "$AGE"                             > 
/proc/sys/vm/dirty_expire_centisecs
                                echo "$DIRTY_RATIO"                     > 
/proc/sys/vm/dirty_ratio
                                echo "$DIRTY_RATIO"                     > 
/proc/sys/vm/dirty_background_ratio
                                ;;
                esac
                if [ -d /proc/sys/vm/pagebuf ] ; then
                        # This only needs to be set, not reset -- it is only used when
                        # laptop mode is enabled.
                        echo $XFS_AGE > /proc/sys/vm/pagebuf/lm_flush_age
                fi
                if [ $DO_REMOUNTS -eq 1 ]; then
                        cat /etc/mtab | \
                                while read DEV MP FST OPTS DUMP PASS ; do
                                        case "$FST" in 
                                                "ext3")
                                                        PARSEDOPTS="$(parse_mount_opts 
commit $OPTS)"
                                                        mount $DEV -t $FST $MP -o 
remount,$PARSEDOPTS,commit=$MAX_AGE
                                                        ;;
                                                "reiserfs")
                                                        PARSEDOPTS="$(parse_mount_opts 
transaction $OPTS)"
                                                        mount $DEV -t $FST $MP -o 
remount,$PARSEDOPTS,transaction=$MAX_AGE
                                                        ;;
                                                # No need to do anything for xfs
                                        esac
                                done
                fi

                /sbin/hdparm -S $BATT_HD /dev/hda > /dev/null 2>&1
                /sbin/hdparm -B 1 /dev/hda > /dev/null 2>&1

                echo "."
                ;;
        stop)
                U_AGE=$((100*$DEF_UPDATE))
                B_AGE=$((100*$DEF_AGE))
                echo -n "Stopping laptop_mode"
                echo "0" > /proc/sys/vm/laptop_mode
                case "$KLEVEL" in
                        "2.4")
                                echo "30 500 0 0 $U_AGE $B_AGE 60 20 0" > 
/proc/sys/vm/bdflush
                                ;;
                        "2.6")
                                echo "$U_AGE"                           > 
/proc/sys/vm/dirty_writeback_centisecs
                                echo "$B_AGE"                           > 
/proc/sys/vm/dirty_expire_centisecs
                                echo "$DEF_DIRTY_RATIO"                 > 
/proc/sys/vm/dirty_ratio
                                echo "$DEF_DIRTY_BACKGROUND_RATIO"      > 
/proc/sys/vm/dirty_background_ratio
                                ;;
                esac
                if [ $DO_REMOUNTS -eq 1 ]; then
                        cat /etc/mtab | \
                                while read DEV MP FST OPTS DUMP PASS ; do
                                        case "$FST" in
                                                "ext3")
                                                        
PARSEDOPTS="$(parse_mount_opts_wfstab $DEV commit $OPTS)"
                                                        mount $DEV -t $FST $MP -o 
remount,$PARSEDOPTS
                                                        ;;
                                                "reiserfs")
                                                        
PARSEDOPTS="$(parse_mount_opts_wfstab $DEV transaction $OPTS)"
                                                        mount $DEV -t $FST $MP -o 
remount,$PARSEDOPTS
                                                        ;;
                                                # No need to do anything for xfs
                                        esac
                                done
                fi

                /sbin/hdparm -S $ACAD_HD /dev/hda  > /dev/null 2>&1
                /sbin/hdparm -B 255 /dev/hda > /dev/null 2>&1

                echo "."
                ;;
        *)
                echo "Usage: $0 {start|stop}"
                ;;

esac

exit 0

Reply via email to