#!/bin/bash

NAME=${DEVNAME#/dev/}
DESC="${ID_MODEL} (${ID_FS_LABEL})"
SIZE=$[ $(cat /sys/$DEVPATH/size) * 512 ]
MODE=w
XS_KEY="qubes-block-devices/$NAME"

xs_remove() {
    if [ "$QUBES_EXPOSED" == "1" ]; then
        xenstore-rm "$XS_KEY"
    fi
    echo QUBES_EXPOSED=0
}

# Ignore mounted...
if fgrep -q $DEVNAME /proc/mounts; then
    xs_remove
    exit 0
fi
# ... and used by device-mapper
if [ -n "`ls -A /sys/$DEVPATH/holders 2> /dev/null`" ]; then
    xs_remove
    exit 0
fi
# ... and "empty" loop devices
if [ "$MAJOR" -eq 7 -a ! -d /sys/$DEVPATH/loop ]; then
    xs_remove
    exit 0
fi

# Special case for CD
if [ "$ID_TYPE" = "cd" ]; then
    if [ "$ID_CDROM_MEDIA" != "1" ]; then
        # Hide empty cdrom drive
        xs_remove
        exit 0
    fi
    MODE=r
fi

# Special description for loop devices
if [ -d /sys/$DEVPATH/loop ]; then
    DESC=$(cat /sys/$DEVPATH/loop/backing_file)
fi

# Get lock only in dom0 - there are so many block devices so it causes xenstore
# deadlocks sometimes.
if [ -f /etc/qubes-release ]; then
    # Skip xenstore-write if cannot obtain lock. This can mean very early system startup
    # stage without /run mounted (or populated). Devices will be rediscovered later
    # by qubes-core startup script.
    exec 9>>/var/run/qubes/block-xenstore.lock || exit 0
    flock 9
fi

xenstore-write "$XS_KEY/desc" "$DESC" "$XS_KEY/size" "$SIZE" "$XS_KEY/mode" "$MODE"
echo QUBES_EXPOSED=1

# Make sure that block backend is loaded
/sbin/modprobe xen-blkback 2> /dev/null || /sbin/modprobe blkbk