Merge lp:~smoser/cloud-utils/trunk.lp1630274 into lp:cloud-utils

Proposed by Scott Moser
Status: Merged
Merged at revision: 304
Proposed branch: lp:~smoser/cloud-utils/trunk.lp1630274
Merge into: lp:cloud-utils
Diff against target: 107 lines (+37/-34)
1 file modified
bin/mount-image-callback (+37/-34)
To merge this branch: bzr merge lp:~smoser/cloud-utils/trunk.lp1630274
Reviewer Review Type Date Requested Status
Registry Administrators Pending
Review via email: mp+307586@code.launchpad.net

Commit message

mount-image-callback: try mounting overlay rather than checking first

The logic to determine if mount would work was flawed in it assumed
that both or neither of the following would succeed:
  modprobe --quiet --use-blacklist fstype
  mount -t fstype would succeed

That logic failed when modprobe could not load the module due to
being in a chroot or some other reason. The change here is to just
do try the mount. In order to avoid confusing output about trying
to mount overlayfs we first try mounting overlay. If that fails
and 'overlay' seems present in /proc/filesystems, then do not bother
trying to mount overlayfs.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'bin/mount-image-callback'
--- bin/mount-image-callback 2016-09-27 21:05:03 +0000
+++ bin/mount-image-callback 2016-10-04 15:12:25 +0000
@@ -4,6 +4,8 @@
4TEMP_D=""4TEMP_D=""
5UMOUNTS=( )5UMOUNTS=( )
6QEMU_DISCONNECT=""6QEMU_DISCONNECT=""
7CR=$'\n'
8TAB=$'\t'
79
8error() { echo "$@" 1>&2; }10error() { echo "$@" 1>&2; }
911
@@ -138,23 +140,37 @@
138 fi140 fi
139}141}
140142
141has_fs_support() {143mount_overlay() {
142 local fstype="$1" tab=' '144 local lower="$1" upper="$2" workdir="$3"
143 grep -q "${tab}${fstype}$" /proc/filesystems145 local olayopts="lowerdir=$lower,upperdir=$upper"
144}146 # 3.18+ require 'workdir=' option.
147 case "$(uname -r)" in
148 2*|3.1[01234567]*|3.[0-9].*) :;;
149 *) olayopts="${olayopts},workdir=$workdir"
150 mkdir -p "$workdir" ||
151 { _ERR="Failed to create workdir '$workdir'"; return 1; }
152 ;;
153 esac
145154
146find_overlay_fstype() {155 local cmd="" fstype="" ret="" out="" fsfile="/proc/filesystems"
147 local fstype156 _ERR=""
148 set -- overlay overlayfs157 for fstype in overlay overlayfs; do
149 for fstype in "$@"; do158 cmd=( mount -t "$fstype" -o "$olayopts" "$lower" "$upper" )
150 has_fs_support "$m" && _RET="$fstype" && return 0159 debug 2 "attempting '$fstype' mount with: ${cmd[*]}"
151 done160 out=$("${cmd[@]}" 2>&1)
152 for modname in "$@"; do161 ret=$?
153 if modprobe --quiet --use-blacklist "$modname"; then162 if [ $ret -eq 0 ]; then
154 has_fs_support "$modname" && _RET="$modname" && return 0163 debug 1 "mounted '$fstype' via $fstype: ${cmd[*]}"
155 fi164 return 0
156 done165 fi
157 return 1166 _ERR="${_ERR}Failed [$ret]: ${cmd[*]}:${CR}"
167 _ERR="${_ERR}$out${CR}"
168 if [ -r "$fsfile" ] && grep -q "${TAB}${fstype}$" "$fsfile"; then
169 # this failed and we have support in kernel. do not try further.
170 return $ret
171 fi
172 done
173 return $ret
158}174}
159175
160mount_callback_umount() {176mount_callback_umount() {
@@ -321,7 +337,7 @@
321 fi337 fi
322338
323 local nptnum=""339 local nptnum=""
324 debug 1 "connected $img_in ($fmt) to $nbd. waiting for device."340 debug 1 "connected ${readonly:+${readonly} }$img_in ($fmt) to $nbd. waiting for device."
325 i=0341 i=0
326 while i=$(($i+1)):; do342 while i=$(($i+1)):; do
327 get_partition "$nbd" && nptnum="$_RET" && break343 get_partition "$nbd" && nptnum="$_RET" && break
@@ -377,27 +393,14 @@
377 fi393 fi
378394
379 if $overlay; then395 if $overlay; then
380 find_overlay_fstype || {396 mount_overlay "$img_mp" "$mp" "${TEMP_D}/workdir" || {
381 error "Unable to find a filesystem type for overlay."397 [ -n "${_ERR}" ] && error "${_ERR}"
382 error "You need support for overlayfs or overlay in your kernel."398 error "Unable to mount overlay filesystem. Maybe no kernel support?"
383 return 1399 return 1
384 }400 }
385 overlay_fstype="$_RET"
386
387 local olayopts="lowerdir=$img_mp,upperdir=$mp"
388 workdir="${TEMP_D}/workdir"
389 mkdir "$workdir"
390 # 3.18+ require 'workdir=' option.
391 case "$(uname -r)" in
392 2*|3.1[01234567]*|3.[0-9].*) :;;
393 *) olayopts="${olayopts},workdir=$workdir";;
394 esac
395 mount -t "${overlay_fstype}" -o "$olayopts" "$img_mp" "$mp" || {
396 error "failed mount -t ${overlay_fstype} -o '$olayopts' '$img_mp' '$mp'"
397 return 1;
398 }
399 UMOUNTS[${#UMOUNTS[@]}]="$mp"401 UMOUNTS[${#UMOUNTS[@]}]="$mp"
400 fi402 fi
403
401 local bindmp=""404 local bindmp=""
402 for bindmp in $bmounts; do405 for bindmp in $bmounts; do
403 [ -d "$mp${bindmp}" ] || mkdir "$mp${bindmp}" ||406 [ -d "$mp${bindmp}" ] || mkdir "$mp${bindmp}" ||

Subscribers

People subscribed via source and target branches