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>
gugelfrei
Joseph Lehrer 13 years ago committed by Mike Lockwood
parent 9322b103a3
commit 507d31b86b

@ -220,6 +220,10 @@ void DirectVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt)
#endif #endif
if (getState() != Volume::State_Formatting) { if (getState() != Volume::State_Formatting) {
setState(Volume::State_Idle); setState(Volume::State_Idle);
if (mRetryMount == true) {
mRetryMount = false;
mountVol();
}
} }
} else { } else {
#ifdef PARTITION_DEBUG #ifdef PARTITION_DEBUG

@ -116,6 +116,7 @@ Volume::Volume(VolumeManager *vm, const char *label, const char *mount_point) {
mState = Volume::State_Init; mState = Volume::State_Init;
mCurrentlyMountedKdev = -1; mCurrentlyMountedKdev = -1;
mPartIdx = -1; mPartIdx = -1;
mRetryMount = false;
} }
Volume::~Volume() { Volume::~Volume() {
@ -174,6 +175,10 @@ void Volume::setState(int state) {
return; return;
} }
if ((oldState == Volume::State_Pending) && (state != Volume::State_Idle)) {
mRetryMount = false;
}
mState = state; mState = state;
SLOGD("Volume %s state changing %d (%s) -> %d (%s)", mLabel, SLOGD("Volume %s state changing %d (%s) -> %d (%s)", mLabel,
@ -309,6 +314,9 @@ int Volume::mountVol() {
return -1; return -1;
} else if (getState() != Volume::State_Idle) { } else if (getState() != Volume::State_Idle) {
errno = EBUSY; errno = EBUSY;
if (getState() == Volume::State_Pending) {
mRetryMount = true;
}
return -1; return -1;
} }

@ -52,6 +52,7 @@ protected:
VolumeManager *mVm; VolumeManager *mVm;
bool mDebug; bool mDebug;
int mPartIdx; int mPartIdx;
bool mRetryMount;
/* /*
* The major/minor tuple of the currently mounted filesystem. * The major/minor tuple of the currently mounted filesystem.

Loading…
Cancel
Save