#/**
#         ogr CreateCache int_size
#@brief   Define la caché local en eapacio oculto al final del disco 1.
#@param   int_size   tamaño de la caché (en KB)
#@return  (nada, por determinar)
#@exception OG_ERR_FORMAT     formato incorrecto.
#@exception OG_ERR_OUTOFLIMIT tamaño nulo o demasiado grande.
#@note    Requisitos: sfdisk, parted, awk, sed
#@version 0.91 - Definición de caché local.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2010/03/09
#@version 1.0 - Caché local en espacio oculto.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2010/03/24
#*/ ##
# Variables locales.
local DISK SECTORS CYLS START END SIZE ENDDATA
# 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 $?
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]
SIZE=$(echo $1|awk '{print $0*2}')      # En sectores de 512 B.
START=$[END-SIZE+1]
ENDDATA=$(fdisk -lu $DISK | awk 'if ($3>sec) {sec=$3} END {print sec}')
# Error si tamaño 0 o si mayor que la mitad del disco o si pisa la partición 3.
if [ $SIZE -eq 0 -o $SIZE -ge $[END/2] -o $START -le $ENDDATA ]; 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 del disco no es valida, volver a generarla.
[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w"
# Crear dispositivo en la zona de disco reservada para caché.
dmsetup create cache --table "0 $SIZE linear $DISK $START" 2>/dev/null && partprobe
