72 lines
1.6 KiB
Bash
Executable File
72 lines
1.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
. "${PM_FUNCTIONS}"
|
|
|
|
XFS="/proc/sys/fs/xfs"
|
|
xfsfiles="age_buffer_centisecs xfssyncd_centisecs xfsbufd_centisecs"
|
|
XFS_AGE_BUFFER=${XFS_AGE_BUFFER:-60000}
|
|
XFS_BUFD=${XFS_BUFD:-3000}
|
|
XFS_SYNCD=${XFS_SYNCD:-60000}
|
|
|
|
help() {
|
|
cat <<EOF
|
|
--------
|
|
$0: XFS filesystem buffer control hook.
|
|
|
|
This hook tries to save power by tuning any XFS filesystems to delay writing
|
|
dirty metadata. It only takes effect on battery, when the system switches
|
|
to AC power it will restore the kernel defaults.
|
|
|
|
This hook has 3 parameters:
|
|
XFS_AGE_BUFFER = How old an XFS filesystem buffer can be before it is flushed.
|
|
Defaults to 60000, or 10 minutes (600 seconds)
|
|
|
|
XFS_BUFD = How often XFS will scan for dirty metadata to flush it.
|
|
Defaults to 3000, or 30 seconds.
|
|
|
|
XFS_SYNCD = How often an XFS filesystem will perform other filesystem
|
|
Defaults to 60000, or 10 minutes.
|
|
|
|
EOF
|
|
}
|
|
|
|
[ -f $XFS/age_buffer_centisecs ] || exit $NA
|
|
|
|
read_values() {
|
|
for f in $xfsfiles; do
|
|
[ -r "$XFS/$f" ] && cat "$XFS/$f" || echo 0
|
|
done
|
|
}
|
|
|
|
write_values() {
|
|
for f in $xfsfiles; do
|
|
[ -w "$XFS/$f" ] && echo $1 > "$XFS/$f"
|
|
shift
|
|
done
|
|
}
|
|
|
|
# Why does XFS have its own parameters instead of just using the
|
|
# VM subsystem ones? Only SGI knows...
|
|
|
|
xfs_ac() {
|
|
if state_exists xfs_buffer_default; then
|
|
write_values $(restorestate xfs_buffer_default)
|
|
else
|
|
write_values 1500 3000 100
|
|
fi
|
|
}
|
|
|
|
xfs_battery() {
|
|
state_exists xfs_buffer_default || \
|
|
read_values |savestate xfs_buffer_default
|
|
write_values "$XFS_AGE_BUFFER" "$XFS_SYNCD" "$XFS_BUFD"
|
|
}
|
|
|
|
case $1 in
|
|
true) xfs_battery ;;
|
|
false) xfs_ac ;;
|
|
help) help;;
|
|
*) exit $NA ;;
|
|
esac
|
|
|
|
exit 0 |