#!/system/bin/sh
#
# handle zram and swap filesystems
# Andrew Sutherland - (20120605)

[ "$SD_EXT_DIRECTORY" = "" ] && SD_EXT_DIRECTORY=/sd-ext;
BB="/system/xbin/busybox";
logI="log -p i -t handleswap"
logE="log -p e -t handleswap"

# Do we support swap?
[ -e /proc/swaps ] || exit

# find SD Card
for MMC_NUM in `seq 0 9`; do
    test -e /sys/block/mmcblk${MMC_NUM}/device/type || continue
    MMC_TYPE=`$BB cat /sys/block/mmcblk${MMC_NUM}/device/type`
    if [ "$MMC_TYPE" = "SD" ]; then
        SWAP_PART=`$BB fdisk -l /dev/block/mmcblk${MMC_NUM} | $BB awk '/^\// && $5 == 82 {print $1;exit;}'`;
        break;
    fi;
done

#
# do zram first so it gets first priority since it should be faster
#

# handle zram
zramprop=`getprop persist.service.zram`
[ "$zramprop" = "" ] && zramprop=0
# Hardcode this: I can't think of a scenario where we would want multiple devs
zramblkdev=zram0
# 10% is smallest reasonable size
if [ $zramprop -ge 10 ]; then
    if [ -b /dev/block/${zramblkdev} ]; then
        memtotal=`$BB awk '{ if ($1 eq "MemTotal:") print $2;exit; }' </proc/meminfo`
        # Memtotal is in kB we need to convert that to bytes
        zramsize=$((($(($memtotal * $zramprop)) / 100) * 1024))
        $BB echo $zramsize > /sys/block/${zramblkdev}/disksize
        $BB mkswap /dev/block/${zramblkdev} >/dev/null
        [ $? -ne 0 ] && $logE "Error: mkswap returned $?"
        $BB swapon /dev/block/${zramblkdev} >/dev/null
        [ $? -ne 0 ] && $logE "Error: swapon returned $?"
        $logI "Initialized $(($zramsize / 1024 / 1024))MB of swap (${zramprop}%) on $zramblkdev"
    else
        $logE "Error: $zramblkdev not found"
    fi;
fi;

# enable swap
if [ -n "$SWAP_PART" ]; then
    if [ -b $SWAP_PART ]; then
        $BB swapon $SWAP_PART >/dev/null
        [ $? -ne 0 ] && $logE "Error: swapon returned $?"
        swapsize=`$BB fdisk -l $SWAP_PART | $BB awk '/^Disk/ {print $3;exit;}'`
        $logI "Initialized ${swapsize}MB of swap on $SWAP_PART";
    else
        $logE "Error: $SWAP_PART not found";
    fi;
fi;
