Fix vold wedge when unmounting Android/ am: b6488f3f04 am: 90c928a725
Change-Id: I32bd4141c8f9cd15895988309e5fdb65a748213f
diff --git a/model/EmulatedVolume.cpp b/model/EmulatedVolume.cpp
index 02d5c37..b212c0e 100644
--- a/model/EmulatedVolume.cpp
+++ b/model/EmulatedVolume.cpp
@@ -48,6 +48,7 @@
mRawPath = rawPath;
mLabel = "emulated";
mFuseMounted = false;
+ mAndroidMounted = false;
mUseSdcardFs = IsFilesystemSupported("sdcardfs");
mAppDataIsolationEnabled = base::GetBoolProperty(kVoldAppDataIsolationEnabled, false);
}
@@ -59,6 +60,7 @@
mRawPath = rawPath;
mLabel = fsUuid;
mFuseMounted = false;
+ mAndroidMounted = false;
mUseSdcardFs = IsFilesystemSupported("sdcardfs");
mAppDataIsolationEnabled = base::GetBoolProperty(kVoldAppDataIsolationEnabled, false);
}
@@ -87,6 +89,8 @@
}
status_t EmulatedVolume::mountFuseBindMounts() {
+ CHECK(!mAndroidMounted);
+
std::string androidSource;
std::string label = getLabel();
int userId = getMountUserId();
@@ -109,6 +113,8 @@
if (status != OK) {
return status;
}
+ mAndroidMounted = true;
+
// Installers get the same view as all other apps, with the sole exception that the
// OBB dirs (Android/obb) are writable to them. On sdcardfs devices, this requires
// a special bind mount, since app-private and OBB dirs share the same GID, but we
@@ -129,6 +135,8 @@
}
status_t EmulatedVolume::unmountFuseBindMounts() {
+ CHECK(mAndroidMounted);
+
std::string label = getLabel();
int userId = getMountUserId();
@@ -158,7 +166,6 @@
}
LOG(INFO) << "Unmounted " << androidTarget;
}
-
return OK;
}
@@ -297,7 +304,10 @@
// Ignoring unmount return status because we do want to try to unmount
// the rest cleanly.
- unmountFuseBindMounts();
+ if (mAndroidMounted) {
+ unmountFuseBindMounts();
+ mAndroidMounted = false;
+ }
if (UnmountUserFuse(userId, getInternalPath(), label) != OK) {
PLOG(INFO) << "UnmountUserFuse failed on emulated fuse volume";
return -errno;
diff --git a/model/EmulatedVolume.h b/model/EmulatedVolume.h
index b25fb7c..9bff0ca 100644
--- a/model/EmulatedVolume.h
+++ b/model/EmulatedVolume.h
@@ -63,6 +63,9 @@
/* Whether we mounted FUSE for this volume */
bool mFuseMounted;
+ /* Whether we mounted Android/ for this volume */
+ bool mAndroidMounted;
+
/* Whether to use sdcardfs for this volume */
bool mUseSdcardFs;