#!/bin/bash

# chkconfig: 35 05 03

# source function library
. /etc/rc.d/init.d/functions

PATH=/sbin:/usr/sbin:$PATH
RETVAL=0
MODPROBE="/sbin/modprobe"
MODPROBE_D="/etc/modprobe.d"
ORIGINAL_BALLOON="virtio_balloon"
VZBALLOON="vzvirtio_balloon"
BLACKLIST="$MODPROBE_D/vzvirtio-backlist.conf"
BALLOON_SYSDIR="/sys/bus/virtio/drivers"

[ ! -x $MODPROBE ] && exit 1

is_kernel_newer()
{
	local ver=$1
	[ $((uname -r; echo "$ver") | sort -Vr | head -n1) != "$ver" ]
}

drop_blacklist()
{
	[ -f $BLACKLIST ] && rm -f $BLACKLIST >/dev/null 2>&1
}

start() {
	local dev

	echo -n $"Starting vzballoon_blacklist: "
	# New kernel case
	if is_kernel_newer 4.6; then
		drop_blacklist
		return 0
	fi

	# Blacklist original balloon
	[ ! -d $MODPROBE_D ] && mkdir -p $MODPROBE_D >/dev/null 2>&1
	echo "blacklist $ORIGINAL_BALLOON" > $BLACKLIST 2>/dev/null
	$MODPROBE $VZBALLOON >/dev/null 2>&1
	RETVAL=$?
	# Try to rebind
	if [ -d $BALLOON_SYSDIR/$ORIGINAL_BALLOON ]; then
		ls $BALLOON_SYSDIR/$ORIGINAL_BALLOON | grep virtio | while read dev; do
			echo $dev > $BALLOON_SYSDIR/$ORIGINAL_BALLOON/unbind
			echo $dev > $BALLOON_SYSDIR/$VZBALLOON/bind
		done
		$MODPROBE -r $ORIGINAL_BALLOON >/dev/null 2>&1
	fi
	echo
}

stop() {
	echo -n $"Shutting down vzballoon_blacklist: "
	drop_blacklist
	$MODPROBE -r $VZBALLOON >/dev/null 2>&1
	echo
}

case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  restart|reload)
	stop
	start
	;;
  condrestart|try-restart)
	if status vzballoon_blacklist > /dev/null 2>&1; then
		stop
		start
	fi
	;;
  status)
	status vzballoon_blacklist
	RETVAL=$?
	;;
  *)
	echo $"Usage: $0 {start|stop|restart|status}"
	exit 1
esac

exit $RETVAL
