diff --git a/trim b/trim new file mode 100755 index 0000000..f289edb --- /dev/null +++ b/trim @@ -0,0 +1,62 @@ +#!/bin/bash + +IQN=$1 + +if [[ -z "${IQN}" ]]; then + echo "usage: $0 TargetIQN" + echo "" + + exit +fi + +MULTIPATH=0 +IQNTESTLIST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname) +for IQNTEST in ${IQNTESTLIST}; do + if [ "${IQNTEST}" != "${IQN}" ]; then + echo "IQN not found" + echo "" + + exit + fi + + MULTIPATH=$((MULTIPATH + 1)) +done + +SESSIONFOLDERLIST=$(grep -l ${IQN} /sys/class/iscsi_session/*/targetname | xargs realpath) + +declare -A ADDRESSES +declare -A BLOCKDEVICES +for SESSIONFOLDER in ${SESSIONFOLDERLIST}; do + SESSION=$(echo "${SESSIONFOLDER}" | sed 's/.*session\([0-9]*\).*/\1/g') + HOST=$(echo "${SESSIONFOLDER}" | sed 's/.*host\([0-9]*\).*/\1/g') + + SCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed 's/\(.*\)\/iscsi_session.*/\1/g' | xargs ls -1 | grep "target${HOST}" | sed 's/target//g') + MAJOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 2) + MINOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 3) + + FULLSCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}/g" | xargs ls -1 | grep ":") + LUN=$(echo "${FULLSCSIADDRESS}" | cut -d ":" -f 4) + + ADDRESS="[${SESSION}]:scsi$HOST:${MAJOR}:${MINOR}:${LUN}" + ADDRESSES+="${ADDRESS} " + + BLOCKDEVICE=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}\/${FULLSCSIADDRESS}\/block/g" | xargs ls -1 | xargs printf "/dev/%s") + BLOCKDEVICES+="${BLOCKDEVICE} " +done + +MULTIPATHDEVICE=$(multipath -l ${BLOCKDEVICES[0]} | grep 'mpath' | sed -e 's/^\([a-z]*\) .*/\1/g') +if [ ! -z "${MULTIPATHDEVICE}" ]; then + BLOCKDEVICE="/dev/mapper/${MULTIPATHDEVICE}" +fi + +MOUNTPOINT=$(grep "${BLOCKDEVICE}" /proc/mounts | head -n 1 | cut -d " " -f 2) + +if [[ -z "${MOUNTPOINT}" || ! -d "${MOUNTPOINT}" ]]; then + echo "IQN ${IQN} is not mounted" + echo "" + + exit +fi + +fstrim -v ${MOUNTPOINT} +