#/**
#         ogr CreateCache int_partsize
#@brief   Define la caché local en la partición 4 del disco 1
#@param   int_partsize   tamaño de la partición (en KB)
#@return  (nada, por determinar)
#@exception OG_ERR_FORMAT     formato incorrecto.
#@exception OG_ERR_OUTOFLIMIT tamaño demasiado pequeño o demasiado grande.
#@note    Requisitos: sfdisk, parted, awk, sed
#@warning El tamaño de caché debe estar entre 50 MB y la mitad del disco.
#@warning La caché no puede solaparse con las particiones de datos.
#@version 0.9.1 - Definición de caché local.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2010/03/09
#@version 0.9.2 - Corrección definición de límites.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2010/06/01
#*/ ##
# Variables locales.
local DISK PART SECTORS CYLS START END SIZE MINSIZE MAXSIZE ENDPART3
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
    ogr Help "$FUNCNAME" "$FUNCNAME int_partsize" "$FUNCNAME 10000000"
    return
fi
# Error si no se recibe 1 parámetro.
[ $# == 1 ] || ogr RaiseError $OG_ERR_FORMAT || return $?

DISK=$(ogr DiskToDev 1) || return $?
PART="4"
SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
END=$[SECTORS/CYLS*CYLS-1]              # Sector final del disco.
SIZE=$(echo $1|awk '{print $0*2}')      # Tamaño en sectores de 512 B.
START=$[END-SIZE+1]
ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}')
# Error si tamaño no está entre límites permitidos o si se solapa con la partición 3.
MINSIZE=100000                          # Error de formateo si tamaño < 50 MB.
MAXSIZE=$[END/2]                        # No permitir tamaño > mitad del disco.
if [ $SIZE -lt $MINSIZE -o $SIZE -gt $MAXSIZE -o $START -le $ENDPART3 ]; then
    ogr RaiseError $OG_ERR_OUTOFLIMIT "$1" || return $?
fi

# Desmontar todos los sistemas de archivos del disco.
ogr UnmountAll 1 2>/dev/null
# Si la tabla de particiones no es valida, volver a generarla.
[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w"
# Definir particiones y notificar al kernel.
sfdisk -f $DISK -uS -N$PART <<<"$START,$SIZE,ca" 2>/dev/null && partprobe
