vold: retry mounting partition

Works around a race condition between the vold and MountService uevent handlers

Change-Id: I71c92f2e9b92e1fefc192da166a91d81bc60e242
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/DirectVolume.cpp b/DirectVolume.cpp
index 7e8ac68..fa3eb9a 100644
--- a/DirectVolume.cpp
+++ b/DirectVolume.cpp
@@ -220,6 +220,10 @@
 #endif
         if (getState() != Volume::State_Formatting) {
             setState(Volume::State_Idle);
+            if (mRetryMount == true) {
+                mRetryMount = false;
+                mountVol();
+            }
         }
     } else {
 #ifdef PARTITION_DEBUG
diff --git a/Volume.cpp b/Volume.cpp
index 685cb35..45db27e 100644
--- a/Volume.cpp
+++ b/Volume.cpp
@@ -116,6 +116,7 @@
     mState = Volume::State_Init;
     mCurrentlyMountedKdev = -1;
     mPartIdx = -1;
+    mRetryMount = false;
 }
 
 Volume::~Volume() {
@@ -174,6 +175,10 @@
         return;
     }
 
+    if ((oldState == Volume::State_Pending) && (state != Volume::State_Idle)) {
+        mRetryMount = false;
+    }
+
     mState = state;
 
     SLOGD("Volume %s state changing %d (%s) -> %d (%s)", mLabel,
@@ -309,6 +314,9 @@
         return -1;
     } else if (getState() != Volume::State_Idle) {
         errno = EBUSY;
+        if (getState() == Volume::State_Pending) {
+            mRetryMount = true;
+        }
         return -1;
     }
 
diff --git a/Volume.h b/Volume.h
index ad3dcd8..f57ff91 100644
--- a/Volume.h
+++ b/Volume.h
@@ -52,6 +52,7 @@
     VolumeManager *mVm;
     bool mDebug;
     int mPartIdx;
+    bool mRetryMount;
 
     /*
      * The major/minor tuple of the currently mounted filesystem.