cros_generate_update_payload: Add retries to umount operations.

Add retries around umount operations that have been failing
under heavy load. Add additional logging of system stats
before each retry.

BUG=chromium:353558
TEST=cros flash to local dev box.

Change-Id: Id23cd5cc50ff0d216122e42e0356f1d1b61e1c8b
Reviewed-on: https://chromium-review.googlesource.com/191365
Reviewed-by: David James <davidjames@chromium.org>
Commit-Queue: Don Garrett <dgarrett@chromium.org>
Tested-by: Don Garrett <dgarrett@chromium.org>
diff --git a/host/cros_generate_update_payload b/host/cros_generate_update_payload
index 06d022c..df04253 100755
--- a/host/cros_generate_update_payload
+++ b/host/cros_generate_update_payload
@@ -46,27 +46,52 @@
 DST_ROOT=""
 STATE_MNT=""
 
+umount_with_retry() {
+  local mnt_point="$1"
+  local ret=0
+
+  if [ ! -d "$mnt_point" ]; then
+    return
+  fi
+
+  for x in {1..10}; do
+    sudo umount -v "$mnt_point"
+    echo "umount ${mnt_point} exited with: $?"
+    rmdir "$mnt_point"
+    ret=$?
+    if [ ${ret} -eq 0 ]; then
+      break
+    fi
+
+    echo "fndmnt:"
+    sudo findmnt
+    echo
+
+    echo "lsof +D:"
+    sudo lsof +D "$mnt_point"
+    echo
+
+    echo "fuser -vm:"
+    sudo fuser -vm "$mnt_point"
+    echo
+
+    sleep 60
+    echo "Retrying umount ${mnt_point}"
+  done
+
+  echo "sudo umount -v ${mnt_point}: ${result}"
+
+}
+
 # Pass an arg to not exit 1 at the end
 cleanup() {
   set +e
-  if [ -n "$SRC_MNT" ]; then
-    sudo umount -v "$SRC_MNT"
-    echo "sudo umount -v ${SRC_MNT}: $?"
-    [ -d "$SRC_MNT" ] && rmdir "$SRC_MNT"
-    SRC_MNT=""
-  fi
-  if [ -n "$DST_MNT" ]; then
-    sudo umount -v "$DST_MNT"
-    echo "sudo umount -v ${DST_MNT}: $?"
-    [ -d "$DST_MNT" ] && rmdir "$DST_MNT"
-    DST_MNT=""
-  fi
-  if [ -n "$STATE_MNT" ]; then
-    sudo umount -v "$STATE_MNT"
-    echo "sudo umount -v ${STATE_MNT}: $?"
-    [ -d "$STATE_MNT" ] && rmdir "$STATE_MNT"
-    STATE_MNT=""
-  fi
+  umount_with_retry "$SRC_MNT"
+  SRC_MNT=""
+  umount_with_retry "$DST_MNT"
+  DST_MNT=""
+  umount_with_retry "$STATE_MNT"
+  STATE_MNT=""
   if [ -z "$FLAGS_src_kern_path" ]; then
     rm -f "$SRC_KERNEL"
   fi