That's great, but the issue is that usually the block device version
performs better than just creating a file and using it as a raw image
or loop device. Creating a file, then running it through a SCSI target
seems like it's going in the opposite direction.
On Wed, Feb 27, 2013 at 2:57 AM, Alex Elsayed <eternaleye@xxxxxxxxx> wrote:
> 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
--
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