summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoseph Lehrer <jlehrer@nvidia.com>2011-04-11 15:02:50 -0700
committerMike Lockwood <lockwood@android.com>2011-07-06 13:29:32 -0400
commit507d31b86b38dffe7c60ca5c54b5e631f5a7cab3 (patch)
tree7a3c295d9585f6114222a815637b2cc16d196fc7
parent9322b103a39ec370c077152faccb60c6b3e94b2c (diff)
downloadsystem_vold-507d31b86b38dffe7c60ca5c54b5e631f5a7cab3.tar.gz
system_vold-507d31b86b38dffe7c60ca5c54b5e631f5a7cab3.tar.bz2
system_vold-507d31b86b38dffe7c60ca5c54b5e631f5a7cab3.zip
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>
-rw-r--r--DirectVolume.cpp4
-rw-r--r--Volume.cpp8
-rw-r--r--Volume.h1
3 files changed, 13 insertions, 0 deletions
diff --git a/DirectVolume.cpp b/DirectVolume.cpp
index 7e8ac68..fa3eb9a 100644
--- a/DirectVolume.cpp
+++ b/DirectVolume.cpp
@@ -220,6 +220,10 @@ void DirectVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt)
#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 @@ Volume::Volume(VolumeManager *vm, const char *label, const char *mount_point) {
mState = Volume::State_Init;
mCurrentlyMountedKdev = -1;
mPartIdx = -1;
+ mRetryMount = false;
}
Volume::~Volume() {
@@ -174,6 +175,10 @@ void Volume::setState(int state) {
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 @@ int Volume::mountVol() {
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 @@ protected:
VolumeManager *mVm;
bool mDebug;
int mPartIdx;
+ bool mRetryMount;
/*
* The major/minor tuple of the currently mounted filesystem.