mirror of
https://github.com/ceph/ceph
synced 2024-12-22 11:31:55 +00:00
51237c33d1
Fixes: http://tracker.ceph.com/issues/16608 Signed-off-by: Jason Dillaman <dillaman@redhat.com>
120 lines
2.8 KiB
Bash
Executable File
120 lines
2.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
do_map() {
|
|
|
|
# default to reasonable value if RBDMAPFILE not set in environment
|
|
printenv RBDMAPFILE >/dev/null || local RBDMAPFILE=/etc/ceph/rbdmap
|
|
|
|
if [ ! -f "$RBDMAPFILE" ]; then
|
|
logger -p "daemon.warning" -t rbdmap "No $RBDMAPFILE found."
|
|
exit 0
|
|
fi
|
|
|
|
# Read /etc/rbdtab to create non-existant mapping
|
|
RET=0
|
|
while read DEV PARAMS; do
|
|
case "$DEV" in
|
|
""|\#*)
|
|
continue
|
|
;;
|
|
*/*)
|
|
;;
|
|
*)
|
|
DEV=rbd/$DEV
|
|
;;
|
|
esac
|
|
logger -p "daemon.debug" -t rbdmap "Mapping '${DEV}'"
|
|
newrbd=""
|
|
MAP_RV=""
|
|
OIFS=$IFS
|
|
IFS=','
|
|
CMDPARAMS=""
|
|
for PARAM in ${PARAMS[@]}; do
|
|
CMDPARAMS="$CMDPARAMS --$(echo $PARAM | tr '=' ' ')"
|
|
done
|
|
IFS=$OIFS
|
|
if [ -b /dev/rbd/$DEV ]; then
|
|
MAP_RV="$(readlink -f /dev/rbd/$DEV)"
|
|
else
|
|
MAP_RV="$(rbd map $DEV $CMDPARAMS 2>&1)"
|
|
if [ $? -eq 0 ]; then
|
|
newrbd="yes"
|
|
else
|
|
RET=$((${RET}+$?))
|
|
logger -p "daemon.warning" -t rbdmap "Failed to map '${DEV}"
|
|
continue
|
|
fi
|
|
fi
|
|
logger -p "daemon.debug" -t rbdmap "Mapped '${DEV}' to '${MAP_RV}'"
|
|
|
|
if [ "$newrbd" ]; then
|
|
## Mount new rbd
|
|
MNT_RV=""
|
|
mount --fake /dev/rbd/$DEV >>/dev/null 2>&1 \
|
|
&& MNT_RV=$(mount -vn /dev/rbd/$DEV 2>&1)
|
|
[ -n "${MNT_RV}" ] && logger -p "daemon.debug" -t rbdmap "Mounted '${MAP_RV}' to '${MNT_RV}'"
|
|
|
|
## post-mapping
|
|
if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then
|
|
logger -p "daemon.debug" -t rbdmap "Running post-map hook '/etc/ceph/rbd.d/${DEV}'"
|
|
/etc/ceph/rbd.d/${DEV} map "/dev/rbd/${DEV}"
|
|
fi
|
|
fi
|
|
done < $RBDMAPFILE
|
|
exit ${RET}
|
|
|
|
}
|
|
|
|
do_unmap() {
|
|
RET=0
|
|
## Unmount and unmap all rbd devices
|
|
if ls /dev/rbd[0-9]* >/dev/null 2>&1; then
|
|
for DEV in /dev/rbd[0-9]*; do
|
|
## pre-unmapping
|
|
for L in $(find /dev/rbd -type l); do
|
|
LL="${L##/dev/rbd/}"
|
|
if [ "$(readlink -f $L)" = "${DEV}" ] \
|
|
&& [ -x "/etc/ceph/rbd.d/${LL}" ]; then
|
|
logger -p "daemon.debug" -t rbdmap "Running pre-unmap hook for '${DEV}': '/etc/ceph/rbd.d/${LL}'"
|
|
/etc/ceph/rbd.d/${LL} unmap "$L"
|
|
break
|
|
fi
|
|
done
|
|
|
|
logger -p "daemon.debug" -t rbdmap "Unmapping '${DEV}'"
|
|
MNT=$(findmnt --mtab --source ${DEV} --noheadings | awk '{print $1'})
|
|
if [ -n "${MNT}" ]; then
|
|
logger -p "daemon.debug" -t rbdmap "Unmounting '${MNT}'"
|
|
umount "${MNT}" >>/dev/null 2>&1
|
|
fi
|
|
if mountpoint -q "${MNT}"; then
|
|
## Un-mounting failed.
|
|
logger -p "daemon.warning" -t rbdmap "Failed to unmount '${MNT}'"
|
|
RET=$((${RET}+1))
|
|
continue
|
|
fi
|
|
## Un-mapping.
|
|
rbd unmap $DEV >>/dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
logger -p "daemon.warning" -t rbdmap "Failed to unmap '${MNT}'"
|
|
RET=$((${RET}+$?))
|
|
continue
|
|
fi
|
|
logger -p "daemon.debug" -t rbdmap "Unmapped '${DEV}'"
|
|
done
|
|
fi
|
|
exit ${RET}
|
|
}
|
|
|
|
case "$1" in
|
|
map)
|
|
do_map
|
|
;;
|
|
|
|
unmap)
|
|
do_unmap
|
|
;;
|
|
*)
|
|
echo "Usage: rbdmap map | unmap"
|
|
esac
|