]> git.proxmox.com Git - ceph.git/blame - ceph/src/rbdmap
update sources to 12.2.2
[ceph.git] / ceph / src / rbdmap
CommitLineData
7c673cae
FG
1#!/bin/bash
2
3do_map() {
4 # Read /etc/rbdtab to create non-existant mapping
5 RET=0
6 while read DEV PARAMS; do
7 case "$DEV" in
8 ""|\#*)
9 continue
10 ;;
11 */*)
12 ;;
13 *)
14 DEV=rbd/$DEV
15 ;;
16 esac
17 logger -p "daemon.debug" -t rbdmap "Mapping '${DEV}'"
18 newrbd=""
19 MAP_RV=""
20 OIFS=$IFS
21 IFS=','
22 CMDPARAMS=""
23 for PARAM in ${PARAMS[@]}; do
24 CMDPARAMS="$CMDPARAMS --$(echo $PARAM | tr '=' ' ')"
25 done
26 IFS=$OIFS
27 if [ -b /dev/rbd/$DEV ]; then
28 MAP_RV="$(readlink -f /dev/rbd/$DEV)"
29 else
30 MAP_RV="$(rbd map $DEV $CMDPARAMS 2>&1)"
31 if [ $? -eq 0 ]; then
32 newrbd="yes"
33 else
34 RET=$((${RET}+$?))
35 logger -p "daemon.warning" -t rbdmap "Failed to map '${DEV}"
36 continue
37 fi
38 fi
39 logger -p "daemon.debug" -t rbdmap "Mapped '${DEV}' to '${MAP_RV}'"
40
41 if [ "$newrbd" ]; then
42 ## Mount new rbd
43 MNT_RV=""
44 mount --fake /dev/rbd/$DEV >>/dev/null 2>&1 \
45 && MNT_RV=$(mount -vn /dev/rbd/$DEV 2>&1)
46 [ -n "${MNT_RV}" ] && logger -p "daemon.debug" -t rbdmap "Mounted '${MAP_RV}' to '${MNT_RV}'"
47
48 ## post-mapping
49 if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then
50 logger -p "daemon.debug" -t rbdmap "Running post-map hook '/etc/ceph/rbd.d/${DEV}'"
51 /etc/ceph/rbd.d/${DEV} map "/dev/rbd/${DEV}"
52 fi
53 fi
54 done < $RBDMAPFILE
55 exit ${RET}
56
57}
58
59unmount_unmap() {
60 local rbd_dev=$1
3efd9988 61 local mnts=$(findmnt --mtab --source ${rbd_dev} --noheadings \
7c673cae
FG
62 | awk '{print $1'})
63
64 logger -p "daemon.debug" -t rbdmap "Unmapping '${rbd_dev}'"
3efd9988 65 for mnt in ${mnts}; do
7c673cae
FG
66 logger -p "daemon.debug" -t rbdmap "Unmounting '${mnt}'"
67 umount "${mnt}" >>/dev/null 2>&1
3efd9988
FG
68 if mountpoint -q "${mnt}"; then
69 ## Un-mounting failed.
70 logger -p "daemon.warning" -t rbdmap "Failed to unmount '${mnt}'"
71 return 1
72 fi
73 done
7c673cae
FG
74 ## Un-mapping.
75 rbd unmap $rbd_dev >>/dev/null 2>&1
76 if [ $? -ne 0 ]; then
77 logger -p "daemon.warning" -t rbdmap "Failed to unmap '${mnt}'"
78 return 1
79 fi
80 logger -p "daemon.debug" -t rbdmap "Unmapped '${rbd_dev}'"
81
82 return 0
83}
84
85do_unmap_all() {
86 RET=0
87 ## Unmount and unmap all rbd devices
88 if ls /dev/rbd[0-9]* >/dev/null 2>&1; then
89 for DEV in /dev/rbd[0-9]*; do
90 ## pre-unmapping
91 for L in $(find /dev/rbd -type l); do
92 LL="${L##/dev/rbd/}"
93 if [ "$(readlink -f $L)" = "${DEV}" ] \
94 && [ -x "/etc/ceph/rbd.d/${LL}" ]; then
95 logger -p "daemon.debug" -t rbdmap "Running pre-unmap hook for '${DEV}': '/etc/ceph/rbd.d/${LL}'"
96 /etc/ceph/rbd.d/${LL} unmap "$L"
97 break
98 fi
99 done
100
101 unmount_unmap "$DEV" || RET=$((${RET}+$?))
102
103 done
104 fi
105 exit ${RET}
106}
107
108do_unmap() {
109 RET=0
110 ## skip if nothing is mapped
111 ls /dev/rbd[0-9]* >/dev/null 2>&1 || exit ${RET}
112
113 # Read /etc/rbdtab to create non-existant mapping
114 while read DEV PARAMS; do
115 case "$DEV" in
116 ""|\#*)
117 continue
118 ;;
119 */*)
120 ;;
121 *)
122 DEV=rbd/$DEV
123 ;;
124 esac
125
126 MAP_RV="$(readlink -f /dev/rbd/$DEV)"
127 if [ ! -b $MAP_RV ]; then
128 logger -p "daemon.debug" -t rbdmap "$DEV not mapped, skipping unmap"
129 continue
130 fi
131
132 ## pre-unmapping
133 if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then
134 logger -p "daemon.debug" -t rbdmap "Running pre-unmap hook '/etc/ceph/rbd.d/${DEV}'"
135 /etc/ceph/rbd.d/${DEV} unmap "/dev/rbd/${DEV}"
136 fi
137
138 unmount_unmap "$MAP_RV" || RET=$((${RET}+$?))
139
140 done < $RBDMAPFILE
141 exit ${RET}
142}
143
144# default to reasonable value if RBDMAPFILE not set in environment
145RBDMAPFILE="${RBDMAPFILE:-/etc/ceph/rbdmap}"
146
147if [ ! -f "$RBDMAPFILE" ]; then
148 logger -p "daemon.warning" -t rbdmap "No $RBDMAPFILE found."
149 exit 0
150fi
151
152case "$1" in
153 map)
154 do_map
155 ;;
156
157 unmap)
158 do_unmap
159 ;;
160
161 unmap-all)
162 do_unmap_all
163 ;;
164
165 *)
166 echo "Usage: rbdmap map | unmap | unmap-all"
167esac