1#!/bin/bash -e
2#
3# dummy Xen block device hotplug script
4#
5# Author George Dunlap <george.dunlap@eu.citrix.com>
6#
7# Based on block-iscsi by Roger Pau Monné <roger.pau@citrix.com>
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU Lesser General Public License as published
11# by the Free Software Foundation; version 2.1 only. with the special
12# exception on linking described in file LICENSE.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU Lesser General Public License for more details.
18#
19# Usage:
20#
21# Target should be specified using the following syntax:
22#
23# script=block-dummy,vdev=xvda,target=dummy:<file>
24
25dir=$(dirname "$0")
26. "$dir/block-common.sh"
27
28check_tools()
29{
30    if ! command -v losetup > /dev/null 2>&1; then
31        fatal "Unable to find losetup"
32    fi
33}
34
35# Sets the following global variables based on the params field passed in as
36# a parameter: type file
37parse_target()
38{
39    params=($(echo "$1" | tr ":" "\n"))
40
41    type=${params[0]}
42    file=${params[1]}
43    if [ -z "$type" ] || [ -z "$file" ]; then
44        fatal "Cannot parse required parameters"
45    fi
46
47    if [ "$type" != "dummy" ] ; then
48	fatal "Invalid type: $type"
49    fi
50}
51
52# Attaches the device and writes xenstore backend entries to connect
53# the device
54add()
55{
56    test -f "$file" || fatal "$file does not exist."
57
58    loopdev=$(losetup -f 2>/dev/null || find_free_loopback_dev)
59    if [ "$loopdev" = '' ]
60    then
61        fatal 'Failed to find an unused loop device'
62    fi
63
64    if LANG=C losetup -h 2>&1 | grep read-only >/dev/null
65    then
66        roflag="-$mode"; roflag="${roflag#-w}"; roflag="${roflag#-!}"
67    else
68        roflag=''
69    fi
70
71    do_or_die losetup $roflag "$loopdev" "$file"
72    # FIXME Is this OK?
73    xenstore_write "$XENBUS_PATH/node" "$loopdev"
74    write_dev "$loopdev"
75}
76
77# Disconnects the device
78remove()
79{
80    node=$(xenstore_read "$XENBUS_PATH/node")
81    losetup -d "$node"
82}
83
84command=$1
85target=$(xenstore-read $XENBUS_PATH/params || true)
86if [ -z "$target" ]; then
87    fatal "No information about the target"
88fi
89
90parse_target "$target"
91
92mode=$(xenstore_read "$XENBUS_PATH/mode")
93mode=$(canonicalise_mode "$mode")
94
95check_tools || exit 1
96
97case $command in
98add)
99    add
100    ;;
101remove)
102    remove
103    ;;
104*)
105    exit 1
106    ;;
107esac
108