loopback_partscan: add some recovery logic for failed `partx -a`

Some build bots have started failing to add partitions from loopback
devices.  It's unclear why (new kernel maybe), so add some recovery
logic to our partscan logic to dump logs & retry.  This should help
with debugging while not failing builds.

BUG=chromium:999596
TEST=build_image passed

Change-Id: Ic6326738a79cdc26e0864be95c295f1cf6cf7f2a
Reviewed-on: https://chromium-review.googlesource.com/1780891
Tested-by: Mike Frysinger <vapier@chromium.org>
Commit-Ready: Mike Frysinger <vapier@chromium.org>
Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Reviewed-by: Alex Klein <saklein@chromium.org>
diff --git a/common.sh b/common.sh
index bdbad3d..5e36d51 100644
--- a/common.sh
+++ b/common.sh
@@ -671,10 +671,23 @@
   local lb_dev image="$1"
   shift
   lb_dev=$(sudo losetup --show -f "$@" "${image}")
+
   # Ignore problems deleting existing partitions. There shouldn't be any
   # which will upset partx, but that's actually ok.
   sudo partx -d "${lb_dev}" 2>/dev/null || true
-  sudo partx -a "${lb_dev}"
+
+  # First try to add missing partitions.
+  if ! sudo partx -a "${lb_dev}"; then
+    warn "Adding partitions with 'partx -a ${lb_dev}' failed."
+    warn "Dumping full kernel buffer"
+    dmesg >&2 || true
+    sync
+    sleep 1
+
+    # Try a partition update to recover.
+    # https://crbug.com/999596
+    sudo partx -u "${lb_dev}"
+  fi
 
   echo "${lb_dev}"
 }