Alex Elsayed wrote:
> Roman Mamedov wrote:
>
>> On Wed, 27 Feb 2013 13:23:23 +1100
>> "Fajar A. Nugraha" <list@xxxxxxxxx> wrote:
<snip>
> This could be pretty easily put into a shell script that uses du -b and
> manually pokes configfs instead of calling tcm_node, and it'd be able to
> run without any nonstandard userspace dependencies.
Just for fun, I decided to put my money where my mouth is and implement
a quick scsi-target-losetup that actually worked, both for creation and
deletion. Here it is:
---cut---
#!/bin/bash
gen_naa() {
local UUID="$( uuidgen -r )"
UUID="${UUID//-/}"
UUID="${UUID:0:9}"
echo "naa.6001405${UUID}"
}
setup() {
local FILE
local INPUT_NAME
local NAME
local BACKEND_IDX
local TRANSPORT_IDX
declare -a NAA
FILE="${1}"
INPUT_NAME="${2}"
NAME="${INPUT_NAME//\//_}"
BACKEND_IDX='-1'
TRANSPORT_IDX='-1'
if [[ $UID -ne 0 ]]; then
echo "You must be root in order to set up a lioloop device" >&2
exit 1
fi
if [[ "${NAME}" != "${INPUT_NAME}" ]]; then
echo "The chosen name '${INPUT_NAME}' contained slashes, using '${NAME}' instead" >&2
fi
declare SIZE="$(du -b "${FILE}")"
SIZE="${SIZE/[^0123456789]*}"
# Load the scsi target core and backends
modprobe target_core_mod >/dev/null 2>&1
while BACKEND_IDX=$((BACKEND_IDX + 1)); do
if [[ -d "/sys/kernel/config/target/core/fileio_${BACKEND_IDX}/${NAME}" ]]; then
echo "A backstore with the name '${NAME}' already exists" >&2
exit 1
elif ! [[ -d /sys/kernel/config/target/core/fileio_${BACKEND_IDX} ]]; then
# mkdir -p "/sys/kernel/config/target/core/fileio_${BACKEND_IDX}/${NAME}"
# Tell it where the file is and how big it is
tcm_node --establishdev "fileio_${BACKEND_IDX}/${NAME}" \
"fd_dev_name=${FILE},fd_dev_size=${SIZE}"
# Give it a unique serial
tcm_node --setunitserialwithmd "fileio_${BACKEND_IDX}/${NAME}" "$(uuidgen -r)"
break
fi
done
# Load the local scsi frontend transport
modprobe tcm_loop >/dev/null 2>&1
mkdir -p /sys/kernel/config/target/loopback
NAA=( "$(gen_naa)" "$(gen_naa)" )
# Some setup so you have a place to put LUNs
mkdir -p "/sys/kernel/config/target/loopback/${NAA[0]}/tpgt_1"
echo "${NAA[1]}" > "/sys/kernel/config/target/loopback/${NAA[0]}/tpgt_1/nexus"
# Create a fresh LUN...
while TRANSPORT_IDX=$((TRANSPORT_IDX + 1)); do
if ! [[ -d "/sys/kernel/config/target/loopback/${NAA[0]}/tpgt_1/lun/lun_${TRANSPORT_IDX}" ]]; then
mkdir -p "/sys/kernel/config/target/loopback/${NAA[0]}/tpgt_1/lun/lun_${TRANSPORT_IDX}"
# ...and map the file to it.
ln -s "/sys/kernel/config/target/core/fileio_${BACKEND_IDX}/${NAME}" \
"/sys/kernel/config/target/loopback/${NAA[0]}/tpgt_1/lun/lun_${TRANSPORT_IDX}"
break
fi
done
}
teardown() {
local INPUT_NAME="${1}"
local NAME="${INPUT_NAME//\//_}"
if [[ $UID -ne 0 ]]; then
echo "You must be root in order to tear down a lioloop device" >&2
exit 1
fi
if [[ "${NAME}" != "${INPUT_NAME}" ]]; then
echo "The chosen name '${INPUT_NAME}' contained slashes, using '${NAME}' instead" >&2
fi
local FOUND=''
for LUN in /sys/kernel/config/target/loopback/*/tpgt_1/lun/lun_*; do
if [[ -L "${LUN}/${NAME}" ]]; then
rm -f "${LUN}/${NAME}"
FOUND=1
fi
done
if [[ -z "${FOUND}" ]]; then
echo "No lioloop with the name '${NAME}' was found" >&2
return
fi
for BACKSTORE in /sys/kernel/config/target/core/fileio_*; do
if [[ -d "${BACKSTORE}/${NAME}" ]]; then
rmdir "${BACKSTORE}/${NAME}"
fi
done
}
if [[ "$1" == '-d' ]]; then
shift;
for name in "$@"; do
teardown "${name}"
done
else
setup "$@"
fi
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html