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 <eternal...@gmail.com> wrote: > Alex Elsayed wrote: > >> Roman Mamedov wrote: >> >>> On Wed, 27 Feb 2013 13:23:23 +1100 >>> "Fajar A. Nugraha" <l...@fajar.net> 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 majord...@vger.kernel.org > 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 majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html